mpflash 0.8.1b1__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
@@ -32,8 +34,18 @@ MICROPYTHON_ORG_URL = "https://micropython.org/"
32
34
  # Regexes to remove dates and hashes in the filename that just get in the way
33
35
  RE_DATE = r"(-\d{8}-)"
34
36
  RE_HASH = r"(.g[0-9a-f]+\.)"
35
- # regex to extract the version from the firmware filename
36
- RE_VERSION_PREVIEW = r"(\d+\.\d+(\.\d+)?(-\w+.\d+)?)"
37
+ # regex to extract the version and the build from the firmware filename
38
+ # group 1 is the version, group 2 is the build
39
+ RE_VERSION_PREVIEW = r"v([\d\.]+)-?(?:preview\.)?(\d+)?\."
40
+ # 'RPI_PICO_W-v1.23.uf2'
41
+ # 'RPI_PICO_W-v1.23.0.uf2'
42
+ # 'RPI_PICO_W-v1.23.0-406.uf2'
43
+ # 'RPI_PICO_W-v1.23.0-preview.406.uf2'
44
+ # 'RPI_PICO_W-v1.23.0-preview.4.uf2'
45
+ # 'RPI_PICO_W-v1.23.0.uf2'
46
+ # 'https://micropython.org/resources/firmware/RPI_PICO_W-20240531-v1.24.0-preview.10.gc1a6b95bf.uf2'
47
+ # 'https://micropython.org/resources/firmware/RPI_PICO_W-20240531-v1.24.0-preview.10.uf2'
48
+ # 'RPI_PICO_W-v1.24.0-preview.10.gc1a6b95bf.uf2'
37
49
 
38
50
 
39
51
  # use functools.lru_cache to avoid needing to download pages multiple times
@@ -98,6 +110,7 @@ def board_firmware_urls(board_url: str, base_url: str, ext: str) -> List[str]:
98
110
  # The first run takes ~60 seconds to run for 4 ports , all boards
99
111
  # so it makes sense to cache the results and skip boards as soon as possible
100
112
  def get_boards(ports: List[str], boards: List[str], clean: bool) -> List[FWInfo]:
113
+ # sourcery skip: use-getitem-for-re-match-groups
101
114
  """
102
115
  Retrieves a list of firmware information for the specified ports and boards.
103
116
 
@@ -146,13 +159,15 @@ def get_boards(ports: List[str], boards: List[str], clean: bool) -> List[FWInfo]
146
159
  # board["firmware"] = _url
147
160
  # board["preview"] = "preview" in _url # type: ignore
148
161
  if ver_match := re.search(RE_VERSION_PREVIEW, _url):
149
- fw_info.version = ver_match[1]
162
+ fw_info.version = clean_version(ver_match.group(1))
163
+ fw_info.build = ver_match.group(2) or "0"
164
+ fw_info.preview = fw_info.build != "0"
165
+ # # else:
166
+ # # board.$1= ""
167
+ # if "preview." in fw_info.version:
168
+ # fw_info.build = fw_info.version.split("preview.")[-1]
150
169
  # else:
151
- # board.$1= ""
152
- if "preview." in fw_info.version:
153
- fw_info.build = fw_info.version.split("preview.")[-1]
154
- else:
155
- fw_info.build = "0"
170
+ # fw_info.build = "0"
156
171
 
157
172
  fw_info.ext = Path(fw_info.firmware).suffix
158
173
  fw_info.variant = fw_info.filename.split("-v")[0] if "-v" in fw_info.filename else ""
@@ -180,9 +195,21 @@ def download_firmwares(
180
195
  force: bool = False,
181
196
  clean: bool = True,
182
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
+ """
183
209
  skipped = downloaded = 0
184
- if versions is None:
185
- 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)
186
213
 
187
214
  unique_boards = get_firmware_list(ports, boards, versions, clean)
188
215
 
@@ -191,6 +218,11 @@ def download_firmwares(
191
218
  # relevant
192
219
 
193
220
  log.info(f"Found {len(unique_boards)} relevant unique firmwares")
221
+ if not unique_boards:
222
+ log.error("No relevant firmwares could be found on https://micropython.org/download")
223
+ log.info(f"{versions=} {ports=} {boards=}")
224
+ log.info("Please check the website for the latest firmware files or try the preview version.")
225
+ return 0
194
226
 
195
227
  firmware_folder.mkdir(exist_ok=True)
196
228
 
@@ -214,7 +246,9 @@ def download_firmwares(
214
246
  continue
215
247
  writer.write(board.to_dict())
216
248
  downloaded += 1
217
- 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.")
218
252
  return downloaded + skipped
219
253
 
220
254
 
@@ -238,12 +272,15 @@ def get_firmware_list(ports: List[str], boards: List[str], versions: List[str],
238
272
  board_urls = sorted(get_boards(ports, boards, clean), key=key_fw_ver_pre_ext_bld)
239
273
 
240
274
  log.debug(f"Total {len(board_urls)} firmwares")
275
+
241
276
  relevant = [
242
277
  board
243
278
  for board in board_urls
244
- if board.board in boards and (board.version in versions or board.preview and preview)
245
- # and b["port"] in ["esp32", "rp2"]
279
+ if board.version in versions and board.build == "0" and board.board in boards and not board.preview
246
280
  ]
281
+
282
+ if preview:
283
+ relevant.extend([board for board in board_urls if board.board in boards and board.preview])
247
284
  log.debug(f"Matching firmwares: {len(relevant)}")
248
285
  # select the unique boards
249
286
  unique_boards: List[FWInfo] = []
@@ -272,7 +309,7 @@ def download(
272
309
  boards : The list of boards to download firmware for.
273
310
  versions : The list of versions to download firmware for.
274
311
  force : A flag indicating whether to force the download even if the firmware file already exists.
275
- clean : A flag indicating whether to perform a clean download.
312
+ clean : A flag indicating whether to clean the date from the firmware filename.
276
313
 
277
314
  Returns:
278
315
  int: The number of downloaded firmware files.
@@ -284,7 +321,7 @@ def download(
284
321
  if not boards:
285
322
  log.critical("No boards found, please connect a board or specify boards to download firmware for.")
286
323
  raise MPFlashError("No boards found")
287
- # versions = [clean_version(v, drop_v=True) for v in versions] # remove leading v from version
324
+
288
325
  try:
289
326
  destination.mkdir(exist_ok=True, parents=True)
290
327
  except (PermissionError, FileNotFoundError) as e:
@@ -297,3 +334,28 @@ def download(
297
334
  raise MPFlashError("Could not connect to micropython.org") from e
298
335
 
299
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:
@@ -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.1b1
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,14 +3,14 @@ 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=nz7iE-t_3wxyht0iQbMcc6rx8JOnHjbK3D3lQ13bLnU,11612
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
@@ -24,12 +24,12 @@ mpflash/flash_uf2_macos.py,sha256=HGUg2HSw4qalfSP7npLYgos2WlVRxtOVTDcAnBL7qPY,10
24
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.1b1.dist-info/entry_points.txt,sha256=Jk_visOhYOsZIcSP2Ms9hKqfKy1iorR-6dYltSoWCpY,52
44
- mpflash-0.8.1b1.dist-info/LICENSE,sha256=mWpNhsIxWzetYNnTpr4eb3HtgsxGIC8KcYWxXEcxQvE,1077
45
- mpflash-0.8.1b1.dist-info/METADATA,sha256=TT5lfBjX96EPaD70_I__rVhxVhHprFaQszEbpHn5OYA,15226
46
- mpflash-0.8.1b1.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
47
- mpflash-0.8.1b1.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