mpflash 1.26.3__py3-none-any.whl → 1.26.6__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.
@@ -3,6 +3,45 @@ import os
3
3
  import sys
4
4
 
5
5
 
6
+ # our own logging module to avoid dependency on and interfering with logging module
7
+ class logging:
8
+ DEBUG = 10
9
+ INFO = 20
10
+ WARNING = 30
11
+ ERROR = 40
12
+ level = INFO
13
+ prnt = print
14
+
15
+ @staticmethod
16
+ def getLogger(name):
17
+ return logging()
18
+
19
+ @classmethod
20
+ def basicConfig(cls, level):
21
+ cls.level = level
22
+
23
+ def debug(self, msg):
24
+ if self.level <= logging.DEBUG:
25
+ self.prnt("DEBUG :", msg)
26
+
27
+ def info(self, msg):
28
+ if self.level <= logging.INFO:
29
+ self.prnt("INFO :", msg)
30
+
31
+ def warning(self, msg):
32
+ if self.level <= logging.WARNING:
33
+ self.prnt("WARN :", msg)
34
+
35
+ def error(self, msg):
36
+ if self.level <= logging.ERROR:
37
+ self.prnt("ERROR :", msg)
38
+
39
+
40
+ log = logging.getLogger("stubber")
41
+ logging.basicConfig(level=logging.INFO)
42
+ # logging.basicConfig(level=logging.DEBUG)
43
+
44
+
6
45
  def get_build(s):
7
46
  # extract build from sys.version or os.uname().version if available
8
47
  # sys.version: 'MicroPython v1.23.0-preview.6.g3d0b6276f'
@@ -21,74 +60,140 @@ def get_build(s):
21
60
  return b
22
61
 
23
62
 
24
- def _version_str(version: tuple): # -> str:
63
+ def _version_str(version: tuple) -> str:
25
64
  v_str = ".".join([str(n) for n in version[:3]])
26
65
  if len(version) > 3 and version[3]:
27
66
  v_str += "-" + version[3]
28
67
  return v_str
29
68
 
30
69
 
31
- def _info(): # type:() -> dict[str, str]
32
- # sourcery skip: use-contextlib-suppress, use-fstring-for-formatting, use-named-expression
70
+ def _get_base_system_info() -> dict[str, str]:
71
+ """Get basic system implementation details."""
72
+ try:
73
+ fam = sys.implementation[0] # type: ignore
74
+ except TypeError:
75
+ # testing on CPython 3.11
76
+ fam = sys.implementation.name
77
+
33
78
  info = dict(
34
79
  {
35
- "family": sys.implementation[0], # type: ignore
80
+ "family": fam,
36
81
  "version": "",
37
82
  "build": "",
38
83
  "ver": "",
39
- "port": ("stm32" if sys.platform.startswith("pyb") else sys.platform), # port: esp32 / win32 / linux / stm32
40
- "board": "GENERIC",
41
- "_build": "",
84
+ "port": sys.platform, # port: esp32 / win32 / linux / stm32
85
+ "board": "UNKNOWN",
86
+ "board_id": "",
87
+ "variant": "",
42
88
  "cpu": "",
43
89
  "mpy": "",
44
90
  "arch": "",
45
91
  }
46
92
  )
93
+ return info
94
+
95
+
96
+ def _normalize_port_info(info: dict[str, str]) -> None:
97
+ """Normalize port names to be consistent with the repo."""
98
+ if info["port"].startswith("pyb"):
99
+ info["port"] = "stm32"
100
+ elif info["port"] == "win32":
101
+ info["port"] = "windows"
102
+ elif info["port"] == "linux":
103
+ info["port"] = "unix"
104
+
105
+
106
+ def _extract_version_info(info: dict[str, str]) -> None:
107
+ """Extract version information from sys.implementation."""
47
108
  try:
48
- info["version"] = _version_str(sys.implementation.version)
109
+ info["version"] = _version_str(sys.implementation.version) # type: ignore
49
110
  except AttributeError:
50
111
  pass
112
+
113
+
114
+ def get_boardname(info: dict) -> None:
115
+ "Read the board_id from the boardname.py file that may have been created upfront"
116
+ try:
117
+ from boardname import BOARD_ID # type: ignore
118
+
119
+ log.info("Found BOARD_ID: {}".format(BOARD_ID))
120
+ except ImportError:
121
+ log.warning("BOARD_ID not found")
122
+ BOARD_ID = ""
123
+ info["board_id"] = BOARD_ID
124
+ info["board"] = BOARD_ID.split("-")[0] if "-" in BOARD_ID else BOARD_ID
125
+ info["variant"] == BOARD_ID.split("-")[1] if "-" in BOARD_ID else ""
126
+
127
+
128
+ def _extract_hardware_info(info: dict[str, str]) -> None:
129
+ """Extract board, CPU, and machine details."""
51
130
  try:
52
131
  _machine = sys.implementation._machine if "_machine" in dir(sys.implementation) else os.uname().machine # type: ignore
53
132
  info["board"] = _machine.strip()
54
- info["description"] = _machine.strip()
55
133
  si_build = sys.implementation._build if "_build" in dir(sys.implementation) else ""
56
134
  if si_build:
57
135
  info["board"] = si_build.split("-")[0]
58
136
  info["variant"] = si_build.split("-")[1] if "-" in si_build else ""
59
137
  info["board_id"] = si_build
60
- info["cpu"] = _machine.split("with")[-1].strip() if "with" in _machine else ""
138
+ info["cpu"] = _machine.split("with")[-1].strip()
61
139
  info["mpy"] = (
62
- sys.implementation._mpy
140
+ sys.implementation._mpy # type: ignore
63
141
  if "_mpy" in dir(sys.implementation)
64
142
  else sys.implementation.mpy
65
143
  if "mpy" in dir(sys.implementation)
66
- else ""
144
+ else "" # type: ignore
67
145
  )
68
146
  except (AttributeError, IndexError):
69
147
  pass
70
148
 
149
+ if not info["board_id"]:
150
+ get_boardname(info)
151
+
152
+
153
+ def _build(s):
154
+ # extract build from sys.version or os.uname().version if available
155
+ # sys.version: 'MicroPython v1.24.0-preview.6.g3d0b6276f'
156
+ # sys.implementation.version: 'v1.13-103-gb137d064e'
157
+ if not s:
158
+ return ""
159
+ s = s.split(" on ", 1)[0] if " on " in s else s
160
+ if s.startswith("v"):
161
+ if not "-" in s:
162
+ return ""
163
+ b = s.split("-")[1]
164
+ return b
165
+ if not "-preview" in s:
166
+ return ""
167
+ b = s.split("-preview")[1].split(".")[1]
168
+ return b
169
+
170
+
171
+ def _extract_build_info(info: dict[str, str]) -> None:
172
+ """Extract build information from various system sources."""
71
173
  try:
72
- if hasattr(sys, "version"):
73
- info["build"] = get_build(sys.version)
74
- elif hasattr(os, "uname"):
75
- info["build"] = get_build(os.uname()[3]) # type: ignore
174
+ if "uname" in dir(os): # old
175
+ # extract build from uname().version if available
176
+ info["build"] = _build(os.uname()[3]) # type: ignore
76
177
  if not info["build"]:
77
178
  # extract build from uname().release if available
78
- info["build"] = get_build(os.uname()[2]) # type: ignore
79
- except (AttributeError, IndexError):
179
+ info["build"] = _build(os.uname()[2]) # type: ignore
180
+ elif "version" in dir(sys): # new
181
+ # extract build from sys.version if available
182
+ info["build"] = _build(sys.version)
183
+ except (AttributeError, IndexError, TypeError):
80
184
  pass
81
- # avoid build hashes
82
- if info["build"] and len(info["build"]) > 5:
83
- info["build"] = ""
84
185
 
186
+ # Fallback version detection for specific platforms
85
187
  if info["version"] == "" and sys.platform not in ("unix", "win32"):
86
188
  try:
87
189
  u = os.uname() # type: ignore
88
190
  info["version"] = u.release
89
191
  except (IndexError, AttributeError, TypeError):
90
192
  pass
91
- # detect families
193
+
194
+
195
+ def _detect_firmware_family(info: dict[str, str]) -> None:
196
+ """Detect special firmware families (pycopy, pycom, ev3-pybricks)."""
92
197
  for fam_name, mod_name, mod_thing in [
93
198
  ("pycopy", "pycopy", "const"),
94
199
  ("pycom", "pycom", "FAT"),
@@ -105,16 +210,22 @@ def _info(): # type:() -> dict[str, str]
105
210
  if info["family"] == "ev3-pybricks":
106
211
  info["release"] = "2.0.0"
107
212
 
213
+
214
+ def _process_micropython_version(info: dict[str, str]) -> None:
215
+ """Process MicroPython-specific version formatting."""
108
216
  if info["family"] == "micropython":
109
217
  if (
110
218
  info["version"]
111
219
  and info["version"].endswith(".0")
112
- and info["version"] >= "1.10.0" # versions from 1.10.0 to 1.20.0 do not have a micro .0
220
+ and info["version"] >= "1.10.0" # versions from 1.10.0 to 1.24.0 do not have a micro .0
113
221
  and info["version"] <= "1.19.9"
114
222
  ):
115
- # drop the .0 for newer releases
223
+ # versions from 1.10.0 to 1.24.0 do not have a micro .0
116
224
  info["version"] = info["version"][:-2]
117
225
 
226
+
227
+ def _process_mpy_info(info: dict[str, str]) -> None:
228
+ """Process MPY architecture and version information."""
118
229
  # spell-checker: disable
119
230
  if "mpy" in info and info["mpy"]: # mpy on some v1.11+ builds
120
231
  sys_mpy = int(info["mpy"])
@@ -132,20 +243,43 @@ def _info(): # type:() -> dict[str, str]
132
243
  "armv7emdp",
133
244
  "xtensa",
134
245
  "xtensawin",
135
- "hazard3riscv", # assumed
246
+ "rv32imc",
136
247
  ][sys_mpy >> 10]
248
+ if arch:
249
+ info["arch"] = arch
137
250
  except IndexError:
138
- arch = "unknown"
139
- if arch:
140
- info["arch"] = arch
251
+ info["arch"] = "unknown"
141
252
  # .mpy version.minor
142
253
  info["mpy"] = "v{}.{}".format(sys_mpy & 0xFF, sys_mpy >> 8 & 3)
143
- # simple to use version[-build] string avoiding f-strings for backward compat
144
- info["ver"] = (
145
- "v{version}-{build}".format(version=info["version"], build=info["build"])
146
- if info["build"]
147
- else "v{version}".format(version=info["version"])
148
- )
254
+
255
+
256
+ def _format_version_strings(info: dict[str, str]) -> None:
257
+ """Handle final version string formatting."""
258
+ if info["build"] and not info["version"].endswith("-preview"):
259
+ info["version"] = info["version"] + "-preview"
260
+ # simple to use version[-build] string
261
+ info["ver"] = f"{info['version']}-{info['build']}" if info["build"] else f"{info['version']}"
262
+
263
+
264
+ def _info(): # type:() -> dict[str, str]
265
+ """
266
+ Gather comprehensive system information for MicroPython stubbing.
267
+
268
+ Returns a dictionary containing family, version, port, board, and other
269
+ system details needed for stub generation.
270
+ """
271
+ # Get base system information
272
+ info = _get_base_system_info()
273
+
274
+ # Apply transformations and gather additional info
275
+ _normalize_port_info(info)
276
+ _extract_version_info(info)
277
+ _extract_hardware_info(info)
278
+ _extract_build_info(info)
279
+ _detect_firmware_family(info)
280
+ _process_micropython_version(info)
281
+ _process_mpy_info(info)
282
+ _format_version_strings(info)
149
283
 
150
284
  return info
151
285
 
@@ -40,6 +40,7 @@ DEFAULT_IGNORE_TAGS = [
40
40
  "mpremote: rm -r: cannot remove :/ Operation not permitted",
41
41
  ]
42
42
 
43
+
43
44
  def run(
44
45
  cmd: List[str],
45
46
  timeout: int = 60,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mpflash
3
- Version: 1.26.3
3
+ Version: 1.26.6
4
4
  Summary: Flash and download tool for MicroPython firmwares
5
5
  Project-URL: Homepage, https://github.com/Josverl/mpflash
6
6
  Project-URL: Documentation, https://github.com/Josverl/mpflash/blob/main/README.md
@@ -50,14 +50,12 @@ Requires-Dist: tomli-w>=1.2.0
50
50
  Requires-Dist: tomli>=2.2.1
51
51
  Provides-Extra: dev
52
52
  Requires-Dist: ipykernel>=6.29.5; extra == 'dev'
53
- Requires-Dist: pandas>=2.2.3; extra == 'dev'
54
53
  Requires-Dist: tornado>=6.5; extra == 'dev'
55
54
  Provides-Extra: test
56
55
  Requires-Dist: coverage<8.0.0,>=6.4.3; extra == 'test'
57
56
  Requires-Dist: distro>=1.8.0; extra == 'test'
58
57
  Requires-Dist: fasteners>=0.19; extra == 'test'
59
58
  Requires-Dist: mock<6.0.0,>=4.0.3; extra == 'test'
60
- Requires-Dist: pandas>=2.2.3; extra == 'test'
61
59
  Requires-Dist: pytest-cov>=6.0.0; extra == 'test'
62
60
  Requires-Dist: pytest-github-actions-annotate-failures<0.4.0,>=0.1.7; extra == 'test'
63
61
  Requires-Dist: pytest-json-report>=1.5.0; extra == 'test'
@@ -99,6 +97,17 @@ This release includes several new features and improvements:
99
97
  - Restructured mpboard_id to use a SQLite db to be able to ID more boards and variants
100
98
  - vendored and adapted `board_database.py` from mpflash, kudos @mattytrentini
101
99
 
100
+ ## ⚠️ Breaking API Changes (v1.26+)
101
+
102
+ **Important for Library Users**: The worklist module API has been completely refactored with breaking changes.
103
+ Legacy worklist functions have been **removed**.
104
+
105
+ - **Removed Functions**: `auto_update_worklist()`, `manual_worklist()`, `manual_board()`, `single_auto_worklist()`, `full_auto_worklist()`, `filter_boards()`
106
+ - **New API**: Modern interface with `create_worklist()`, `FlashTask` dataclass, and `WorklistConfig` objects
107
+ - **CLI Unchanged**: Command-line interface remains fully compatible
108
+
109
+ See [API Documentation](docs/api-reference.md) for complete migration guide.
110
+
102
111
 
103
112
  ## Features
104
113
  1. List the connected boards including their firmware details, in a tabular or json format
@@ -196,7 +205,26 @@ On Windows this will not be an issue, but on Linux you can use udev rules to gi
196
205
 
197
206
  MPFlash can be used as a library in your own project. mpflash is used in [micropython-stubber]() to download and flash the firmware to the connected boards.
198
207
 
199
- The interface is not well documented other than the code itself, but you can use the following example to get started: - docs/mpflash_api_example.ipynb
208
+ **⚠️ API Changes**: The worklist module API has been completely refactored in v1.25.1+. Legacy functions have been removed. See [API Documentation](docs/api-reference.md) for the new interface.
209
+
210
+ ```python
211
+ # Modern API example
212
+ from mpflash.flash.worklist import create_worklist
213
+ from mpflash.connected import get_connected_comports
214
+
215
+ # Get connected boards and create worklist
216
+ boards = get_connected_comports()
217
+ tasks = create_worklist("1.25.0", connected_comports=boards)
218
+
219
+ # Process tasks
220
+ for task in tasks:
221
+ if task.is_valid:
222
+ print(f"{task.board.serialport} -> {task.firmware_version}")
223
+ ```
224
+
225
+ The interface is documented in:
226
+ - [API Reference](docs/api-reference.md) - Complete programming interface
227
+ - [API Examples](docs/mpflash_api_example.ipynb) - Jupyter notebook with examples
200
228
 
201
229
  ## Detailed usage
202
230
  You can list the connected boards using the following command:
@@ -1,19 +1,19 @@
1
- mpflash/__init__.py,sha256=1CcA1kUb3uUfa9N5O4T4ZQh-Ph0JMFAtBG5IiDIaNVg,201
2
- mpflash/ask_input.py,sha256=YUx65Xwj6dNPwWcbQiWG7U4wDW69zEdno2HcT1KwPBg,8886
3
- mpflash/basicgit.py,sha256=lpGQxL10Mq8D8S56h87aMrBH0vo18ji_hE9v0KJ9P-o,10245
1
+ mpflash/__init__.py,sha256=tToFcmhcOordC-FrA0Jv3bkyApqZaNjIiqebgzF-s2I,53
2
+ mpflash/ask_input.py,sha256=i46g3ZX5YgxnzUIHjv-onHP-4ML9b43e4G-DrL8qgGA,11539
3
+ mpflash/basicgit.py,sha256=lPoxOx_Y6pOVuNZLeO5wqwPnDnrDRfvw1nJLhBOuzis,9743
4
4
  mpflash/cli_add.py,sha256=hI-o-9hAGD3U8cbpXvy9Nuv1KHNTZ6mS57LC4BTBtj8,3495
5
5
  mpflash/cli_download.py,sha256=v5aWJIv1bB5cinGa5BL0nS5vJ97dsFXaLpAaKN0RnrU,3528
6
- mpflash/cli_flash.py,sha256=SekC3goAu9_8UvMRMTEzIiiOK8js1GJRC6ymyA3BQWg,8820
6
+ mpflash/cli_flash.py,sha256=9SLtDqVrzeYNW6GRLnYrd7Uxh8O6rB4WgM58pjY7Q5k,8799
7
7
  mpflash/cli_group.py,sha256=RITn2u1_77jKptapX0Vz3oUriPtGMzLVmjZOtM5SP88,2686
8
8
  mpflash/cli_list.py,sha256=dznrQrWQXvev20ai5AFvz2DFe3MNDR5RIrJmtvQou6A,2693
9
9
  mpflash/cli_main.py,sha256=w5o3swYWDZUnYwIH46hGMCiFdPKVL1-R1YJRM-RSMiY,1496
10
10
  mpflash/common.py,sha256=wO3BjG1wtbfi37wNWPnmLk3jNi7kRUl1vTzgJUOwm9I,6355
11
- mpflash/config.py,sha256=3JIOuKcVIWzV3Y24n6ag_XJpSczMcCbd1fa6FpWGiz8,4143
12
- mpflash/connected.py,sha256=SZvqbnLztJH-DBByjGrWT24S5DGTSevWSwYncH6dFqk,3707
11
+ mpflash/config.py,sha256=52bXcA4rN0l66sup61-NQLs1ZZiXRxY8rxIvLyylT1w,4196
12
+ mpflash/connected.py,sha256=ri6Sl58eZWd-uGs8aiIv4XAgviCxAqSSJD51UQ016UU,3563
13
13
  mpflash/downloaded.py,sha256=xaeMYrTIGj_v4scUBojeJPL-U1kWJG-bdvkvJMbPh4Q,4218
14
14
  mpflash/errors.py,sha256=IAidY3qkZsXy6Pm1rdmVFmGyg81ywHhse3itaPctA2w,247
15
- mpflash/list.py,sha256=IrJa3UBjhHHfStbb9fPVYA8JJzoFTyXtbcKGNRSH8sE,4132
16
- mpflash/logger.py,sha256=h1Ra-uYCVqC2evuDoIoD7GGhTHK-ymkAuqNUsPdZHcI,5212
15
+ mpflash/list.py,sha256=RA6xlP6K2LnZT7jTe3Blud-ANuETHt2-YteHZGKCp8k,4131
16
+ mpflash/logger.py,sha256=B3OOQHexHzOAn-YN1NjZ5R0NugKXl4OuezAdr1xzQ5k,3726
17
17
  mpflash/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  mpflash/versions.py,sha256=HuujLNdMKY_mQXyEqwXVHcU8nbuXeBiWP2TMA5JQhr4,4884
19
19
  mpflash/bootloader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -25,22 +25,23 @@ mpflash/bootloader/touch1200.py,sha256=VND7_YniS9Vx6WEaAxjI72RZZ6WBOwmBTsKJkbuaA
25
25
  mpflash/custom/__init__.py,sha256=l9RU9hRm9j7IuRgacw-gHYjA2Op-5prvRO5yyODhFMQ,5269
26
26
  mpflash/custom/naming.py,sha256=uHQzFIDzuWQUNajeGSUcf_A-o7cxX37kfgXhzpFHNtk,3304
27
27
  mpflash/db/__init__.py,sha256=wnIlO4nOXsPGXMbn2OCqHRsR-hUmtJsko8VdqjH3ZUE,45
28
- mpflash/db/core.py,sha256=PiHpk64pBP-myfacxfVgHo4BvSSvFrtx6LrLgIPMyYY,5286
29
- mpflash/db/gather_boards.py,sha256=fzCT1IGZ53FwkFrTY72ZeXH5klSlm5JFETsDU7lGYf4,4134
30
- mpflash/db/loader.py,sha256=CDlTj2T6w9Ch9s3RHi00E1TbUhjFsgXAsYSQr5kliB0,4889
28
+ mpflash/db/boards_version.txt,sha256=8qTPMyXJDDLrpqktO8UUJcJyfYeH6lZSw425voqPZus,17
29
+ mpflash/db/core.py,sha256=v9BCXsPwjAwO-bRPM304XFqUv9KTLBJF_NXtGRoJgRI,5243
30
+ mpflash/db/gather_boards.py,sha256=C9KL-mdNZw3oukutv_KWFkOJDiFz1mhdShu7lbIpnYs,5494
31
+ mpflash/db/loader.py,sha256=R4pEuXc9jN7v4BMFJKvArnhugniBHsLNZQz6Ijr5W9U,5350
31
32
  mpflash/db/meta.py,sha256=2pFTpFH-1zejGIDp2vs0hbX5rqUONt7B1WIvf8qBx5s,2248
32
- mpflash/db/micropython_boards.zip,sha256=HPYcWaY-lqkuo3Y6yksltNDG5kN4xr0Ghr511G2pALw,18349
33
+ mpflash/db/micropython_boards.zip,sha256=I7BH-me3xb2DJvaTLQr7I5HE19SpzpAm23sRyxflYYo,20833
33
34
  mpflash/db/models.py,sha256=hZrum-nS-TNFaZAksApjxYMBgGKI_kJ-4oFxc8a4WRk,3572
34
35
  mpflash/db/tools.py,sha256=6SEGfshNob4yRQ4h-Cj_xcWMRY28sbA8CWauNXV_uMI,814
35
- mpflash/download/__init__.py,sha256=EQez0Gj70rgrcJDbWEMYlezQyGgD747ipwmB0nt9eUI,9575
36
+ mpflash/download/__init__.py,sha256=3N7cj1To5HqEC2-kGY-jFCwKyrPMrx1SJVTrlqz_7Ow,9420
36
37
  mpflash/download/from_web.py,sha256=PVJDaFfYLJGXlPva5fExh4Yg2H7j3idyJEcfOiVVJBs,7608
37
38
  mpflash/download/fwinfo.py,sha256=XGWOWoJ9cqRVtBAgzVYWCIWaBZpLK595SniXn7bzrRk,1844
38
- mpflash/download/jid.py,sha256=V57M4K0uXXxBYOB4zOKkmXvUvEQdM_-w22LZ-iMIJSE,2344
39
- mpflash/flash/__init__.py,sha256=fkA_3pax9ZLckb14zFxATGk1YWMenpHBlvi66qJCIJA,3433
39
+ mpflash/download/jid.py,sha256=fzCKU2I-iGdxZb7fyVXgXM4be3htQcrDrd3fCgVGZy0,2034
40
+ mpflash/flash/__init__.py,sha256=6RquZPQCUBsdgCAPaddug2tIjLRR3dxp1MhXIqx5_uY,3430
40
41
  mpflash/flash/esp.py,sha256=4977E1hDqJ4-EIkLzwrUtgZuc0ZTD7NvP1PQZgZ2DoU,3227
41
42
  mpflash/flash/stm32.py,sha256=jNgMpJaxUwtJ-v6VU1luD1t41AQprCUeNVCVEovxQe0,595
42
43
  mpflash/flash/stm32_dfu.py,sha256=W-3JsRQyf3DduoIRXDmGZ35RogqtjQgcJnk-GOtQoLE,3090
43
- mpflash/flash/worklist.py,sha256=wf-R9yPsmcE54dnoPA29pEEzNPZI3JwY85V_DB0hXNI,6584
44
+ mpflash/flash/worklist.py,sha256=26cUK_rW5WQOcAnvyl_vcdQcmiHg38rlOw0OwIM5jK0,12538
44
45
  mpflash/flash/uf2/__init__.py,sha256=fCTQLwI8jigzGY0zVWB1XmqyieNFDRHOWky2slZjZEM,4145
45
46
  mpflash/flash/uf2/boardid.py,sha256=U5wGM8VA3wEpUxQCMtuXpMZZomdVH8J_Zd5_GekUMuU,423
46
47
  mpflash/flash/uf2/linux.py,sha256=uTgqyS7C7xfQ25RrTcSUkt-m2u2Ks_o7bPLzIecPoC8,4355
@@ -54,9 +55,9 @@ mpflash/mpboard_id/board_info.json,sha256=A3ZIt38KvAy2NMB5srHorSBd3Q3wOZIXufWiIs
54
55
  mpflash/mpboard_id/board_info.zip,sha256=-2bnQGRsIQuJUfz-7_-GQ8pMWJ1evhCez6yfjhXocNw,23213
55
56
  mpflash/mpboard_id/known.py,sha256=t-oREfW5P5Zue5zbte7WB9e7-mpZBF-NfHGTEUsOVLM,3521
56
57
  mpflash/mpboard_id/resolve.py,sha256=5KCZ0Tcg3FYZ3HK_zux5EguwoSC2E03kCpW2fh4rN2A,779
57
- mpflash/mpremoteboard/__init__.py,sha256=4OIKAry-GeYUSgnEcs5TRb0xea0bstVQCOb28MjLDyk,14210
58
- mpflash/mpremoteboard/mpy_fw_info.py,sha256=ZDEPJN9XJnoG_oeWcLNiLJAD5bkVX2yI_j4K7msUxWM,5196
59
- mpflash/mpremoteboard/runner.py,sha256=4YpL0OA3GRcCvXI47wrj6hJKJZ9uunkdDKDFic2ZM-8,5372
58
+ mpflash/mpremoteboard/__init__.py,sha256=vjFwfa3XKDeugkzMDuswYfeImJm3ptQrYr3tIAY02f0,14301
59
+ mpflash/mpremoteboard/mpy_fw_info.py,sha256=SQGqx6DSDKCtBlsWVhZQD7gGmgmRHA8YP9azO7mqa44,9225
60
+ mpflash/mpremoteboard/runner.py,sha256=4-KmWcktsuQfppGZ8iBfz-ov77Pp8v2dVsBKzcLGUtc,5374
60
61
  mpflash/vendor/board_database.py,sha256=Cb8fEhJaZ2siMkLPW5rPwV9yzBsTtKGOqWUd9TxNgFM,8763
61
62
  mpflash/vendor/click_aliases.py,sha256=adLhqLxNpJEPjSCIRSTkR-QzSgavGFKT0cwRbjxpzRU,5395
62
63
  mpflash/vendor/dfu.py,sha256=6rqGCBS8mTxxaLtkdzJ8O6nc74kFk8jrkmKvxw-x-u8,5693
@@ -64,8 +65,8 @@ mpflash/vendor/pydfu.py,sha256=KD1RHHuhvhWi-l1UB6GyggkxouDKtZgkG4ivRbIfwC4,21264
64
65
  mpflash/vendor/readme.md,sha256=BQ7Uxf8joeYMjTUuSLLBG49ob6a9MgFPIEwuc72-Mfw,415
65
66
  mpflash/vendor/pico-universal-flash-nuke/LICENSE.txt,sha256=Zkc2iTNbib2NCMwtLjMEz0vFCPglgvaw6Mj7QiWldpQ,1484
66
67
  mpflash/vendor/pico-universal-flash-nuke/universal_flash_nuke.uf2,sha256=QuPMppqHMVOt3vDVU0bikHRLsTiDRQYNUcGQ_OLRFGI,28160
67
- mpflash-1.26.3.dist-info/METADATA,sha256=T_PJNISbbh6QLopvV6CosjyXnO94zDJqjibo46havDM,28033
68
- mpflash-1.26.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
69
- mpflash-1.26.3.dist-info/entry_points.txt,sha256=DZ24tsMKlCyTkjWet9vCoq5dcFeY43RKtTsLreQI_R8,53
70
- mpflash-1.26.3.dist-info/licenses/LICENSE,sha256=mWpNhsIxWzetYNnTpr4eb3HtgsxGIC8KcYWxXEcxQvE,1077
71
- mpflash-1.26.3.dist-info/RECORD,,
68
+ mpflash-1.26.6.dist-info/METADATA,sha256=upTvWhN0LfQZoacxMuUJcBd0Kc8WhH8bikqiRW-KGw4,29201
69
+ mpflash-1.26.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
70
+ mpflash-1.26.6.dist-info/entry_points.txt,sha256=DZ24tsMKlCyTkjWet9vCoq5dcFeY43RKtTsLreQI_R8,53
71
+ mpflash-1.26.6.dist-info/licenses/LICENSE,sha256=mWpNhsIxWzetYNnTpr4eb3HtgsxGIC8KcYWxXEcxQvE,1077
72
+ mpflash-1.26.6.dist-info/RECORD,,