Преглед изворни кода

Merge remote-tracking branch 'sfriesel/master'

Conflicts:
	supervisor/datatypes.py
	supervisor/tests/test_datatypes.py
Mike Naberezny пре 11 година
родитељ
комит
3bb6b36b15
2 измењених фајлова са 25 додато и 2 уклоњено
  1. 2 2
      supervisor/datatypes.py
  2. 23 0
      supervisor/tests/test_datatypes.py

+ 2 - 2
supervisor/datatypes.py

@@ -81,7 +81,7 @@ def dict_of_key_value_pairs(arg):
     """ parse KEY=val,KEY2=val2 into {'KEY':'val', 'KEY2':'val2'}
         Quotes can be used to allow commas in the value
     """
-    lexer = shlex.shlex(str(arg))
+    lexer = shlex.shlex(str(arg), posix=True)
     lexer.wordchars += '/.+-():'
 
     tokens = list(lexer)
@@ -93,7 +93,7 @@ def dict_of_key_value_pairs(arg):
         k_eq_v = tokens[i:i+3]
         if len(k_eq_v) != 3 or k_eq_v[1] != '=':
             raise ValueError("Unexpected end of key/value pairs")
-        D[k_eq_v[0]] = k_eq_v[2].strip('\'"')
+        D[k_eq_v[0]] = k_eq_v[2]
         i += 4
     return D
 

+ 23 - 0
supervisor/tests/test_datatypes.py

@@ -156,6 +156,21 @@ class DictOfKeyValuePairsTests(unittest.TestCase):
         expected = {'foo': 'bar,baz', 'baz': 'q,ux'}
         self.assertEqual(actual, expected)
 
+    def test_handles_newlines_inside_quotes(self):
+        actual = datatypes.dict_of_key_value_pairs('foo="a\nb\nc"')
+        expected = {'foo': 'a\nb\nc'}
+        self.assertEqual(actual, expected)
+
+    def test_handles_quotes_inside_quotes(self):
+        actual = datatypes.dict_of_key_value_pairs('foo="\'\\""')
+        expected = {'foo': '\'"'}
+        self.assertEqual(actual, expected)
+
+    def test_handles_empty_inside_quotes(self):
+        actual = datatypes.dict_of_key_value_pairs('foo=""')
+        expected = {'foo': ''}
+        self.assertEqual(actual, expected)
+
     def test_handles_unquoted_non_alphanum(self):
         actual = self._callFUT(
             'HOME=/home/auser,FOO=/.foo+(1.2)-_/,'
@@ -164,6 +179,14 @@ class DictOfKeyValuePairsTests(unittest.TestCase):
                     'SUPERVISOR_SERVER_URL': 'http://127.0.0.1:9001'}
         self.assertEqual(actual, expected)
 
+    def test_handles_unquoted_non_alphanum(self):
+        actual = datatypes.dict_of_key_value_pairs(
+            'HOME=/home/auser,FOO=/.foo+(1.2)-_/,'
+            'SUPERVISOR_SERVER_URL=http://127.0.0.1:9001')
+        expected = {'HOME': '/home/auser', 'FOO': '/.foo+(1.2)-_/',
+                    'SUPERVISOR_SERVER_URL': 'http://127.0.0.1:9001'}
+        self.assertEqual(actual, expected)
+
     def test_allows_trailing_comma(self):
         actual = self._callFUT('foo=bar,')
         expected = {'foo': 'bar'}