mpflash 0.8.1__py3-none-any.whl → 0.8.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
mpflash/cli_group.py CHANGED
@@ -5,8 +5,8 @@ Additional comands are added in the submodules.
5
5
 
6
6
  import rich_click as click
7
7
 
8
- from .config import config
9
- from .logger import make_quiet, set_loglevel
8
+ from .config import __version__, config
9
+ from .logger import log, make_quiet, set_loglevel
10
10
 
11
11
 
12
12
  def cb_verbose(ctx, param, value):
@@ -17,6 +17,7 @@ def cb_verbose(ctx, param, value):
17
17
  set_loglevel("TRACE")
18
18
  else:
19
19
  set_loglevel("DEBUG")
20
+ log.debug(f"version: {__version__}")
20
21
  else:
21
22
  set_loglevel("INFO")
22
23
  config.verbose = False
mpflash/common.py CHANGED
@@ -47,7 +47,7 @@ class FWInfo:
47
47
  firmware: str = field(default="") # url or path to original firmware image
48
48
  variant: str = field(default="") # MicroPython variant
49
49
  preview: bool = field(default=False) # True if the firmware is a preview version
50
- version: str = field(default="") # MicroPython version
50
+ version: str = field(default="") # MicroPython version (NO v prefix)
51
51
  url: str = field(default="") # url to the firmware image download folder
52
52
  build: str = field(default="0") # The build = number of commits since the last release
53
53
  ext: str = field(default="") # the file extension of the firmware
mpflash/config.py CHANGED
@@ -3,9 +3,18 @@
3
3
  from pathlib import Path
4
4
  from typing import List
5
5
 
6
+ import pkg_resources
6
7
  import platformdirs
7
8
 
8
9
 
10
+ def get_version():
11
+ name = __package__ or "mpflash"
12
+ try:
13
+ return pkg_resources.get_distribution(name).version
14
+ except pkg_resources.DistributionNotFound:
15
+ return "Package not found"
16
+
17
+
9
18
  class MPtoolConfig:
10
19
  """Centralized configuration for mpflash"""
11
20
 
@@ -19,3 +28,4 @@ class MPtoolConfig:
19
28
 
20
29
 
21
30
  config = MPtoolConfig()
31
+ __version__ = get_version()
mpflash/download.py CHANGED
@@ -19,8 +19,10 @@ from loguru import logger as log
19
19
  from rich.progress import track
20
20
 
21
21
  from mpflash.common import PORT_FWTYPES, FWInfo
22
+ from mpflash.downloaded import clean_downloaded_firmwares
22
23
  from mpflash.errors import MPFlashError
23
24
  from mpflash.mpboard_id import get_known_ports
25
+ from mpflash.vendor.versions import clean_version
24
26
 
25
27
  # avoid conflict with the ujson used by MicroPython
26
28
  jsonlines.ujson = None # type: ignore
@@ -157,7 +159,7 @@ def get_boards(ports: List[str], boards: List[str], clean: bool) -> List[FWInfo]
157
159
  # board["firmware"] = _url
158
160
  # board["preview"] = "preview" in _url # type: ignore
159
161
  if ver_match := re.search(RE_VERSION_PREVIEW, _url):
160
- fw_info.version = ver_match.group(1)
162
+ fw_info.version = clean_version(ver_match.group(1))
161
163
  fw_info.build = ver_match.group(2) or "0"
162
164
  fw_info.preview = fw_info.build != "0"
163
165
  # # else:
@@ -193,9 +195,21 @@ def download_firmwares(
193
195
  force: bool = False,
194
196
  clean: bool = True,
195
197
  ) -> int:
198
+ """
199
+ Downloads firmware files based on the specified firmware folder, ports, boards, versions, force flag, and clean flag.
200
+
201
+ Args:
202
+ firmware_folder : The folder to save the downloaded firmware files.
203
+ ports : The list of ports to check for firmware.
204
+ boards : The list of boards to download firmware for.
205
+ versions : The list of versions to download firmware for.
206
+ force : A flag indicating whether to force the download even if the firmware file already exists.
207
+ clean : A flag indicating to clean the date from the firmware filename.
208
+ """
196
209
  skipped = downloaded = 0
197
- if versions is None:
198
- versions = []
210
+ versions = [] if versions is None else [clean_version(v) for v in versions]
211
+ # handle renamed boards
212
+ boards = add_renamed_boards(boards)
199
213
 
200
214
  unique_boards = get_firmware_list(ports, boards, versions, clean)
201
215
 
@@ -232,7 +246,9 @@ def download_firmwares(
232
246
  continue
233
247
  writer.write(board.to_dict())
234
248
  downloaded += 1
235
- log.info(f"Downloaded {downloaded} firmwares, skipped {skipped} existing files.")
249
+ if downloaded > 0:
250
+ clean_downloaded_firmwares(firmware_folder)
251
+ log.success(f"Downloaded {downloaded} firmwares, skipped {skipped} existing files.")
236
252
  return downloaded + skipped
237
253
 
238
254
 
@@ -293,7 +309,7 @@ def download(
293
309
  boards : The list of boards to download firmware for.
294
310
  versions : The list of versions to download firmware for.
295
311
  force : A flag indicating whether to force the download even if the firmware file already exists.
296
- clean : A flag indicating whether to perform a clean download.
312
+ clean : A flag indicating whether to clean the date from the firmware filename.
297
313
 
298
314
  Returns:
299
315
  int: The number of downloaded firmware files.
@@ -305,7 +321,7 @@ def download(
305
321
  if not boards:
306
322
  log.critical("No boards found, please connect a board or specify boards to download firmware for.")
307
323
  raise MPFlashError("No boards found")
308
- # versions = [clean_version(v, drop_v=True) for v in versions] # remove leading v from version
324
+
309
325
  try:
310
326
  destination.mkdir(exist_ok=True, parents=True)
311
327
  except (PermissionError, FileNotFoundError) as e:
@@ -318,3 +334,28 @@ def download(
318
334
  raise MPFlashError("Could not connect to micropython.org") from e
319
335
 
320
336
  return result
337
+
338
+
339
+ def add_renamed_boards(boards: List[str]) -> List[str]:
340
+ """
341
+ Adds the renamed boards to the list of boards.
342
+
343
+ Args:
344
+ boards : The list of boards to add the renamed boards to.
345
+
346
+ Returns:
347
+ List[str]: The list of boards with the renamed boards added.
348
+
349
+ """
350
+ renamed = {
351
+ "PICO": ["RPI_PICO"],
352
+ "PICO_W": ["RPI_PICO_W"],
353
+ "GENERIC": ["ESP32_GENERIC", "ESP8266_GENERIC"], # just add both of them
354
+ }
355
+ _boards = boards.copy()
356
+ for board in boards:
357
+ if board in renamed and renamed[board] not in boards:
358
+ _boards.extend(renamed[board])
359
+ if board != board.upper() and board.upper() not in boards:
360
+ _boards.append(board.upper())
361
+ return _boards
mpflash/downloaded.py CHANGED
@@ -24,10 +24,25 @@ def downloaded_firmwares(fw_folder: Path) -> List[FWInfo]:
24
24
  return firmwares
25
25
 
26
26
 
27
+ def clean_downloaded_firmwares(fw_folder: Path) -> None:
28
+ """
29
+ Remove duplicate entries from the firmware.jsonl file, keeping the latest one
30
+ uniqueness is based on the filename
31
+ """
32
+ firmwares = downloaded_firmwares(fw_folder)
33
+ if not firmwares:
34
+ return
35
+ # keep the latest entry
36
+ unique_fw = {fw.filename: fw for fw in firmwares}
37
+ with jsonlines.open(fw_folder / "firmware.jsonl", "w") as writer:
38
+ for fw in unique_fw.values():
39
+ writer.write(fw.to_dict())
40
+ log.info(f"Removed duplicate entries from firmware.jsonl in {fw_folder}")
41
+
27
42
  def find_downloaded_firmware(
28
43
  *,
29
44
  board_id: str,
30
- version: str = "",
45
+ version: str = "", # v1.2.3
31
46
  port: str = "",
32
47
  variants: bool = False,
33
48
  fw_folder: Optional[Path] = None,
@@ -43,16 +58,16 @@ def find_downloaded_firmware(
43
58
  log.error("No firmware files found. Please download the firmware first.")
44
59
  return []
45
60
  # filter by version
46
- version = clean_version(version, drop_v=True)
61
+ version = clean_version(version)
47
62
  fw_list = filter_downloaded_fwlist(fw_list, board_id, version, port, variants, selector)
48
63
 
49
64
  if not fw_list and trie < 3:
50
65
  log.info(f"Try ({trie+1}) to find a firmware for the board {board_id}")
51
66
  if trie == 1:
52
- # ESP board naming conventions have changed by adding a PORT refix
67
+ # ESP board naming conventions have changed by adding a PORT prefix
53
68
  if port.startswith("esp") and not board_id.startswith(port.upper()):
54
69
  board_id = f"{port.upper()}_{board_id}"
55
- # RP2 board naming conventions have changed by adding a _RPIprefix
70
+ # RP2 board naming conventions have changed by adding a _RPI prefix
56
71
  if port == "rp2" and not board_id.startswith("RPI_"):
57
72
  board_id = f"RPI_{board_id}"
58
73
  elif trie == 2:
@@ -75,7 +90,7 @@ def find_downloaded_firmware(
75
90
  def filter_downloaded_fwlist(
76
91
  fw_list: List[FWInfo],
77
92
  board_id: str,
78
- version: str,
93
+ version: str, # v1.2.3
79
94
  port: str,
80
95
  # preview: bool,
81
96
  variants: bool,
@@ -86,7 +101,9 @@ def filter_downloaded_fwlist(
86
101
  # never get a preview for an older version
87
102
  fw_list = [fw for fw in fw_list if fw.preview]
88
103
  else:
89
- fw_list = [fw for fw in fw_list if fw.version == version]
104
+ # FWInfo version has no v1.2.3 prefix
105
+ _version = clean_version(version, drop_v=True)
106
+ fw_list = [fw for fw in fw_list if fw.version == _version]
90
107
 
91
108
  # filter by port
92
109
  if port:
mpflash/flash_uf2.py CHANGED
@@ -14,7 +14,7 @@ from rich.progress import track
14
14
  from mpflash.mpremoteboard import MPRemoteBoard
15
15
 
16
16
  from .common import PORT_FWTYPES
17
- from .config import config
17
+ from .flash_uf2_boardid import get_board_id
18
18
  from .flash_uf2_linux import dismount_uf2_linux, wait_for_UF2_linux
19
19
  from .flash_uf2_macos import wait_for_UF2_macos
20
20
  from .flash_uf2_windows import wait_for_UF2_windows
@@ -45,11 +45,7 @@ def flash_uf2(mcu: MPRemoteBoard, fw_file: Path, erase: bool) -> Optional[MPRemo
45
45
  destination = wait_for_UF2_windows()
46
46
  elif sys.platform == "darwin":
47
47
  log.warning(f"OS {sys.platform} not tested/supported")
48
- # TODO: test which of the options is best
49
- if "macos_uf2" in config.tests:
50
- destination = wait_for_UF2_macos()
51
- else:
52
- destination = wait_for_UF2_linux()
48
+ destination = wait_for_UF2_macos()
53
49
  else:
54
50
  log.warning(f"OS {sys.platform} not tested/supported")
55
51
  return None
@@ -59,6 +55,8 @@ def flash_uf2(mcu: MPRemoteBoard, fw_file: Path, erase: bool) -> Optional[MPRemo
59
55
  return None
60
56
 
61
57
  log.info("Board is in bootloader mode")
58
+ board_id = get_board_id(destination) # type: ignore
59
+ log.info(f"Board ID: {board_id}")
62
60
  log.info(f"Copying {fw_file} to {destination}.")
63
61
  shutil.copy(fw_file, destination)
64
62
  log.success("Done copying, resetting the board and wait for it to restart")
@@ -6,73 +6,32 @@ from __future__ import annotations
6
6
  import sys
7
7
  import time
8
8
  from pathlib import Path
9
+ from typing import Optional
9
10
 
10
11
  from loguru import logger as log
11
12
  from rich.progress import track
12
13
 
13
14
  from .flash_uf2_boardid import get_board_id
14
- from .uf2disk import UF2Disk
15
15
 
16
16
 
17
- def get_uf2_drives():
18
- """
19
- Get a list of all the (un)mounted UF2 drives
20
- """
21
- if sys.platform != "linux":
22
- log.error("pumount only works on Linux")
23
- return
24
- # import blkinfo only on linux
25
- from blkinfo import BlkDiskInfo
26
-
27
- myblkd = BlkDiskInfo()
28
- filters = {
29
- "tran": "usb",
30
- }
31
- usb_disks = myblkd.get_disks(filters)
32
- for disk in usb_disks:
33
- if disk["fstype"] == "vfat":
34
- uf2_part = disk
35
- # unpartioned usb disk or partition (e.g. /dev/sdb )
36
- # SEEED WIO Terminal is unpartioned
37
- # print( json.dumps(uf2_part, indent=4))
38
- uf2 = UF2Disk()
39
- uf2.device_path = "/dev/" + uf2_part["name"]
40
- uf2.label = uf2_part["label"]
41
- uf2.mountpoint = uf2_part["mountpoint"]
42
- yield uf2
43
- elif disk["type"] == "disk" and disk.get("children") and len(disk.get("children")) > 0:
44
- if disk.get("children")[0]["type"] == "part" and disk.get("children")[0]["fstype"] == "vfat":
45
- uf2_part = disk.get("children")[0]
46
- # print( json.dumps(uf2_part, indent=4))
47
- uf2 = UF2Disk()
48
- uf2.device_path = "/dev/" + uf2_part["name"]
49
- uf2.label = uf2_part["label"]
50
- uf2.mountpoint = uf2_part["mountpoint"]
51
- yield uf2
52
-
53
-
54
- def wait_for_UF2_macos(s_max: int = 10):
55
- destination = ""
56
- wait = 10
57
- uf2_drives = []
58
- # while not destination and wait > 0:
17
+ def wait_for_UF2_macos(s_max: int = 10) -> Optional[Path]:
18
+ """Wait for the MCU to mount as a drive"""
19
+ if s_max < 1:
20
+ s_max = 10
21
+ destination = None
59
22
  for _ in track(
60
23
  range(s_max), description="Waiting for mcu to mount as a drive", transient=True, refresh_per_second=2
61
24
  ):
62
- # log.info(f"Waiting for mcu to mount as a drive : {wait} seconds left")
63
- uf2_drives += list(get_uf2_drives())
64
- for drive in get_uf2_drives():
65
- time.sleep(1)
25
+ # log.info(f"Waiting for mcu to mount as a drive : {n} seconds left")
26
+ vol_mounts = Path("/Volumes").iterdir()
27
+ for vol in vol_mounts:
66
28
  try:
67
- if Path(drive.mountpoint, "INFO_UF2.TXT").exists():
68
- board_id = get_board_id(Path(drive.mountpoint)) # type: ignore
69
- destination = Path(drive.mountpoint)
29
+ if Path(vol, "INFO_UF2.TXT").exists():
30
+ destination = Path(vol)
70
31
  break
71
- except PermissionError:
72
- log.debug(f"Permission error on {drive.mountpoint}")
73
- continue
32
+ except OSError:
33
+ pass
74
34
  if destination:
75
35
  break
76
36
  time.sleep(1)
77
- wait -= 1
78
37
  return destination
@@ -5,25 +5,25 @@ from __future__ import annotations
5
5
 
6
6
  import time
7
7
  from pathlib import Path
8
+ from typing import Optional
8
9
 
9
10
  import psutil
10
11
  from rich.progress import track
11
12
 
12
- from .flash_uf2_boardid import get_board_id
13
13
 
14
14
 
15
- def wait_for_UF2_windows(s_max: int = 10):
15
+
16
+ def wait_for_UF2_windows(s_max: int = 10) -> Optional[Path]:
16
17
  """Wait for the MCU to mount as a drive"""
17
18
  if s_max < 1:
18
19
  s_max = 10
19
- destination = ""
20
+ destination = None
20
21
  for _ in track(range(s_max), description="Waiting for mcu to mount as a drive", transient=True,refresh_per_second=2):
21
22
  # log.info(f"Waiting for mcu to mount as a drive : {n} seconds left")
22
23
  drives = [drive.device for drive in psutil.disk_partitions()]
23
24
  for drive in drives:
24
25
  try:
25
26
  if Path(drive, "INFO_UF2.TXT").exists():
26
- board_id = get_board_id(Path(drive)) # type: ignore
27
27
  destination = Path(drive)
28
28
  break
29
29
  except OSError:
@@ -77,10 +77,14 @@ def known_stored_boards(port: str, versions: Optional[List[str]] = None) -> List
77
77
  @lru_cache(maxsize=20)
78
78
  def find_known_board(board_id: str) -> Board:
79
79
  """Find the board for the given BOARD_ID or 'board description' and return the board info as a Board object"""
80
+ # FIXME : functional overlap with:
81
+ # mpboard_id\board_id.py _find_board_id_by_description
80
82
  info = read_known_boardinfo()
81
83
  for board_info in info:
82
84
  if board_id in (board_info.board_id, board_info.description):
83
85
  if not board_info.cpu:
86
+ # safeguard for older board_info.json files
87
+ print(f"Board {board_id} has no CPU info, using port as CPU")
84
88
  if " with " in board_info.description:
85
89
  board_info.cpu = board_info.description.split(" with ")[-1]
86
90
  else:
@@ -44,7 +44,23 @@ def _find_board_id_by_description(
44
44
  """
45
45
  Find the MicroPython BOARD_ID based on the description in the firmware
46
46
  using the pre-built board_info.json file
47
+
48
+ Parameters:
49
+ descr: str
50
+ Description of the board
51
+ short_descr: str
52
+ Short description of the board (optional)
53
+ version: str
54
+ Version of the MicroPython firmware
55
+ board_info: Path
56
+ Path to the board_info.json file (optional)
57
+
47
58
  """
59
+ # FIXME: functional overlap with
60
+ # src\mpflash\mpflash\mpboard_id\__init__.py find_known_board
61
+
62
+ if not short_descr and " with " in descr:
63
+ short_descr = descr.split(" with ")[0]
48
64
 
49
65
  candidate_boards = read_known_boardinfo(board_info)
50
66
 
@@ -58,10 +74,10 @@ def _find_board_id_by_description(
58
74
  # FIXME if latest stable is newer than the last version in the boardlist this will fail
59
75
  log.trace(f"Version {version} not found in board info, using latest known version {known_versions[-1]}")
60
76
  version = known_versions[-1]
61
- version_matches = [b for b in candidate_boards if b.version.startswith(version)]
62
- if not version_matches:
77
+ if version_matches := [b for b in candidate_boards if b.version.startswith(version)]:
78
+ candidate_boards = version_matches
79
+ else:
63
80
  raise MPFlashError(f"No board info found for version {version}")
64
- candidate_boards = version_matches
65
81
  matches = [b for b in candidate_boards if b.description == descr]
66
82
  if not matches and short_descr:
67
83
  matches = [b for b in candidate_boards if b.description == short_descr]
@@ -13,10 +13,11 @@ HERE = Path(__file__).parent
13
13
 
14
14
 
15
15
  def write_boardinfo_json(board_list: List[Board], *, folder: Path):
16
- """Writes the board information to JSON and CSV files.
16
+ """Writes the board information to a JSON file.
17
17
 
18
18
  Args:
19
19
  board_list (List[Board]): The list of Board objects.
20
+ folder (Path): The folder where the compressed JSON file will be saved.
20
21
  """
21
22
  import zipfile
22
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mpflash
3
- Version: 0.8.1
3
+ Version: 0.8.2
4
4
  Summary: Flash and download tool for MicroPython firmwares
5
5
  Home-page: https://github.com/Josverl/micropython-stubber/blob/main/src/mpflash/README.md
6
6
  License: MIT
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.9
14
14
  Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
16
17
  Classifier: Programming Language :: Python :: Implementation :: CPython
17
18
  Classifier: Programming Language :: Python :: Implementation :: MicroPython
18
19
  Classifier: Topic :: Software Development :: Build Tools
@@ -3,33 +3,33 @@ mpflash/add_firmware.py,sha256=u_g9mID557fptLEJ1Nld9n27V1R1og8uEkadm0O3YTw,3435
3
3
  mpflash/ask_input.py,sha256=e54WfgktG7Ff8dBUknXioROq3lPNZ-eacUjfmUvFfS0,8496
4
4
  mpflash/cli_download.py,sha256=6ctC4ga6q2LcpHUHMrz1trbePziQpuIFPbjcJnc3K7E,3645
5
5
  mpflash/cli_flash.py,sha256=QHEb-e2ABjISfuGCWpTxOM7kkcTZSQxBXmVaWh3WVnE,7074
6
- mpflash/cli_group.py,sha256=-qkR4ou7bmIwfDIzyL1s34z6ya1wckKtL22nanvyQGU,1974
6
+ mpflash/cli_group.py,sha256=nrihkm74X8pX1jPM72W8ljoc5rYL6ggGOQFRaOldhLo,2038
7
7
  mpflash/cli_list.py,sha256=Mdaf13gKZCoLp8Y2ja0L5rYMzkE_t3d4r62bF7isI3E,1997
8
8
  mpflash/cli_main.py,sha256=yABFFf45TpPMcC1qEVARAWe4EI9zui2pUXjoPms0mq8,1030
9
- mpflash/common.py,sha256=kanbO22SQDWb4ASQG8vLF0Z83ahujKPbrsCw3llN5T4,5594
10
- mpflash/config.py,sha256=hBc1Hf4XQ0YIoeiPBbannnqDg0C7226Y7Vu8o4jUkBQ,495
9
+ mpflash/common.py,sha256=MmyLadb_z7bhVy6U8jb4f3pnBK8n7x28smFBcA9ZfGg,5608
10
+ mpflash/config.py,sha256=R7PomStIFHSTnLhpWhw9P2DL_b-8a8Wrja3aY-dPm6A,762
11
11
  mpflash/connected.py,sha256=CBG_DJ33OPWAPbX-ICQpL1LcFOhNYpLUSB0Q5v7gi9s,3029
12
- mpflash/download.py,sha256=YChMbPNUYD8r7VojVMx2P7Qjf4o5f1Bbu240qR-z934,12693
13
- mpflash/downloaded.py,sha256=IYMyx_67paKFSKOg3whgwsWf8IlHaLgpmSlukMT7V9Q,3804
12
+ mpflash/download.py,sha256=NErA2SJEhXnTElvq6z4BJl-L-5M_ETJpqX6pM0oubsg,14290
13
+ mpflash/downloaded.py,sha256=lxwRP-7gE9TO23jKG5Ov6TCsRA1kM8rzZEdceA163Uk,4520
14
14
  mpflash/errors.py,sha256=Q5LR12Wo8iUCg5n_qq4GjdBdBflbvCOdKsRJ5InYRfI,96
15
15
  mpflash/flash.py,sha256=JoskuwaHVYqeG4YW8kgbv26vPFnqDmkTz1VRs-pTRiY,2468
16
16
  mpflash/flash_esp.py,sha256=dEc_B7-f1BMUGBMrwIm83ulcCqaS5MlrPAp3FCNgNfk,2311
17
17
  mpflash/flash_stm32.py,sha256=d4BoQl3a9Tchnvn2ZTuq2MpYBB4MTaRukwtEncI95k0,823
18
18
  mpflash/flash_stm32_cube.py,sha256=w7aGWjReeWUKl0Q3ZjXH8BRqNO1Tk9AO7gtRNUg1c9Y,3970
19
19
  mpflash/flash_stm32_dfu.py,sha256=G70EZodWb-aRi507Jxbys-VEwbBGU1oZacow3_nq-d4,2972
20
- mpflash/flash_uf2.py,sha256=FFO2zpKFPdpEDi4aK1-JFsvPi8KEKLXXuOt_lXtI9tk,2508
20
+ mpflash/flash_uf2.py,sha256=2IKgEOnlsB9bILJWHILMKbGo9b39NKazBWp1-T_eKKs,2463
21
21
  mpflash/flash_uf2_boardid.py,sha256=WZKucGu_hJ8ymb236uuZbiR6pD6AA_l4LA-7LwtQhq8,414
22
22
  mpflash/flash_uf2_linux.py,sha256=Oy9V4g7JSuks2hHFeO_OHdBKSGktbqZOtsivuxfl-xg,4055
23
- mpflash/flash_uf2_macos.py,sha256=JButLjccuKlVyArwNkHDGjNMB_9ezyTKlbCWNia-R5Y,2696
24
- mpflash/flash_uf2_windows.py,sha256=94YoO2UIzfyJs4CPJ9sjG_WY26SX8aUPl9mf9R9W5xk,1093
23
+ mpflash/flash_uf2_macos.py,sha256=HGUg2HSw4qalfSP7npLYgos2WlVRxtOVTDcAnBL7qPY,1078
24
+ mpflash/flash_uf2_windows.py,sha256=a-iIGPkwIoUXA7atCz0_uZp-kipSL24P-IE5ka1B1Mk,1025
25
25
  mpflash/list.py,sha256=0TawTkwhjKPPj7nTHoDn8nQ54WOkGRurP1BJVeg956g,2963
26
26
  mpflash/logger.py,sha256=dI_H_a7EOdQJyvoeRHQuYeZuTKYVUS3DUPTLhE9rkdM,1098
27
- mpflash/mpboard_id/__init__.py,sha256=QRLVUpeiXeiY3P-im2Bv8zX8xGS_MIqiH-3svuVoWyY,3576
27
+ mpflash/mpboard_id/__init__.py,sha256=9IS8E-4eimd_bclgGgWE1wGEx0IRzKnu5Jzl8pQih_g,3816
28
28
  mpflash/mpboard_id/add_boards.py,sha256=OWclyLWf9L-pCVmZ22b-xQYfvi3yQVsJHmGMgMzWxoU,9684
29
29
  mpflash/mpboard_id/board.py,sha256=CwtBux8y7GDUe7CADVxL8YefGRl9Fg8OAJBUhgaBYCI,1151
30
- mpflash/mpboard_id/board_id.py,sha256=63K91S_KWdSL5vHkZhpU-ibOhpOrUt0YPwxDsUBEmnc,2489
30
+ mpflash/mpboard_id/board_id.py,sha256=uVBbqksE1S4RPO1kNAVk4-xJWj6vwAX6QeuE0ekkZEc,2964
31
31
  mpflash/mpboard_id/board_info.zip,sha256=F6YowS96DAqjten4ySe4MXgZwPtE-saZOUfY5OQkqKk,19759
32
- mpflash/mpboard_id/store.py,sha256=hhNTPlraQYH_Tx3syoi_NBx8z13efkgXn433OZ2GjpU,1462
32
+ mpflash/mpboard_id/store.py,sha256=4lLEff6a30lIOb4fOYYzanE4G4qfgikfprmpV1eUf2U,1536
33
33
  mpflash/mpremoteboard/__init__.py,sha256=fJ_N1F6R3CfP9F7pmocb5l8yRvzmSmtHi4u_uTQHR1w,7683
34
34
  mpflash/mpremoteboard/mpy_fw_info.py,sha256=6AQbN3jtQgllqWQYl4e-63KeEtV08EXk8_JnM6XBkvo,4554
35
35
  mpflash/mpremoteboard/runner.py,sha256=-PgzAeBGbyXaAUlwyiw4mcINsP2U1XRRjP1_QdBrxpg,4786
@@ -40,8 +40,8 @@ mpflash/vendor/pydfu.py,sha256=_MdBRo1EeNeKDqFPSTB5tNL1jGSBJgsVeVjE5e7Pb8s,20542
40
40
  mpflash/vendor/readme.md,sha256=iIIZxuLUIGHQ0KODzYVtMezsztvyxCXcNJp_AzwTIPk,86
41
41
  mpflash/vendor/versions.py,sha256=thk1a5wEEhXIQoL0zZ7oooeFyQeSoI00CIUbZF0b3rI,3783
42
42
  mpflash/worklist.py,sha256=MKHDynttVP3lsHSfb7DEqeQ2mRV0da96lD4lIcS_zQY,5962
43
- mpflash-0.8.1.dist-info/entry_points.txt,sha256=Jk_visOhYOsZIcSP2Ms9hKqfKy1iorR-6dYltSoWCpY,52
44
- mpflash-0.8.1.dist-info/LICENSE,sha256=mWpNhsIxWzetYNnTpr4eb3HtgsxGIC8KcYWxXEcxQvE,1077
45
- mpflash-0.8.1.dist-info/METADATA,sha256=T5fzthDNNXRngdgaxn_PMkoo4-y-e4j8b1zXZP0pG4o,15224
46
- mpflash-0.8.1.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
47
- mpflash-0.8.1.dist-info/RECORD,,
43
+ mpflash-0.8.2.dist-info/entry_points.txt,sha256=Jk_visOhYOsZIcSP2Ms9hKqfKy1iorR-6dYltSoWCpY,52
44
+ mpflash-0.8.2.dist-info/LICENSE,sha256=mWpNhsIxWzetYNnTpr4eb3HtgsxGIC8KcYWxXEcxQvE,1077
45
+ mpflash-0.8.2.dist-info/METADATA,sha256=N1kDSCr4LilmXiMUdcs190wEJgNm_X8Vshh5D4GCRLo,15275
46
+ mpflash-0.8.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
47
+ mpflash-0.8.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.7.0
2
+ Generator: poetry-core 1.9.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any