summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/logging/config.py2
-rw-r--r--Lib/test/test_logging.py48
2 files changed, 48 insertions, 2 deletions
diff --git a/Lib/logging/config.py b/Lib/logging/config.py
index a68281d..41283f4 100644
--- a/Lib/logging/config.py
+++ b/Lib/logging/config.py
@@ -378,7 +378,7 @@ class BaseConfigurator(object):
WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*')
- INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*')
+ INDEX_PATTERN = re.compile(r'^\[([^\[\]]*)\]\s*')
DIGIT_PATTERN = re.compile(r'^\d+$')
value_converters = {
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index f26846f..c2e8ff5 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -3662,7 +3662,28 @@ class ConfigDictTest(BaseTest):
d = {
'atuple': (1, 2, 3),
'alist': ['a', 'b', 'c'],
- 'adict': {'d': 'e', 'f': 3 },
+ 'adict': {
+ 'd': 'e', 'f': 3 ,
+ 'alpha numeric 1 with spaces' : 5,
+ 'aplha numeric 1 %( - © ©ß¯' : 9,
+ 'alpha numeric ] 1 with spaces' : 15,
+ 'aplha ]] numeric 1 %( - © ©ß¯]' : 19,
+ ' aplha [ numeric 1 %( - © ©ß¯] ' : 11,
+ ' aplha ' : 32,
+ '' : 10,
+ 'nest4' : {
+ 'd': 'e', 'f': 3 ,
+ 'alpha numeric 1 with spaces' : 5,
+ 'aplha numeric 1 %( - © ©ß¯' : 9,
+ '' : 10,
+ 'somelist' : ('g', ('h', 'i'), 'j'),
+ 'somedict' : {
+ 'a' : 1,
+ 'a with 1 and space' : 3,
+ 'a with ( and space' : 4,
+ }
+ }
+ },
'nest1': ('g', ('h', 'i'), 'j'),
'nest2': ['k', ['l', 'm'], 'n'],
'nest3': ['o', 'cfg://alist', 'p'],
@@ -3674,11 +3695,36 @@ class ConfigDictTest(BaseTest):
self.assertEqual(bc.convert('cfg://nest2[1][1]'), 'm')
self.assertEqual(bc.convert('cfg://adict.d'), 'e')
self.assertEqual(bc.convert('cfg://adict[f]'), 3)
+ self.assertEqual(bc.convert('cfg://adict[alpha numeric 1 with spaces]'), 5)
+ self.assertEqual(bc.convert('cfg://adict[aplha numeric 1 %( - © ©ß¯]'), 9)
+ self.assertEqual(bc.convert('cfg://adict[]'), 10)
+ self.assertEqual(bc.convert('cfg://adict.nest4.d'), 'e')
+ self.assertEqual(bc.convert('cfg://adict.nest4[d]'), 'e')
+ self.assertEqual(bc.convert('cfg://adict[nest4].d'), 'e')
+ self.assertEqual(bc.convert('cfg://adict[nest4][f]'), 3)
+ self.assertEqual(bc.convert('cfg://adict[nest4][alpha numeric 1 with spaces]'), 5)
+ self.assertEqual(bc.convert('cfg://adict[nest4][aplha numeric 1 %( - © ©ß¯]'), 9)
+ self.assertEqual(bc.convert('cfg://adict[nest4][]'), 10)
+ self.assertEqual(bc.convert('cfg://adict[nest4][somelist][0]'), 'g')
+ self.assertEqual(bc.convert('cfg://adict[nest4][somelist][1][0]'), 'h')
+ self.assertEqual(bc.convert('cfg://adict[nest4][somelist][1][1]'), 'i')
+ self.assertEqual(bc.convert('cfg://adict[nest4][somelist][2]'), 'j')
+ self.assertEqual(bc.convert('cfg://adict[nest4].somedict.a'), 1)
+ self.assertEqual(bc.convert('cfg://adict[nest4].somedict[a]'), 1)
+ self.assertEqual(bc.convert('cfg://adict[nest4].somedict[a with 1 and space]'), 3)
+ self.assertEqual(bc.convert('cfg://adict[nest4].somedict[a with ( and space]'), 4)
+ self.assertEqual(bc.convert('cfg://adict.nest4.somelist[1][1]'), 'i')
+ self.assertEqual(bc.convert('cfg://adict.nest4.somelist[2]'), 'j')
+ self.assertEqual(bc.convert('cfg://adict.nest4.somedict.a'), 1)
+ self.assertEqual(bc.convert('cfg://adict.nest4.somedict[a]'), 1)
v = bc.convert('cfg://nest3')
self.assertEqual(v.pop(1), ['a', 'b', 'c'])
self.assertRaises(KeyError, bc.convert, 'cfg://nosuch')
self.assertRaises(ValueError, bc.convert, 'cfg://!')
self.assertRaises(KeyError, bc.convert, 'cfg://adict[2]')
+ self.assertRaises(KeyError, bc.convert, 'cfg://adict[alpha numeric ] 1 with spaces]')
+ self.assertRaises(ValueError, bc.convert, 'cfg://adict[ aplha ]] numeric 1 %( - © ©ß¯] ]')
+ self.assertRaises(ValueError, bc.convert, 'cfg://adict[ aplha [ numeric 1 %( - © ©ß¯] ]')
def test_namedtuple(self):
# see bpo-39142