above log.debug(msg)
to assume store long log asci in files txt under/outside files xml
- see: /usr/lib/python2.7/logging/*.py &
+ see: /usr/lib64/python2.7/logging/*.py
"""
_TRACE = LOGI.INFO - 2 # just below
rec = stream_handler.buffer[-1]
self.assertEqual(rec.levelname, "DEBUG")
self.assertEqual(rec.msg, "!!! test debug")
-
-
- """
- def test_015(self):
- t = DATT.DateTime("now")
- self.assertTrue(t.isOk())
- rrt = str(t)
- DBG.write("test_015 str", rrt)
- self.assertIn("20", rrt) # 2018 to 2099 ok
- self.assertIn("-", rrt)
- self.assertIn(":", rrt)
- rrt = repr(t)
- DBG.write("test_015 repr", rrt)
- self.assertIn("DateTime", rrt)
- self.assertIn("20", rrt) # 2018 to 2099 ok
- self.assertIn("-", rrt)
- self.assertIn(":", rrt)
-
-
- def test_020(self):
- t1 = DATT.DateTime("now")
- t2 = DATT.DateTime(t1)
- self.assertTrue(t2.isOk())
- self.assertEqual(t1, t2)
- t2 = DATT.DateTime("now")
- self.assertNotEqual(t1, t2) # microseconds differs
-
- DATT.sleep(3) # 3 second more
- t2 = DATT.DateTime("now")
- self.assertGreater(2, 1) # to be sure
- self.assertGreater(str(t2), str(t1)) # seconds differs
- self.assertGreater(repr(t2), repr(t1)) # seconds differs
- self.assertGreater(t2, t1)
- self.assertTrue(t2 > t1)
- self.assertFalse(t2 == t1)
- self.assertFalse(t2 < t1)
- self.assertFalse(t2 <= t1)
-
- def test_040(self):
- t1 = DATT.DateTime("now")
- delta = DATT.DeltaTime(t1)
- self.assertFalse(delta.isOk())
- self.assertIn("Undefined", delta.toSeconds())
- DBG.write("test_040 str", str(delta))
- DBG.write("test_040 repr", repr(delta))
- with self.assertRaises(Exception):
- delta.raiseIfKo()
- DATT.DateTime().raiseIfKo()
-
- def test_042(self):
- t1 = DATT.DateTime("now")
- DATT.sleep(3.1) # 3.1 second more
- t2 = DATT.DateTime("now")
- self.assertTrue(t2 > t1)
- delta = DATT.DeltaTime(t1, t2)
- self.assertGreater(delta.toSeconds(), 3)
- self.assertEqual(int(delta.toSeconds()), 3)
- DBG.write("test_042 str", str(delta))
- DBG.write("test_042 repr", repr(delta))
- delta2 = delta.raiseIfKo()
- self.assertEqual(delta2.toSeconds(), delta.toSeconds())
-
- def test_044(self):
- for more in [0, 0.56789, 5.6789, 56.789, 61, 3661, 36061]:
- t1 = DATT.DateTime("now")
- t2 = DATT.DateTime(t1)
- t2.addSeconds(more)
- delta = DATT.DeltaTime(t1, t2)
- r = delta.toStrHuman()
- DBG.write("test_044 str", r)
- if more < 60:
- self.assertIn("s", r)
- self.assertNotIn("m", r)
- self.assertNotIn("h", r)
- continue
- if more < 3600:
- self.assertIn("s", r)
- self.assertIn("m", r)
- self.assertNotIn("h", r)
- else:
- self.assertIn("s", r)
- self.assertIn("m", r)
- self.assertIn("h", r)"""
+++ /dev/null
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-
-# Copyright (C) 2010-2018 CEA/DEN
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-import os
-import sys
-import unittest
-
-import initializeTest # set PATH etc for test
-
-import src.debug as DBG # Easy print stderr (for DEBUG only)
-import src.pyconf as PYF # 0.3.7
-import config_0_3_9.config as PYF9 # TODO 0.3.9
-
-_EXAMPLES = {
-1 : """\
- messages:
- [
- {
- stream : "sys.stderr" # modified
- message: 'Welcome'
- name: 'Harry'
- }
- {
- stream : "sys.stdout" # modified
- message: 'Welkom'
- name: 'Ruud'
- }
- {
- stream : $messages[0].stream
- message: 'Bienvenue'
- name: "Yves"
- }
- ]
-""",
-
-2 : """\
- aa: 111
- bb: $aa + 222
-""",
-
-3 : """\
- aa: Yves
- bb: "Herve" # avoid Hervé -> 'utf8' codec can't decode byte
-""",
-
-4 : """\
- aa: Yves
- bb: "Hervé" # avoid Hervé -> 'utf8' codec can't decode byte
-""",
-
-5 : """\
- aa: Yves
- bb: "Herve"
- cc: [
- cc1
- cc2
- cc3
- $bb + " hello"
- ]
- dd: {
- d1 : dd11
- d2 : dd22
- d3 : dd33
- d4 : $bb + " bye"
- }
-""",
-
-# error circular
-6 : """\
- aa: Yves
- bb: $cc
- cc: $bb
-""",
-
-7 : """\
- aa: Yves
- bb: $cc
- cc: [
- cc1
- $bb
- ]
-""",
-
-8 : """\
- aa: Yves
- bb: $cc
- cc: {
- cc1: cc11
- cc2: $bb
- }
-""",
-
-}
-
-
-class TestCase(unittest.TestCase):
- "Test the pyconf.py"""
-
- def test_000(self):
- # one shot setUp() for this TestCase
- # DBG.push_debug(True)
- # SAT.setNotLocale() # test english
- return
-
- def test_010(self):
- # pyconf.py doc example 0.3.7
- # https://www.red-dove.com/config-doc/ is 0.3.9 !
- # which, when run, would yield the console output:
-
- expected = """\
-Welcome, Harry
-Welkom, Ruud
-Bienvenue, Yves
-"""
- inStream = DBG.InStream(_EXAMPLES[1])
- cfg = PYF.Config(inStream)
- res = ''
- for m in cfg.messages:
- res += '%s, %s\n' % (m.message, m.name)
- self.assertEqual(res, expected)
- outStream = DBG.OutStream()
- cfg.__save__(outStream) # sat renamed save() in __save__()
- res = outStream.value
- DBG.write("test_010 cfg", res)
- self.assertTrue("name : 'Harry'" in res)
- self.assertTrue("name : 'Ruud'" in res)
- self.assertTrue("name : 'Yves'" in res)
-
- def test_020(self):
- cfg = PYF.Config()
- self.assertEqual(str(cfg), '{}')
- self.assertEqual(cfg.__repr__(), '{}')
- cfg.aa = "1111"
- self.assertEqual(str(cfg), "{'aa': '1111'}")
- cfg.bb = 2222
- self.assertTrue("'bb': 2222" in str(cfg))
- self.assertTrue("'aa': '1111'" in str(cfg))
- cfg.cc = 3333.
- self.assertTrue("'cc': 3333." in str(cfg))
-
- def test_030(self):
- inStream = DBG.InStream(_EXAMPLES[2])
- cfg = PYF.Config(inStream)
- self.assertEqual(str(cfg), "{'aa': 111, 'bb': $aa + 222}")
- self.assertEqual(cfg.aa, 111)
- self.assertEqual(cfg.bb, 333)
-
- def test_040(self):
- inStream = DBG.InStream(_EXAMPLES[3])
- cfg = PYF.Config(inStream)
- self.assertEqual(cfg.aa, "Yves")
- self.assertEqual(cfg.bb, "Herve")
- self.assertEqual(type(cfg.bb), str)
- cfg.bb = "Hervé" # try this
- self.assertEqual(type(cfg.bb), str)
- self.assertEqual(cfg.bb, "Hervé")
-
- def test_045(self):
- # make Hervé valid with pyconf.py as 0.3.9
- inStream = DBG.InStream(_EXAMPLES[4])
- outStream = DBG.OutStream()
- cfg = PYF9.Config(inStream)
- cfg.save(outStream) # OK
- # TODO: cfg = PYF.Config(inStream)
- # cfg.__save__(outStream) # KO and sat renamed save() in __save__()
- res = outStream.value
- DBG.write("test_045 cfg", res)
- self.assertTrue("aa : 'Yves'" in res)
- self.assertTrue(r"bb : 'Herv\xc3\xa9'" in res)
- self.assertEqual(cfg.bb, "Hervé")
-
- def test_100(self):
- inStream = DBG.InStream(_EXAMPLES[5])
- outStream = DBG.OutStream()
- cfg = PYF.Config(inStream) # KO
- cfg.__save__(outStream) # sat renamed save() in __save__()
- res = outStream.value
- DBG.write("test_100 cfg save", res)
- DBG.write("test_100 cfg debug", cfg)
- DBG.write("test_100 cfg.cc debug", cfg.cc)
-
- cc = cfg.cc
- # DBG.write("test_100 type cc[3]", dir(cc), True)
- DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
-
- def test_100(self):
- inStream = DBG.InStream(_EXAMPLES[5])
- outStream = DBG.OutStream()
- cfg = PYF.Config(inStream) # KO
- cfg.__save__(outStream) # sat renamed save() in __save__()
- res = outStream.value
- DBG.write("test_100 cfg save", res)
- DBG.write("test_100 cfg debug", cfg)
- DBG.write("test_100 cfg.cc debug", cfg.cc)
-
- cc = cfg.cc
- # DBG.write("test_100 type cc[3]", dir(cc), True)
- DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
-
- def test_110(self):
- inStream = DBG.InStream(_EXAMPLES[6])
- outStream = DBG.OutStream()
- cfg = PYF.Config(inStream)
- cfg.__save__(outStream)
-
- res = outStream.value
- DBG.write("test_110 cfg save", res)
- self.assertNotIn("ERROR", res)
-
- res = DBG.getStrConfigDbg(cfg)
- DBG.write("test_110 cfg debug", res)
- self.assertIn("ERROR", res)
- self.assertIn("unable to evaluate $cc", res)
- self.assertIn("unable to evaluate $bb", res)
-
- def test_120(self):
- for ii in [7, 8]:
- inStream = DBG.InStream(_EXAMPLES[ii])
- outStream = DBG.OutStream()
- cfg = PYF.Config(inStream)
- cfg.__save__(outStream)
-
- res = outStream.value
- DBG.write("test_120 cfg save", res, True)
- self.assertNotIn("ERROR", res)
-
- res = DBG.getStrConfigDbg(cfg)
- DBG.write("test_120 cfg debug", res, True)
- # no error circular !!!
- # self.assertIn("ERROR", res) # no error circular !!!
- # self.assertIn("unable to evaluate $cc", res)
- # self.assertIn("unable to evaluate $bb", res)
- res = cfg.bb
- DBG.write("test_120 cfg.bb debug", res, True)
-
- res = cfg.cc
- DBG.write("test_120 cfg.cc debug", res, True)
-
- def test_999(self):
- # one shot tearDown() for this TestCase
- # SAT.setLocale() # end test english
- # DBG.pop_debug()
- return
-
-if __name__ == '__main__':
- unittest.main(exit=False)
- pass
+++ /dev/null
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-
-# Copyright 2004-2010 by Vinay Sajip. All Rights Reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted,
-# provided that the above copyright notice appear in all copies and that
-# both that copyright notice and this permission notice appear in
-# supporting documentation, and that the name of Vinay Sajip
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission.
-# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
-# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""
-Test harness for the configuration module 'config' for Python.
-
-from test_config 0.3.9 modified to test 0.3.7.1
-this test obviously have FAILED (errors=6),
-TODO, fix upgrading 0.3.9, or not.
-"""
-
-import unittest
-# import test_support
-
-import initializeTest # set PATH etc for test
-
-import src.pyconf as config
-from src.pyconf import Config, ConfigMerger, ConfigList
-from src.pyconf import ConfigError, ConfigFormatError, ConfigResolutionError
-import logging
-from StringIO import StringIO
-
-STREAMS = {
- "simple_1" :
-"""
-message: 'Hello, world!'
-""",
- "malformed_1" :
-"""
-123
-""",
- "malformed_2" :
-"""
-[ 123, 'abc' ]
-""",
- "malformed_3" :
-"""
-{ a : 7, b : 1.3, c : 'test' }
-""",
- "malformed_4" :
-"""
-test: $a [7] # note space before bracket
-""",
- "malformed_5" :
-"""
-test: 'abc'
-test: 'def'
-""",
- "wellformed_1" :
-"""
-test: $a[7] # note no space before bracket
-""",
- "boolean_1":
-"""
-test : False
-another_test: True
-""",
- "boolean_2":
-"""
-test : false
-another_test: true
-""",
- "none_1":
-"""
-test : None
-""",
- "none_2":
-"""
-test : none
-""",
- "number_1":
-"""
-root: 1
-stream: 1.7
-neg: -1
-negfloat: -2.0
-posexponent: 2.0999999e-08
-negexponent: -2.0999999e-08
-exponent: 2.0999999e08
-""",
- "sequence_1":
-"""
-mixed: [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ]
-simple: [1, 2]
-nested: [1, [2, 3], [4, [5, 6]]]
-""",
- "include_1":
-"""
-included: @'include_2'
-""",
- "include_2":
-"""
-test: 123
-another_test: 'abc'
-""",
- "expr_1":
-"""
-value1 : 10
-value2 : 5
-value3 : 'abc'
-value4 : 'ghi'
-value5 : 0
-value6 : { 'a' : $value1, 'b': $value2 }
-derived1 : $value1 + $value2
-derived2 : $value1 - $value2
-derived3 : $value1 * $value2
-derived4 : $value1 / $value2
-derived5 : $value1 % $value2
-derived6 : $value3 + $value4
-derived7 : $value3 + 'def' + $value4
-derived8 : $value3 - $value4 # meaningless
-derived9 : $value1 / $value5 # div by zero
-derived10 : $value1 % $value5 # div by zero
-derived11 : $value17 # doesn't exist
-derived12 : $value6.a + $value6.b
-""",
- "eval_1":
-"""
-stderr : `sys.stderr`
-stdout : `sys.stdout`
-stdin : `sys.stdin`
-debug : `debug`
-DEBUG : `DEBUG`
-derived: $DEBUG * 10
-""",
- "merge_1":
-"""
-value1: True
-value3: [1, 2, 3]
-value5: [ 7 ]
-value6: { 'a' : 1, 'c' : 3 }
-""",
- "merge_2":
-"""
-value2: False
-value4: [4, 5, 6]
-value5: ['abc']
-value6: { 'b' : 2, 'd' : 4 }
-""",
- "merge_3":
-"""
-value1: True
-value2: 3
-value3: [1, 3, 5]
-value4: [1, 3, 5]
-""",
- "merge_4":
-"""
-value1: False
-value2: 4
-value3: [2, 4, 6]
-value4: [2, 4, 6]
-""",
- "list_1":
-"""
-verbosity : 1
-""",
- "list_2":
-"""
-verbosity : 2
-program_value: 4
-""",
- "list_3":
-"""
-verbosity : 3
-suite_value: 5
-""",
- "get_1":
-"""
-value1 : 123
-value2 : 'abcd'
-value3 : True
-value4 : None
-value5:
-{
- value1 : 123
- value2 : 'abcd'
- value3 : True
- value4 : None
-}
-""",
- "multiline_1":
-"""
-value1: '''Value One
-Value Two
-'''
-value2: \"\"\"Value Three
-Value Four\"\"\"
-"""
-}
-
-def makeStream(name):
- s = StringIO(STREAMS[name])
- s.name = name
- return s
-
-class OutStream(StringIO):
- def close(self):
- self.value = self.getvalue()
- StringIO.close(self)
-
-class TestConfig(unittest.TestCase):
-
- def setUp(self):
- self.cfg = Config(None)
-
- def tearDown(self):
- del self.cfg
-
- def test_010(self): # Creation(self):
- self.assertEqual(0, len(self.cfg)) # should be empty
-
- def test_020(self): # Simple(self):
- self.cfg.load(makeStream("simple_1"))
- self.failUnless('message' in self.cfg)
- self.failIf('root' in self.cfg)
- self.failIf('stream' in self.cfg)
- self.failIf('load' in self.cfg)
- self.failIf('__save__' in self.cfg)
-
- def test_030(self): # ValueOnly(self):
- self.assertRaises(ConfigError, self.cfg.load,
- makeStream("malformed_1"))
- self.assertRaises(ConfigError, self.cfg.load,
- makeStream("malformed_2"))
- self.assertRaises(ConfigError, self.cfg.load,
- makeStream("malformed_3"))
-
- def test_040(self): # BadBracket(self):
- self.assertRaises(ConfigError, self.cfg.load,
- makeStream("malformed_4"))
-
- def test_050(self): # Duplicate(self):
- self.assertRaises(ConfigError, self.cfg.load,
- makeStream("malformed_5"))
-
- def test_060(self): # GoodBracket(self):
- self.cfg.load(makeStream("wellformed_1"))
-
- def test_070(self): # Boolean(self):
- self.cfg.load(makeStream("boolean_1"))
- self.assertEqual(True, self.cfg.another_test)
- self.assertEqual(False, self.cfg.test)
-
- def test_080(self): # NotBoolean(self):
- self.cfg.load(makeStream("boolean_2"))
- self.assertEqual('true', self.cfg.another_test)
- self.assertEqual('false', self.cfg.test)
-
- def test_090(self): # None(self):
- self.cfg.load(makeStream("none_1"))
- self.assertEqual(None, self.cfg.test)
-
- def test_100(self): # NotNone(self):
- self.cfg.load(makeStream("none_2"))
- self.assertEqual('none', self.cfg.test)
-
- def test_110(self): # Number(self):
- self.cfg.load(makeStream("number_1"))
- self.assertEqual(1, self.cfg.root)
- self.assertEqual(1.7, self.cfg.stream)
- self.assertEqual(-1, self.cfg.neg)
- self.assertEqual(-2.0, self.cfg.negfloat)
- self.assertAlmostEqual(-2.0999999e-08, self.cfg.negexponent)
- self.assertAlmostEqual(2.0999999e-08, self.cfg.posexponent)
- self.assertAlmostEqual(2.0999999e08, self.cfg.exponent)
-
- def test_120(self): # Change(self):
- self.cfg.load(makeStream("simple_1"))
- self.cfg.message = 'Goodbye, cruel world!'
- self.assertEqual('Goodbye, cruel world!', self.cfg.message)
-
- def test_130(self): # Save(self):
- self.cfg.load(makeStream("simple_1"))
- self.cfg.message = 'Goodbye, cruel world!'
- out = OutStream()
- self.cfg.__save__(out)
- self.assertEqual("message : 'Goodbye, cruel world!'" + config.NEWLINE,
- out.value)
-
- def test_140(self): # Include(self):
- config.streamOpener = makeStream
- self.cfg = Config("include_1")
- config.streamOpener = config.defaultStreamOpener
- out = OutStream()
- self.cfg.__save__(out)
- s = "included :%s{%s test : 123%s another_test : 'abc'%s}%s" % (5 *
- (config.NEWLINE,))
- self.assertEqual(s, out.value)
-
- def test_150(self): # Expression(self):
- self.cfg.load(makeStream("expr_1"))
- self.assertEqual(15, self.cfg.derived1)
- self.assertEqual(5, self.cfg.derived2)
- self.assertEqual(50, self.cfg.derived3)
- self.assertEqual(2, self.cfg.derived4)
- self.assertEqual(0, self.cfg.derived5)
- self.assertEqual('abcghi', self.cfg.derived6)
- self.assertEqual('abcdefghi', self.cfg.derived7)
- self.assertRaises(TypeError, lambda x: x.derived8, self.cfg)
- self.assertRaises(ZeroDivisionError, lambda x: x.derived9, self.cfg)
- self.assertRaises(ZeroDivisionError, lambda x: x.derived10, self.cfg)
- self.assertRaises(ConfigResolutionError,
- lambda x: x.derived11, self.cfg)
- self.assertEqual(15, self.cfg.derived12)
-
- def test_160(self): # Eval(self):
- import sys, logging
- self.cfg.load(makeStream("eval_1"))
- self.assertEqual(sys.stderr, self.cfg.stderr)
- self.assertEqual(sys.stdout, self.cfg.stdout)
- self.assertEqual(sys.stdin, self.cfg.stdin)
- self.assertRaises(ConfigResolutionError, lambda x: x.debug, self.cfg)
- self.cfg.addNamespace(logging.Logger)
- self.assertEqual(logging.Logger.debug.im_func, self.cfg.debug)
- self.assertRaises(ConfigResolutionError, lambda x: x.DEBUG, self.cfg)
- self.cfg.addNamespace(logging)
- self.assertEqual(logging.DEBUG, self.cfg.DEBUG)
- self.cfg.removeNamespace(logging.Logger)
- self.assertEqual(logging.debug, self.cfg.debug)
- self.assertEqual(logging.DEBUG * 10, self.cfg.derived)
-
- def test_170(self): # Functions(self):
- makePath = config.makePath
- isWord = config.isWord
- self.assertEqual('suffix', makePath('', 'suffix'))
- self.assertEqual('suffix', makePath(None, 'suffix'))
- self.assertEqual('prefix.suffix', makePath('prefix', 'suffix'))
- self.assertEqual('prefix[1]', makePath('prefix', '[1]'))
- self.failUnless(isWord('a9'))
- self.failUnless(isWord('9a')) #perverse, but there you go
- self.failIf(isWord(9))
- self.failIf(isWord(None))
- self.failIf(isWord(self))
- self.failIf(isWord(''))
-
- def test_180(self): # Merge(self):
- cfg1 = Config()
- cfg1.load(makeStream("merge_1"))
- cfg2 = Config(makeStream("merge_2"))
- ConfigMerger().merge(cfg1, cfg2)
- merged = cfg1
- cfg1 = Config()
- cfg1.load(makeStream("merge_1"))
- for i in xrange(0, 5):
- key = 'value%d' % (i + 1,)
- self.failUnless(key in merged)
- self.assertEqual(len(cfg1.value5) + len(cfg2.value5),
- len(merged.value5))
- cfg3 = Config()
- cfg3.load(makeStream("merge_3"))
- cfg4 = Config(makeStream("merge_4"))
- merger = ConfigMerger()
- self.assertRaises(ConfigError, merger.merge, cfg3, cfg4)
-
- cfg3 = Config(makeStream("merge_3"))
- cfg4 = Config(makeStream("merge_4"))
- merger = ConfigMerger(config.overwriteMergeResolve)
- merger.merge(cfg3, cfg4)
- self.assertEqual(False, cfg3['value1'])
- self.assertEqual(4, cfg3['value2'])
-
- def customMergeResolve(map1, map2, key):
- if key == "value3":
- rv = "overwrite"
- else:
- rv = config.overwriteMergeResolve(map1, map2, key)
- return rv
-
- cfg3 = Config(makeStream("merge_3"))
- cfg4 = Config(makeStream("merge_4"))
- merger = ConfigMerger(customMergeResolve)
- merger.merge(cfg3, cfg4)
- self.assertEqual("[2, 4, 6]", str(cfg3.value3))
- self.assertEqual("[1, 3, 5, 2, 4, 6]", str(cfg3.value4))
-
- def test_190(self): # List(self):
- list = ConfigList()
- list.append(Config(makeStream("list_1")))
- list.append(Config(makeStream("list_2")))
- list.append(Config(makeStream("list_3")))
- self.assertEqual(1, list.getByPath('verbosity'))
- self.assertEqual(4, list.getByPath('program_value'))
- self.assertEqual(5, list.getByPath('suite_value'))
- self.assertRaises(ConfigError, list.getByPath, 'nonexistent_value')
-
- def test_200(self): # Get(self):
- cfg = self.cfg
- cfg.load(makeStream("get_1"))
- self.assertEqual(123, cfg.get('value1'))
- self.assertEqual(123, cfg.get('value1', -123))
- self.assertEqual(-123, cfg.get('value11', -123))
- self.assertEqual('abcd', cfg.get('value2'))
- self.failUnless(cfg.get('value3'))
- self.failIf(cfg.get('value4') is not None)
- self.assertEqual(123, cfg.value5.get('value1'))
- self.assertEqual(123, cfg.value5.get('value1', -123))
- self.assertEqual(-123, cfg.value5.get('value11', -123))
- self.assertEqual('abcd', cfg.value5.get('value2'))
- self.failUnless(cfg.value5.get('value3'))
- self.failIf(cfg.value5.get('value4') is not None)
-
- def test_210(self): # Multiline(self):
- cfg = self.cfg
- cfg.load(makeStream("multiline_1"))
- self.assertEqual("Value One\nValue Two\n", cfg.get('value1'))
- self.assertEqual("Value Three\nValue Four", cfg.get('value2'))
-
- def test_220(self): # Sequence(self):
- cfg = self.cfg
- strm = makeStream("sequence_1")
- cfg.load(strm)
- self.assertEqual(str(cfg.simple), "[1, 2]")
- self.assertEqual(str(cfg.nested), "[1, [2, 3], [4, [5, 6]]]")
- self.assertEqual(str(cfg.mixed), "['VALIGN', [0, 0], [-1, -1], 'TOP']")
-
- def test_230(self): # JSON(self):
- import os
- curDir, tmp = os.path.split(__file__)
- fileJson = os.path.join(curDir, 'config_0_3_9', 'styles.json')
- data = StringIO('dummy: ' + open(fileJson, 'r').read())
- self.cfg.load(data)
-
-def init_logging():
- logging.basicConfig(level=logging.DEBUG, filename="test_config.log",
- filemode="w", format="%(asctime)s %(levelname)-5s %(name)-10s %(message)s")
-"""
-def test_main():
- init_logging()
- test_support.run_unittest(TestConfig)
-"""
-
-if __name__ == "__main__":
- # test_main()
- unittest.main(exit=False)
- import sys
- sys.stderr.write("""
-
-###########################################################
-WARNING: this test obviously have 'FAILED (errors=6)', with config 0.3.7
-TODO: fix upgrading 0.3.9, (or not).
-###########################################################
-""")
- pass
-
--- /dev/null
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+# Copyright (C) 2010-2018 CEA/DEN
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import initializeTest # set PATH etc for test
+
+import src.debug as DBG # Easy print stderr (for DEBUG only)
+import src.pyconf as PYF # 0.3.7
+import config_0_3_9.config as PYF9 # TODO 0.3.9
+
+_EXAMPLES = {
+1 : """\
+ messages:
+ [
+ {
+ stream : "sys.stderr" # modified
+ message: 'Welcome'
+ name: 'Harry'
+ }
+ {
+ stream : "sys.stdout" # modified
+ message: 'Welkom'
+ name: 'Ruud'
+ }
+ {
+ stream : $messages[0].stream
+ message: 'Bienvenue'
+ name: "Yves"
+ }
+ ]
+""",
+
+2 : """\
+ aa: 111
+ bb: $aa + 222
+""",
+
+3 : """\
+ aa: Yves
+ bb: "Herve" # avoid Hervé -> 'utf8' codec can't decode byte
+""",
+
+4 : """\
+ aa: Yves
+ bb: "Hervé" # avoid Hervé -> 'utf8' codec can't decode byte
+""",
+
+5 : """\
+ aa: Yves
+ bb: "Herve"
+ cc: [
+ cc1
+ cc2
+ cc3
+ $bb + " hello"
+ ]
+ dd: {
+ d1 : dd11
+ d2 : dd22
+ d3 : dd33
+ d4 : $bb + " bye"
+ }
+""",
+
+# error circular
+6 : """\
+ aa: Yves
+ bb: $cc
+ cc: $bb
+""",
+
+7 : """\
+ aa: Yves
+ bb: $cc
+ cc: [
+ cc1
+ $bb
+ ]
+""",
+
+8 : """\
+ aa: Yves
+ bb: $cc
+ cc: {
+ cc1: cc11
+ cc2: $bb
+ }
+""",
+
+}
+
+
+class TestCase(unittest.TestCase):
+ "Test the pyconf.py"""
+
+ def test_000(self):
+ # one shot setUp() for this TestCase
+ # DBG.push_debug(True)
+ # SAT.setNotLocale() # test english
+ return
+
+ def test_010(self):
+ # pyconf.py doc example 0.3.7
+ # https://www.red-dove.com/config-doc/ is 0.3.9 !
+ # which, when run, would yield the console output:
+
+ expected = """\
+Welcome, Harry
+Welkom, Ruud
+Bienvenue, Yves
+"""
+ inStream = DBG.InStream(_EXAMPLES[1])
+ cfg = PYF.Config(inStream)
+ res = ''
+ for m in cfg.messages:
+ res += '%s, %s\n' % (m.message, m.name)
+ self.assertEqual(res, expected)
+ outStream = DBG.OutStream()
+ cfg.__save__(outStream) # sat renamed save() in __save__()
+ res = outStream.value
+ DBG.write("test_010 cfg", res)
+ self.assertTrue("name : 'Harry'" in res)
+ self.assertTrue("name : 'Ruud'" in res)
+ self.assertTrue("name : 'Yves'" in res)
+
+ def test_020(self):
+ cfg = PYF.Config()
+ self.assertEqual(str(cfg), '{}')
+ self.assertEqual(cfg.__repr__(), '{}')
+ cfg.aa = "1111"
+ self.assertEqual(str(cfg), "{'aa': '1111'}")
+ cfg.bb = 2222
+ self.assertTrue("'bb': 2222" in str(cfg))
+ self.assertTrue("'aa': '1111'" in str(cfg))
+ cfg.cc = 3333.
+ self.assertTrue("'cc': 3333." in str(cfg))
+
+ def test_030(self):
+ inStream = DBG.InStream(_EXAMPLES[2])
+ cfg = PYF.Config(inStream)
+ self.assertEqual(str(cfg), "{'aa': 111, 'bb': $aa + 222}")
+ self.assertEqual(cfg.aa, 111)
+ self.assertEqual(cfg.bb, 333)
+
+ def test_040(self):
+ inStream = DBG.InStream(_EXAMPLES[3])
+ cfg = PYF.Config(inStream)
+ self.assertEqual(cfg.aa, "Yves")
+ self.assertEqual(cfg.bb, "Herve")
+ self.assertEqual(type(cfg.bb), str)
+ cfg.bb = "Hervé" # try this
+ self.assertEqual(type(cfg.bb), str)
+ self.assertEqual(cfg.bb, "Hervé")
+
+ def test_045(self):
+ # make Hervé valid with pyconf.py as 0.3.9
+ inStream = DBG.InStream(_EXAMPLES[4])
+ outStream = DBG.OutStream()
+ cfg = PYF9.Config(inStream)
+ cfg.save(outStream) # OK
+ # TODO: cfg = PYF.Config(inStream)
+ # cfg.__save__(outStream) # KO and sat renamed save() in __save__()
+ res = outStream.value
+ DBG.write("test_045 cfg", res)
+ self.assertTrue("aa : 'Yves'" in res)
+ self.assertTrue(r"bb : 'Herv\xc3\xa9'" in res)
+ self.assertEqual(cfg.bb, "Hervé")
+
+ def test_100(self):
+ inStream = DBG.InStream(_EXAMPLES[5])
+ outStream = DBG.OutStream()
+ cfg = PYF.Config(inStream) # KO
+ cfg.__save__(outStream) # sat renamed save() in __save__()
+ res = outStream.value
+ DBG.write("test_100 cfg save", res)
+ DBG.write("test_100 cfg debug", cfg)
+ DBG.write("test_100 cfg.cc debug", cfg.cc)
+
+ cc = cfg.cc
+ # DBG.write("test_100 type cc[3]", dir(cc), True)
+ DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
+
+ def test_100(self):
+ inStream = DBG.InStream(_EXAMPLES[5])
+ outStream = DBG.OutStream()
+ cfg = PYF.Config(inStream) # KO
+ cfg.__save__(outStream) # sat renamed save() in __save__()
+ res = outStream.value
+ DBG.write("test_100 cfg save", res)
+ DBG.write("test_100 cfg debug", cfg)
+ DBG.write("test_100 cfg.cc debug", cfg.cc)
+
+ cc = cfg.cc
+ # DBG.write("test_100 type cc[3]", dir(cc), True)
+ DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
+
+ def test_110(self):
+ inStream = DBG.InStream(_EXAMPLES[6])
+ outStream = DBG.OutStream()
+ cfg = PYF.Config(inStream)
+ cfg.__save__(outStream)
+
+ res = outStream.value
+ DBG.write("test_110 cfg save", res)
+ self.assertNotIn("ERROR", res)
+
+ res = DBG.getStrConfigDbg(cfg)
+ DBG.write("test_110 cfg debug", res)
+ self.assertIn("ERROR", res)
+ self.assertIn("unable to evaluate $cc", res)
+ self.assertIn("unable to evaluate $bb", res)
+
+ def test_120(self):
+ for ii in [7, 8]:
+ inStream = DBG.InStream(_EXAMPLES[ii])
+ outStream = DBG.OutStream()
+ cfg = PYF.Config(inStream)
+ cfg.__save__(outStream)
+
+ res = outStream.value
+ DBG.write("test_120 cfg save", res, True)
+ self.assertNotIn("ERROR", res)
+
+ res = DBG.getStrConfigDbg(cfg)
+ DBG.write("test_120 cfg debug", res, True)
+ # no error circular !!!
+ # self.assertIn("ERROR", res) # no error circular !!!
+ # self.assertIn("unable to evaluate $cc", res)
+ # self.assertIn("unable to evaluate $bb", res)
+ res = cfg.bb
+ DBG.write("test_120 cfg.bb debug", res, True)
+
+ res = cfg.cc
+ DBG.write("test_120 cfg.cc debug", res, True)
+
+ def test_999(self):
+ # one shot tearDown() for this TestCase
+ # SAT.setLocale() # end test english
+ # DBG.pop_debug()
+ return
+
+if __name__ == '__main__':
+ unittest.main(exit=False)
+ pass
--- /dev/null
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+# Copyright 2004-2010 by Vinay Sajip. All Rights Reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of Vinay Sajip
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission.
+# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+"""
+Test harness for the configuration module 'config' for Python.
+
+from test_config 0.3.9 modified to test 0.3.7.1
+this test obviously have FAILED (errors=6),
+TODO, fix upgrading 0.3.9, or not.
+"""
+
+import unittest
+# import test_support
+
+import initializeTest # set PATH etc for test
+
+import src.pyconf as config
+from src.pyconf import Config, ConfigMerger, ConfigList
+from src.pyconf import ConfigError, ConfigFormatError, ConfigResolutionError
+import logging
+from StringIO import StringIO
+
+STREAMS = {
+ "simple_1" :
+"""
+message: 'Hello, world!'
+""",
+ "malformed_1" :
+"""
+123
+""",
+ "malformed_2" :
+"""
+[ 123, 'abc' ]
+""",
+ "malformed_3" :
+"""
+{ a : 7, b : 1.3, c : 'test' }
+""",
+ "malformed_4" :
+"""
+test: $a [7] # note space before bracket
+""",
+ "malformed_5" :
+"""
+test: 'abc'
+test: 'def'
+""",
+ "wellformed_1" :
+"""
+test: $a[7] # note no space before bracket
+""",
+ "boolean_1":
+"""
+test : False
+another_test: True
+""",
+ "boolean_2":
+"""
+test : false
+another_test: true
+""",
+ "none_1":
+"""
+test : None
+""",
+ "none_2":
+"""
+test : none
+""",
+ "number_1":
+"""
+root: 1
+stream: 1.7
+neg: -1
+negfloat: -2.0
+posexponent: 2.0999999e-08
+negexponent: -2.0999999e-08
+exponent: 2.0999999e08
+""",
+ "sequence_1":
+"""
+mixed: [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ]
+simple: [1, 2]
+nested: [1, [2, 3], [4, [5, 6]]]
+""",
+ "include_1":
+"""
+included: @'include_2'
+""",
+ "include_2":
+"""
+test: 123
+another_test: 'abc'
+""",
+ "expr_1":
+"""
+value1 : 10
+value2 : 5
+value3 : 'abc'
+value4 : 'ghi'
+value5 : 0
+value6 : { 'a' : $value1, 'b': $value2 }
+derived1 : $value1 + $value2
+derived2 : $value1 - $value2
+derived3 : $value1 * $value2
+derived4 : $value1 / $value2
+derived5 : $value1 % $value2
+derived6 : $value3 + $value4
+derived7 : $value3 + 'def' + $value4
+derived8 : $value3 - $value4 # meaningless
+derived9 : $value1 / $value5 # div by zero
+derived10 : $value1 % $value5 # div by zero
+derived11 : $value17 # doesn't exist
+derived12 : $value6.a + $value6.b
+""",
+ "eval_1":
+"""
+stderr : `sys.stderr`
+stdout : `sys.stdout`
+stdin : `sys.stdin`
+debug : `debug`
+DEBUG : `DEBUG`
+derived: $DEBUG * 10
+""",
+ "merge_1":
+"""
+value1: True
+value3: [1, 2, 3]
+value5: [ 7 ]
+value6: { 'a' : 1, 'c' : 3 }
+""",
+ "merge_2":
+"""
+value2: False
+value4: [4, 5, 6]
+value5: ['abc']
+value6: { 'b' : 2, 'd' : 4 }
+""",
+ "merge_3":
+"""
+value1: True
+value2: 3
+value3: [1, 3, 5]
+value4: [1, 3, 5]
+""",
+ "merge_4":
+"""
+value1: False
+value2: 4
+value3: [2, 4, 6]
+value4: [2, 4, 6]
+""",
+ "list_1":
+"""
+verbosity : 1
+""",
+ "list_2":
+"""
+verbosity : 2
+program_value: 4
+""",
+ "list_3":
+"""
+verbosity : 3
+suite_value: 5
+""",
+ "get_1":
+"""
+value1 : 123
+value2 : 'abcd'
+value3 : True
+value4 : None
+value5:
+{
+ value1 : 123
+ value2 : 'abcd'
+ value3 : True
+ value4 : None
+}
+""",
+ "multiline_1":
+"""
+value1: '''Value One
+Value Two
+'''
+value2: \"\"\"Value Three
+Value Four\"\"\"
+"""
+}
+
+def makeStream(name):
+ s = StringIO(STREAMS[name])
+ s.name = name
+ return s
+
+class OutStream(StringIO):
+ def close(self):
+ self.value = self.getvalue()
+ StringIO.close(self)
+
+class TestConfig(unittest.TestCase):
+
+ def setUp(self):
+ self.cfg = Config(None)
+
+ def tearDown(self):
+ del self.cfg
+
+ def test_010(self): # Creation(self):
+ self.assertEqual(0, len(self.cfg)) # should be empty
+
+ def test_020(self): # Simple(self):
+ self.cfg.load(makeStream("simple_1"))
+ self.failUnless('message' in self.cfg)
+ self.failIf('root' in self.cfg)
+ self.failIf('stream' in self.cfg)
+ self.failIf('load' in self.cfg)
+ self.failIf('__save__' in self.cfg)
+
+ def test_030(self): # ValueOnly(self):
+ self.assertRaises(ConfigError, self.cfg.load,
+ makeStream("malformed_1"))
+ self.assertRaises(ConfigError, self.cfg.load,
+ makeStream("malformed_2"))
+ self.assertRaises(ConfigError, self.cfg.load,
+ makeStream("malformed_3"))
+
+ def test_040(self): # BadBracket(self):
+ self.assertRaises(ConfigError, self.cfg.load,
+ makeStream("malformed_4"))
+
+ def test_050(self): # Duplicate(self):
+ self.assertRaises(ConfigError, self.cfg.load,
+ makeStream("malformed_5"))
+
+ def test_060(self): # GoodBracket(self):
+ self.cfg.load(makeStream("wellformed_1"))
+
+ def test_070(self): # Boolean(self):
+ self.cfg.load(makeStream("boolean_1"))
+ self.assertEqual(True, self.cfg.another_test)
+ self.assertEqual(False, self.cfg.test)
+
+ def test_080(self): # NotBoolean(self):
+ self.cfg.load(makeStream("boolean_2"))
+ self.assertEqual('true', self.cfg.another_test)
+ self.assertEqual('false', self.cfg.test)
+
+ def test_090(self): # None(self):
+ self.cfg.load(makeStream("none_1"))
+ self.assertEqual(None, self.cfg.test)
+
+ def test_100(self): # NotNone(self):
+ self.cfg.load(makeStream("none_2"))
+ self.assertEqual('none', self.cfg.test)
+
+ def test_110(self): # Number(self):
+ self.cfg.load(makeStream("number_1"))
+ self.assertEqual(1, self.cfg.root)
+ self.assertEqual(1.7, self.cfg.stream)
+ self.assertEqual(-1, self.cfg.neg)
+ self.assertEqual(-2.0, self.cfg.negfloat)
+ self.assertAlmostEqual(-2.0999999e-08, self.cfg.negexponent)
+ self.assertAlmostEqual(2.0999999e-08, self.cfg.posexponent)
+ self.assertAlmostEqual(2.0999999e08, self.cfg.exponent)
+
+ def test_120(self): # Change(self):
+ self.cfg.load(makeStream("simple_1"))
+ self.cfg.message = 'Goodbye, cruel world!'
+ self.assertEqual('Goodbye, cruel world!', self.cfg.message)
+
+ def test_130(self): # Save(self):
+ self.cfg.load(makeStream("simple_1"))
+ self.cfg.message = 'Goodbye, cruel world!'
+ out = OutStream()
+ self.cfg.__save__(out)
+ self.assertEqual("message : 'Goodbye, cruel world!'" + config.NEWLINE,
+ out.value)
+
+ def test_140(self): # Include(self):
+ config.streamOpener = makeStream
+ self.cfg = Config("include_1")
+ config.streamOpener = config.defaultStreamOpener
+ out = OutStream()
+ self.cfg.__save__(out)
+ s = "included :%s{%s test : 123%s another_test : 'abc'%s}%s" % (5 *
+ (config.NEWLINE,))
+ self.assertEqual(s, out.value)
+
+ def test_150(self): # Expression(self):
+ self.cfg.load(makeStream("expr_1"))
+ self.assertEqual(15, self.cfg.derived1)
+ self.assertEqual(5, self.cfg.derived2)
+ self.assertEqual(50, self.cfg.derived3)
+ self.assertEqual(2, self.cfg.derived4)
+ self.assertEqual(0, self.cfg.derived5)
+ self.assertEqual('abcghi', self.cfg.derived6)
+ self.assertEqual('abcdefghi', self.cfg.derived7)
+ self.assertRaises(TypeError, lambda x: x.derived8, self.cfg)
+ self.assertRaises(ZeroDivisionError, lambda x: x.derived9, self.cfg)
+ self.assertRaises(ZeroDivisionError, lambda x: x.derived10, self.cfg)
+ self.assertRaises(ConfigResolutionError,
+ lambda x: x.derived11, self.cfg)
+ self.assertEqual(15, self.cfg.derived12)
+
+ def test_160(self): # Eval(self):
+ import sys, logging
+ self.cfg.load(makeStream("eval_1"))
+ self.assertEqual(sys.stderr, self.cfg.stderr)
+ self.assertEqual(sys.stdout, self.cfg.stdout)
+ self.assertEqual(sys.stdin, self.cfg.stdin)
+ self.assertRaises(ConfigResolutionError, lambda x: x.debug, self.cfg)
+ self.cfg.addNamespace(logging.Logger)
+ self.assertEqual(logging.Logger.debug.im_func, self.cfg.debug)
+ self.assertRaises(ConfigResolutionError, lambda x: x.DEBUG, self.cfg)
+ self.cfg.addNamespace(logging)
+ self.assertEqual(logging.DEBUG, self.cfg.DEBUG)
+ self.cfg.removeNamespace(logging.Logger)
+ self.assertEqual(logging.debug, self.cfg.debug)
+ self.assertEqual(logging.DEBUG * 10, self.cfg.derived)
+
+ def test_170(self): # Functions(self):
+ makePath = config.makePath
+ isWord = config.isWord
+ self.assertEqual('suffix', makePath('', 'suffix'))
+ self.assertEqual('suffix', makePath(None, 'suffix'))
+ self.assertEqual('prefix.suffix', makePath('prefix', 'suffix'))
+ self.assertEqual('prefix[1]', makePath('prefix', '[1]'))
+ self.failUnless(isWord('a9'))
+ self.failUnless(isWord('9a')) #perverse, but there you go
+ self.failIf(isWord(9))
+ self.failIf(isWord(None))
+ self.failIf(isWord(self))
+ self.failIf(isWord(''))
+
+ def test_180(self): # Merge(self):
+ cfg1 = Config()
+ cfg1.load(makeStream("merge_1"))
+ cfg2 = Config(makeStream("merge_2"))
+ ConfigMerger().merge(cfg1, cfg2)
+ merged = cfg1
+ cfg1 = Config()
+ cfg1.load(makeStream("merge_1"))
+ for i in xrange(0, 5):
+ key = 'value%d' % (i + 1,)
+ self.failUnless(key in merged)
+ self.assertEqual(len(cfg1.value5) + len(cfg2.value5),
+ len(merged.value5))
+ cfg3 = Config()
+ cfg3.load(makeStream("merge_3"))
+ cfg4 = Config(makeStream("merge_4"))
+ merger = ConfigMerger()
+ self.assertRaises(ConfigError, merger.merge, cfg3, cfg4)
+
+ cfg3 = Config(makeStream("merge_3"))
+ cfg4 = Config(makeStream("merge_4"))
+ merger = ConfigMerger(config.overwriteMergeResolve)
+ merger.merge(cfg3, cfg4)
+ self.assertEqual(False, cfg3['value1'])
+ self.assertEqual(4, cfg3['value2'])
+
+ def customMergeResolve(map1, map2, key):
+ if key == "value3":
+ rv = "overwrite"
+ else:
+ rv = config.overwriteMergeResolve(map1, map2, key)
+ return rv
+
+ cfg3 = Config(makeStream("merge_3"))
+ cfg4 = Config(makeStream("merge_4"))
+ merger = ConfigMerger(customMergeResolve)
+ merger.merge(cfg3, cfg4)
+ self.assertEqual("[2, 4, 6]", str(cfg3.value3))
+ self.assertEqual("[1, 3, 5, 2, 4, 6]", str(cfg3.value4))
+
+ def test_190(self): # List(self):
+ list = ConfigList()
+ list.append(Config(makeStream("list_1")))
+ list.append(Config(makeStream("list_2")))
+ list.append(Config(makeStream("list_3")))
+ self.assertEqual(1, list.getByPath('verbosity'))
+ self.assertEqual(4, list.getByPath('program_value'))
+ self.assertEqual(5, list.getByPath('suite_value'))
+ self.assertRaises(ConfigError, list.getByPath, 'nonexistent_value')
+
+ def test_200(self): # Get(self):
+ cfg = self.cfg
+ cfg.load(makeStream("get_1"))
+ self.assertEqual(123, cfg.get('value1'))
+ self.assertEqual(123, cfg.get('value1', -123))
+ self.assertEqual(-123, cfg.get('value11', -123))
+ self.assertEqual('abcd', cfg.get('value2'))
+ self.failUnless(cfg.get('value3'))
+ self.failIf(cfg.get('value4') is not None)
+ self.assertEqual(123, cfg.value5.get('value1'))
+ self.assertEqual(123, cfg.value5.get('value1', -123))
+ self.assertEqual(-123, cfg.value5.get('value11', -123))
+ self.assertEqual('abcd', cfg.value5.get('value2'))
+ self.failUnless(cfg.value5.get('value3'))
+ self.failIf(cfg.value5.get('value4') is not None)
+
+ def test_210(self): # Multiline(self):
+ cfg = self.cfg
+ cfg.load(makeStream("multiline_1"))
+ self.assertEqual("Value One\nValue Two\n", cfg.get('value1'))
+ self.assertEqual("Value Three\nValue Four", cfg.get('value2'))
+
+ def test_220(self): # Sequence(self):
+ cfg = self.cfg
+ strm = makeStream("sequence_1")
+ cfg.load(strm)
+ self.assertEqual(str(cfg.simple), "[1, 2]")
+ self.assertEqual(str(cfg.nested), "[1, [2, 3], [4, [5, 6]]]")
+ self.assertEqual(str(cfg.mixed), "['VALIGN', [0, 0], [-1, -1], 'TOP']")
+
+ def test_230(self): # JSON(self):
+ import os
+ curDir, tmp = os.path.split(__file__)
+ fileJson = os.path.join(curDir, 'config_0_3_9', 'styles.json')
+ data = StringIO('dummy: ' + open(fileJson, 'r').read())
+ self.cfg.load(data)
+
+def init_logging():
+ logging.basicConfig(level=logging.DEBUG, filename="test_config.log",
+ filemode="w", format="%(asctime)s %(levelname)-5s %(name)-10s %(message)s")
+"""
+def test_main():
+ init_logging()
+ test_support.run_unittest(TestConfig)
+"""
+
+if __name__ == "__main__":
+ # test_main()
+ unittest.main(exit=False)
+ import sys
+ sys.stderr.write("""
+
+###########################################################
+WARNING: this test obviously have 'FAILED (errors=6)', with config 0.3.7
+TODO: fix upgrading 0.3.9, (or not).
+###########################################################
+""")
+ pass
+