mirror of https://gitlab.com/pamhyr/pamhyr2
tools: parser: Minor change and tests fixes.
parent
7bbca7cf54
commit
17eb3e8184
|
|
@ -92,8 +92,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
def test_unix_simple(self):
|
||||
cmd = "/foo/bar a -b -c"
|
||||
|
|
@ -101,8 +102,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
def test_unix_quoted(self):
|
||||
cmd = "\"/foo/bar\" -a -b -c"
|
||||
|
|
@ -110,8 +112,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
def test_unix_quoted_with_space(self):
|
||||
cmd = "\"/foo/bar baz\" -a -b -c"
|
||||
|
|
@ -119,8 +122,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
def test_unix_quoted_args(self):
|
||||
cmd = "/foo/bar -a -b -c=\"baz\""
|
||||
|
|
@ -128,8 +132,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
def test_unix_quoted_args_with_space(self):
|
||||
cmd = "/foo/bar -a -b -c=\"baz bazz\""
|
||||
|
|
@ -137,8 +142,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
def test_unix_quoted2_args_with_space(self):
|
||||
cmd = "\'/foo/bar baz\' -a -b -c='baz bazz'"
|
||||
|
|
@ -146,8 +152,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
def test_unix_escape_space(self):
|
||||
cmd = r"/foo/bar\ baz -a -b -c"
|
||||
|
|
@ -155,8 +162,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
def test_windows_prog_files(self):
|
||||
cmd = "\"C:\\Program Files (x86)\foo\bar\" a -b -c"
|
||||
|
|
@ -164,8 +172,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
def test_windows_prog_files_args(self):
|
||||
cmd = "\"C:\\Program Files (x86)\foo\bar\" a -b=\"baz bazz\" -c"
|
||||
|
|
@ -176,5 +185,41 @@ class ToolsCMDParserTestCase(unittest.TestCase):
|
|||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
for i, s in enumerate(expect):
|
||||
self.assertEqual(res[i], s)
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
# Parse must detect malformed command line... But is not :\
|
||||
|
||||
@unittest.expectedFailure
|
||||
def test_wrong_format_0(self):
|
||||
cmd = "'toto -a -b='baz bazz' -c"
|
||||
expect = []
|
||||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
@unittest.expectedFailure
|
||||
def test_wrong_format_1(self):
|
||||
cmd = "\"toto -a -b=\"baz bazz\" -c"
|
||||
expect = []
|
||||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
||||
@unittest.expectedFailure
|
||||
def test_wrong_format_2(self):
|
||||
cmd = "'toto -a -b=\"baz bazz\" -c"
|
||||
expect = []
|
||||
|
||||
res = parse_command_line(cmd)
|
||||
|
||||
self.assertEqual(len(res), len(expect))
|
||||
for i, s in enumerate(res):
|
||||
self.assertEqual(expect[i], s)
|
||||
|
|
|
|||
19
src/tools.py
19
src/tools.py
|
|
@ -367,12 +367,17 @@ def parse_command_line(cmd):
|
|||
words = []
|
||||
rest = cmd
|
||||
|
||||
while True:
|
||||
if len(rest) == 0:
|
||||
break
|
||||
try:
|
||||
while True:
|
||||
if len(rest) == 0:
|
||||
break
|
||||
|
||||
word, rest = _parse_next_word(rest)
|
||||
words.append(word)
|
||||
word, rest = _parse_next_word(rest)
|
||||
words.append(word)
|
||||
except Exception as e:
|
||||
logger.error(f"{parse_command_line}: Failed to parse command line '{cmd}'")
|
||||
logger.error(f" exception raise {e}")
|
||||
return []
|
||||
|
||||
return words
|
||||
|
||||
|
|
@ -442,9 +447,9 @@ def _parse_word_up_to_next_sep(words, sep=" "):
|
|||
i += len(sub_word) + 1
|
||||
word += sub_word + cur
|
||||
|
||||
# Get next symbol
|
||||
# Get next token
|
||||
i += 1
|
||||
if i == len(words):
|
||||
if i >= len(words):
|
||||
cur = ""
|
||||
else:
|
||||
cur = words[i]
|
||||
|
|
|
|||
Loading…
Reference in New Issue