Skip to content

Commit e1e4fc4

Browse files
committed
Fix key type error handling
Signed-off-by: Aleksei Stepanov <penguinolog@gmail.com> (cherry picked from commit bae0196) Signed-off-by: Aleksei Stepanov <penguinolog@gmail.com>
1 parent 371f7a1 commit e1e4fc4

File tree

3 files changed

+45
-41
lines changed

3 files changed

+45
-41
lines changed

doc/source/ExecResult.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ API: ExecResult
193193
:type item: typing.Union[int, slice, typing.Iterable[typing.Union[int, slice, ellipsis]]]
194194
:returns: Joined selected lines
195195
:rtype: str
196-
:raises KeyError: Unexpected key
196+
:raises TypeError: Unexpected key
197197

198198
.. py:method:: __unicode__(self)
199199

exec_helpers/exec_result.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,23 +82,25 @@ def __getitem__(
8282
:type item: typing.Union[int, slice, typing.Iterable[typing.Union[int, slice, ellipsis]]]
8383
:returns: Joined selected lines
8484
:rtype: str
85-
:raises KeyError: Unexpected key
85+
:raises TypeError: Unexpected key
8686
"""
8787
if isinstance(item, six.integer_types):
8888
return _get_str_from_bin(_get_bytearray_from_array([self._data[item]]))
8989
if isinstance(item, slice):
9090
return _get_str_from_bin(_get_bytearray_from_array(self._data[item]))
91-
buf = [] # type: typing.List[bytes]
92-
for rule in item:
93-
if isinstance(rule, six.integer_types):
94-
buf.append(self._data[rule])
95-
elif isinstance(rule, slice):
96-
buf.extend(self._data[rule])
97-
elif rule is Ellipsis:
98-
buf.append(b"...\n")
99-
else:
100-
raise KeyError("Unexpected key: {rule!r} (from {item!r})".format(rule=rule, item=item))
101-
return _get_str_from_bin(_get_bytearray_from_array(buf))
91+
if isinstance(item, tuple):
92+
buf = [] # type: typing.List[bytes]
93+
for rule in item:
94+
if isinstance(rule, six.integer_types):
95+
buf.append(self._data[rule])
96+
elif isinstance(rule, slice):
97+
buf.extend(self._data[rule])
98+
elif rule is Ellipsis:
99+
buf.append(b"...\n")
100+
else:
101+
raise TypeError("Unexpected key type: {rule!r} (from {item!r})".format(rule=rule, item=item))
102+
return _get_str_from_bin(_get_bytearray_from_array(buf))
103+
raise TypeError("Unexpected key type: {item!r}".format(item=item))
102104

103105
def __len__(self): # type: () -> int # pragma: no cover
104106
"""Data len."""

test/test_exec_result.py

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -265,37 +265,39 @@ def test_indexed_lines_access(self):
265265
result = exec_helpers.ExecResult(
266266
cmd,
267267
stdout=(
268-
b'line0\n',
269-
b'line1\n',
270-
b'line2\n',
271-
b'line3\n',
272-
b'line4\n',
273-
b'line5\n',
274-
b'line6\n',
275-
b'line7\n',
276-
b'line8\n',
277-
b'line9\n',
268+
b"line0\n",
269+
b"line1\n",
270+
b"line2\n",
271+
b"line3\n",
272+
b"line4\n",
273+
b"line5\n",
274+
b"line6\n",
275+
b"line7\n",
276+
b"line8\n",
277+
b"line9\n",
278278
),
279279
stderr=(
280-
b'e_line0\n',
281-
b'e_line1\n',
282-
b'e_line2\n',
283-
b'e_line3\n',
284-
b'e_line4\n',
285-
b'e_line5\n',
286-
b'e_line6\n',
287-
b'e_line7\n',
288-
b'e_line8\n',
289-
b'e_line9\n',
290-
)
280+
b"e_line0\n",
281+
b"e_line1\n",
282+
b"e_line2\n",
283+
b"e_line3\n",
284+
b"e_line4\n",
285+
b"e_line5\n",
286+
b"e_line6\n",
287+
b"e_line7\n",
288+
b"e_line8\n",
289+
b"e_line9\n",
290+
),
291291
)
292292

293293
self.assertEqual(result.stdout_lines[:], result.stdout_str)
294294
self.assertEqual(result.stderr_lines[:], result.stderr_str)
295-
self.assertEqual(result.stdout_lines[0], 'line0')
296-
self.assertEqual(result.stdout_lines[0, 1], 'line0\nline1')
297-
self.assertEqual(result.stdout_lines[0, 2], 'line0\nline2')
298-
self.assertEqual(result.stdout_lines[0, ..., 2], 'line0\n...\nline2')
299-
self.assertEqual(result.stdout_lines[:1, ..., 2], 'line0\n...\nline2')
300-
with self.assertRaises(KeyError):
301-
_ = result.stdout_lines[1, 'aaa'] # noqa
295+
self.assertEqual(result.stdout_lines[0], "line0")
296+
self.assertEqual(result.stdout_lines[0, 1], "line0\nline1")
297+
self.assertEqual(result.stdout_lines[0, 2], "line0\nline2")
298+
self.assertEqual(result.stdout_lines[0, ..., 2], "line0\n...\nline2")
299+
self.assertEqual(result.stdout_lines[:1, ..., 2], "line0\n...\nline2")
300+
with self.assertRaises(TypeError):
301+
_ = result.stdout_lines["aaa"] # noqa
302+
with self.assertRaises(TypeError):
303+
_ = result.stdout_lines[1, "aaa"] # noqa

0 commit comments

Comments
 (0)