Skip to content

Commit 70ab448

Browse files
committed
moved _process_args to module, add tests for repl.client.main
1 parent d1e9d29 commit 70ab448

File tree

2 files changed

+96
-38
lines changed

2 files changed

+96
-38
lines changed

pymodbus/repl/client/main.py

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,53 @@ def convert(self, value, param, ctx):
121121
return None
122122

123123

124+
def _process_args(args, string: bool=True):
125+
"""Internal function to parse arguments provided on command line.
126+
127+
:param args: Array of argument values
128+
:param string: True if arguments values are strings, false if argument values are integers
129+
130+
:return Tuple, where the first member is hash of parsed values, and second is boolean flag
131+
indicating if parsing succeeded.
132+
"""
133+
kwargs = {}
134+
execute = True
135+
skip_index = None
136+
for i, arg in enumerate(args):
137+
if i == skip_index:
138+
continue
139+
arg = arg.strip()
140+
if "=" in arg:
141+
arg_name, val = arg.split("=")
142+
if not string:
143+
if "," in val:
144+
val = val.split(",")
145+
val = [int(v, 0) for v in val]
146+
else:
147+
val = int(val, 0)
148+
kwargs[arg_name] = val
149+
else:
150+
arg_name, val = arg, args[i + 1]
151+
try:
152+
if not string:
153+
if "," in val:
154+
val = val.split(",")
155+
val = [int(v, 0) for v in val]
156+
else:
157+
val = int(val, 0)
158+
kwargs[arg_name] = val
159+
skip_index = i + 1
160+
except TypeError:
161+
click.secho("Error parsing arguments!", fg="yellow")
162+
execute = False
163+
break
164+
except ValueError:
165+
click.secho("Error parsing argument", fg="yellow")
166+
execute = False
167+
break
168+
return kwargs, execute
169+
170+
124171
def cli(client): # noqa: C901 pylint: disable=too-complex
125172
"""Run client definition."""
126173
use_keys = KeyBindings()
@@ -142,44 +189,6 @@ def _(event):
142189
buffer = event.cli.current_buffer
143190
buffer.complete_state = None
144191

145-
def _process_args(args, string=True):
146-
kwargs = {}
147-
execute = True
148-
skip_index = None
149-
for i, arg in enumerate(args):
150-
if i == skip_index:
151-
continue
152-
arg = arg.strip()
153-
if "=" in arg:
154-
arg_name, val = arg.split("=")
155-
if not string:
156-
if "," in val:
157-
val = val.split(",")
158-
val = [int(v, 0) for v in val]
159-
else:
160-
val = int(val, 0)
161-
kwargs[arg_name] = val
162-
else:
163-
arg_name, val = arg, args[i + 1]
164-
try:
165-
if not string:
166-
if "," in val:
167-
val = val.split(",")
168-
val = [int(v, 0) for v in val]
169-
else:
170-
val = int(val, 0)
171-
kwargs[arg_name] = val
172-
skip_index = i + 1
173-
except TypeError:
174-
click.secho("Error parsing arguments!", fg="yellow")
175-
execute = False
176-
break
177-
except ValueError:
178-
click.secho("Error parsing argument", fg="yellow")
179-
execute = False
180-
break
181-
return kwargs, execute
182-
183192
session = PromptSession(
184193
lexer=PygmentsLexer(PythonLexer),
185194
completer=CmdCompleter(client),

test/test_repl_client.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""Test client sync."""
2+
import pytest
3+
4+
from pymodbus.repl.client.main import _process_args as process_args
5+
6+
7+
def test_repl_client_process_args():
8+
"""Test argument processing in repl.client.main (_process_args function)."""
9+
resp = process_args(["address=11"], False)
10+
assert resp == ({"address": 11}, True)
11+
12+
resp = process_args(["address=0x11"], False)
13+
assert resp == ({"address": 17}, True)
14+
15+
resp = process_args(["address=0b11"], False)
16+
assert resp == ({"address": 3}, True)
17+
18+
resp = process_args(["address=0o11"], False)
19+
assert resp == ({"address": 9}, True)
20+
21+
resp = process_args(["address=11", "value=0x10"], False)
22+
assert resp == ({"address": 11, "value": 16}, True)
23+
24+
resp = process_args(["value=11", "address=0x10"], False)
25+
assert resp == ({"address": 16, "value": 11}, True)
26+
27+
resp = process_args(["address=0b11", "value=0x10"], False)
28+
assert resp == ({"address": 3, "value": 16}, True)
29+
30+
try:
31+
resp = process_args(["address=0xhj", "value=0x10"], False)
32+
except ValueError:
33+
pass
34+
except Exception as exc: # pylint: disable=broad-except
35+
pytest.fail(f"Exception in _process_args: {exc}")
36+
37+
try:
38+
resp = process_args(["address=11ah", "value=0x10"], False)
39+
except ValueError:
40+
pass
41+
except Exception as exc: # pylint: disable=broad-except
42+
pytest.fail(f"Exception in _process_args: {exc}")
43+
44+
try:
45+
resp = process_args(["address=0b12", "value=0x10"], False)
46+
except ValueError:
47+
pass
48+
except Exception as exc: # pylint: disable=broad-except
49+
pytest.fail(f"Exception in _process_args: {exc}")

0 commit comments

Comments
 (0)