Skip to content

Commit 4fd17cf

Browse files
committed
Refactor worklist.py, flash_uf2.py, cli_flash.py, and mpremoteboard/__init__.py files
1 parent 9b2e43e commit 4fd17cf

File tree

5 files changed

+122
-9
lines changed

5 files changed

+122
-9
lines changed

src/mpflash/mpflash/cli_flash.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from .cli_list import show_mcus
1414
from .config import config
1515
from .flash import flash_list
16-
from .worklist import WorkList, full_auto_worklist, manual_worklist, single_auto_worklist
16+
from .worklist import MPRemoteBoard, WorkList, full_auto_worklist, manual_worklist, single_auto_worklist
1717

1818
# #########################################################################################################
1919
# CLI
@@ -104,6 +104,11 @@ def cli_flash_board(**kwargs):
104104
if not params.boards or params.boards == []:
105105
# nothing specified - detect connected boards
106106
params.ports, params.boards = connected_ports_boards()
107+
if params.boards == []:
108+
# No MicroPython boards detected, but it could be unflashed or not in bootloader mode
109+
# Ask for serial port and board_id to flash
110+
params.serial = "?"
111+
params.boards = ["?"]
107112
else:
108113
for board_id in params.boards:
109114
if board_id == "":

src/mpflash/mpflash/flash_uf2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,6 @@ def flash_uf2(mcu: MPRemoteBoard, fw_file: Path, erase: bool) -> Optional[MPRemo
5656
log.success("Done copying, resetting the board and wait for it to restart")
5757
if sys.platform in ["linux", "darwin"]:
5858
dismount_uf2()
59-
for _ in track(range(5 + 2)):
59+
for _ in track(range(5 + 2), description="Waiting for the board to restart", transient=True):
6060
time.sleep(1) # 5 secs to short on linux
6161
return mcu

src/mpflash/mpflash/mpremoteboard/__init__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,23 +65,24 @@ def __str__(self):
6565

6666
@staticmethod
6767
def connected_boards(bluetooth: bool = False) -> List[str]:
68+
# TODO: rename to connected_comports
6869
"""
69-
Get a list of connected boards.
70+
Get a list of connected comports.
7071
7172
Parameters:
7273
- bluetooth (bool): Whether to include Bluetooth ports. Default is False.
7374
7475
Returns:
7576
- List[str]: A list of connected board ports.
7677
"""
77-
ports = serial.tools.list_ports.comports()
78+
comports = serial.tools.list_ports.comports()
7879

7980
if not bluetooth:
8081
# filter out bluetooth ports
81-
ports = [p for p in ports if "bluetooth" not in p.description.lower()]
82-
ports = [p for p in ports if "BTHENUM" not in p.hwid]
82+
comports = [p for p in comports if "bluetooth" not in p.description.lower()]
83+
comports = [p for p in comports if "BTHENUM" not in p.hwid]
8384

84-
return sorted([p.device for p in ports])
85+
return sorted([p.device for p in comports])
8586

8687
@retry(stop=stop_after_attempt(RETRIES), wait=wait_fixed(1), reraise=True) # type: ignore ## retry_error_cls=ConnectionError,
8788
def get_mcu_info(self, timeout: int = 2):

src/mpflash/mpflash/worklist.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def auto_update(
2424
*,
2525
selector: Optional[Dict[str, str]] = None,
2626
) -> WorkList:
27-
"""Builds a list of boards to update based on the connected boards and the firmware available
27+
"""Builds a list of boards to update based on the connected boards and the firmwares available locally in the firmware folder.
2828
2929
Args:
3030
conn_boards (List[MPRemoteBoard]): List of connected boards

src/mpflash/tests/cli/test_cli_flash.py

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def fakeboard(serialport="COM99"):
2727
return fake
2828

2929

30-
def fake_ask_missing_params(params: DownloadParams, action: str = "flash") -> DownloadParams:
30+
def fake_ask_missing_params(params: DownloadParams, action: str) -> DownloadParams:
3131
# no input during tests
3232
return params
3333

@@ -136,3 +136,110 @@ def test_mpflash_connected_boards(
136136
assert result.exit_code == 0
137137
else:
138138
assert result.exit_code == 1
139+
140+
141+
## if no boards are connected , but there are serial port , then set serial --> ? and board to ? if not set
142+
@pytest.mark.parametrize(
143+
"id, serialports, ports, boards",
144+
[
145+
("One", ["COM99"], [], []),
146+
("None", [], [], []),
147+
],
148+
)
149+
def test_mpflash_no_detected_boards(
150+
id,
151+
serialports: List[str],
152+
ports: List[str],
153+
boards: List[str],
154+
mocker: MockerFixture,
155+
):
156+
# no boards specified - detect connected boards
157+
args = ["flash"]
158+
159+
# fakes = [fakeboard(port) for port in serialports]
160+
161+
m_connected_ports_boards = mocker.patch(
162+
"mpflash.cli_flash.connected_ports_boards",
163+
return_value=(ports, boards),
164+
autospec=True,
165+
)
166+
m_flash_list = mocker.patch("mpflash.cli_flash.flash_list", return_value=None, autospec=True)
167+
m_ask_missing_params = mocker.patch(
168+
"mpflash.cli_flash.ask_missing_params",
169+
Mock(side_effect=fake_ask_missing_params),
170+
)
171+
172+
m_full_auto_worklist = mocker.patch("mpflash.cli_flash.full_auto_worklist", return_value=[])
173+
m_manual_worklist = mocker.patch("mpflash.cli_flash.manual_worklist", return_value=[])
174+
m_single_auto_worklist = mocker.patch("mpflash.cli_flash.single_auto_worklist", return_value=[])
175+
176+
runner = CliRunner()
177+
result = runner.invoke(cli_main.cli, args)
178+
179+
m_connected_ports_boards.assert_called_once()
180+
m_ask_missing_params.assert_called_once()
181+
182+
if serialports:
183+
## if no boards are responding , but there are serial port , then set serial --> ? and board to ? if not set
184+
assert m_ask_missing_params.call_args.args[0].serial == "?"
185+
assert m_ask_missing_params.call_args.args[0].boards == ["?"]
186+
187+
188+
# Flash a interactive version
189+
190+
# TEST DOES NOT REALLY ADD ANY VALUE
191+
# @pytest.mark.parametrize(
192+
# "version, serialports, ports, boards",
193+
# [
194+
# ("preview", ["COM99"], ["esp32"], ["ESP32_GENERIC"]),
195+
# ("v1.22.0", ["COM99"], ["esp32"], ["ESP32_GENERIC"]),
196+
# ("1.22.0", ["COM99"], ["esp32"], ["ESP32_GENERIC"]),
197+
# ],
198+
# )
199+
# def test_mpflash_version_interactive(
200+
# version: str,
201+
# serialports: List[str],
202+
# ports: List[str],
203+
# boards: List[str],
204+
# mocker: MockerFixture,
205+
# ):
206+
# # no boards specified - detect connected boards
207+
# def fake_ask_missing_version(params: DownloadParams, action: str) -> DownloadParams:
208+
# # no input during tests
209+
# params.versions = [version]
210+
# return params
211+
212+
# args = ["flash"]
213+
214+
# fakes = [fakeboard(port) for port in serialports]
215+
216+
# m_connected_ports_boards = mocker.patch(
217+
# "mpflash.cli_flash.connected_ports_boards",
218+
# return_value=(ports, boards),
219+
# autospec=True,
220+
# )
221+
# m_flash_list = mocker.patch("mpflash.cli_flash.flash_list", return_value=None, autospec=True)
222+
# m_ask_missing_params = mocker.patch(
223+
# "mpflash.cli_flash.ask_missing_params",
224+
# Mock(side_effect=fake_ask_missing_version),
225+
# )
226+
227+
# # m_full_auto_worklist = mocker.patch("mpflash.cli_flash.full_auto_worklist", return_value=[])
228+
# m_manual_worklist = mocker.patch("mpflash.cli_flash.manual_worklist", return_value=[])
229+
# m_single_auto_worklist = mocker.patch("mpflash.cli_flash.single_auto_worklist", return_value=[])
230+
231+
# runner = CliRunner()
232+
# result = runner.invoke(cli_main.cli, args)
233+
234+
# if serialports:
235+
# # m_full_auto_worklist.assert_called_once()
236+
# m_manual_worklist.assert_not_called()
237+
# m_single_auto_worklist.assert_not_called()
238+
239+
# m_connected_ports_boards.assert_called_once()
240+
# m_ask_missing_params.assert_called_once()
241+
242+
# if serialports:
243+
# assert result.exit_code == 0
244+
# else:
245+
# assert result.exit_code == 1

0 commit comments

Comments
 (0)