micropython-stubber 1.20.4__py3-none-any.whl → 1.20.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.
Files changed (152) hide show
  1. {micropython_stubber-1.20.4.dist-info → micropython_stubber-1.20.6.dist-info}/LICENSE +30 -30
  2. {micropython_stubber-1.20.4.dist-info → micropython_stubber-1.20.6.dist-info}/METADATA +4 -4
  3. micropython_stubber-1.20.6.dist-info/RECORD +159 -0
  4. mpflash/README.md +184 -184
  5. mpflash/libusb_flash.ipynb +203 -203
  6. mpflash/mpflash/add_firmware.py +98 -98
  7. mpflash/mpflash/ask_input.py +236 -226
  8. mpflash/mpflash/bootloader/__init__.py +37 -0
  9. mpflash/mpflash/bootloader/manual.py +102 -0
  10. mpflash/mpflash/bootloader/micropython.py +10 -0
  11. mpflash/mpflash/bootloader/touch1200.py +45 -0
  12. mpflash/mpflash/cli_download.py +129 -128
  13. mpflash/mpflash/cli_flash.py +219 -212
  14. mpflash/mpflash/cli_group.py +98 -92
  15. mpflash/mpflash/cli_list.py +81 -77
  16. mpflash/mpflash/cli_main.py +41 -38
  17. mpflash/mpflash/common.py +164 -151
  18. mpflash/mpflash/config.py +47 -31
  19. mpflash/mpflash/connected.py +74 -74
  20. mpflash/mpflash/download.py +360 -361
  21. mpflash/mpflash/downloaded.py +129 -129
  22. mpflash/mpflash/errors.py +9 -5
  23. mpflash/mpflash/flash.py +52 -69
  24. mpflash/mpflash/flash_esp.py +59 -59
  25. mpflash/mpflash/flash_stm32.py +24 -24
  26. mpflash/mpflash/flash_stm32_cube.py +111 -111
  27. mpflash/mpflash/flash_stm32_dfu.py +101 -101
  28. mpflash/mpflash/flash_uf2.py +67 -67
  29. mpflash/mpflash/flash_uf2_boardid.py +15 -15
  30. mpflash/mpflash/flash_uf2_linux.py +123 -123
  31. mpflash/mpflash/flash_uf2_macos.py +34 -37
  32. mpflash/mpflash/flash_uf2_windows.py +34 -34
  33. mpflash/mpflash/list.py +89 -89
  34. mpflash/mpflash/logger.py +41 -41
  35. mpflash/mpflash/mpboard_id/__init__.py +93 -93
  36. mpflash/mpflash/mpboard_id/add_boards.py +255 -255
  37. mpflash/mpflash/mpboard_id/board.py +37 -37
  38. mpflash/mpflash/mpboard_id/board_id.py +86 -86
  39. mpflash/mpflash/mpboard_id/store.py +43 -43
  40. mpflash/mpflash/mpremoteboard/__init__.py +221 -221
  41. mpflash/mpflash/mpremoteboard/mpy_fw_info.py +141 -141
  42. mpflash/mpflash/mpremoteboard/runner.py +140 -140
  43. mpflash/mpflash/uf2disk.py +12 -12
  44. mpflash/mpflash/vendor/basicgit.py +288 -288
  45. mpflash/mpflash/vendor/click_aliases.py +91 -0
  46. mpflash/mpflash/vendor/dfu.py +165 -165
  47. mpflash/mpflash/vendor/pydfu.py +605 -605
  48. mpflash/mpflash/vendor/readme.md +2 -2
  49. mpflash/mpflash/vendor/versions.py +119 -117
  50. mpflash/mpflash/worklist.py +170 -170
  51. mpflash/poetry.lock +1588 -1623
  52. mpflash/pyproject.toml +60 -60
  53. mpflash/stm32_udev_rules.md +62 -62
  54. stubber/__init__.py +3 -3
  55. stubber/basicgit.py +294 -288
  56. stubber/board/board_info.csv +193 -193
  57. stubber/board/boot.py +34 -34
  58. stubber/board/createstubs.py +986 -987
  59. stubber/board/createstubs_db.py +825 -826
  60. stubber/board/createstubs_db_min.py +331 -331
  61. stubber/board/createstubs_db_mpy.mpy +0 -0
  62. stubber/board/createstubs_lvgl.py +741 -741
  63. stubber/board/createstubs_lvgl_min.py +741 -741
  64. stubber/board/createstubs_mem.py +766 -767
  65. stubber/board/createstubs_mem_min.py +306 -306
  66. stubber/board/createstubs_mem_mpy.mpy +0 -0
  67. stubber/board/createstubs_min.py +294 -294
  68. stubber/board/createstubs_mpy.mpy +0 -0
  69. stubber/board/fw_info.py +141 -141
  70. stubber/board/info.py +183 -183
  71. stubber/board/main.py +19 -19
  72. stubber/board/modulelist.txt +247 -247
  73. stubber/board/pyrightconfig.json +34 -34
  74. stubber/bulk/mcu_stubber.py +454 -455
  75. stubber/codemod/_partials/__init__.py +48 -50
  76. stubber/codemod/_partials/db_main.py +147 -147
  77. stubber/codemod/_partials/lvgl_main.py +77 -77
  78. stubber/codemod/_partials/modules_reader.py +80 -80
  79. stubber/codemod/add_comment.py +53 -53
  80. stubber/codemod/add_method.py +65 -65
  81. stubber/codemod/board.py +317 -317
  82. stubber/codemod/enrich.py +145 -145
  83. stubber/codemod/merge_docstub.py +284 -284
  84. stubber/codemod/modify_list.py +54 -54
  85. stubber/codemod/utils.py +57 -57
  86. stubber/commands/build_cmd.py +94 -94
  87. stubber/commands/cli.py +51 -51
  88. stubber/commands/clone_cmd.py +66 -66
  89. stubber/commands/config_cmd.py +29 -29
  90. stubber/commands/enrich_folder_cmd.py +70 -70
  91. stubber/commands/get_core_cmd.py +69 -69
  92. stubber/commands/get_docstubs_cmd.py +87 -87
  93. stubber/commands/get_frozen_cmd.py +112 -112
  94. stubber/commands/get_mcu_cmd.py +56 -56
  95. stubber/commands/merge_cmd.py +66 -66
  96. stubber/commands/publish_cmd.py +119 -119
  97. stubber/commands/stub_cmd.py +30 -30
  98. stubber/commands/switch_cmd.py +54 -54
  99. stubber/commands/variants_cmd.py +48 -48
  100. stubber/cst_transformer.py +178 -178
  101. stubber/data/board_info.csv +193 -193
  102. stubber/data/board_info.json +1729 -1729
  103. stubber/data/micropython_tags.csv +15 -15
  104. stubber/data/requirements-core-micropython.txt +38 -38
  105. stubber/data/requirements-core-pycopy.txt +39 -39
  106. stubber/downloader.py +36 -36
  107. stubber/freeze/common.py +68 -68
  108. stubber/freeze/freeze_folder.py +69 -69
  109. stubber/freeze/freeze_manifest_2.py +113 -113
  110. stubber/freeze/get_frozen.py +127 -127
  111. stubber/get_cpython.py +101 -101
  112. stubber/get_lobo.py +59 -59
  113. stubber/minify.py +418 -418
  114. stubber/publish/bump.py +86 -86
  115. stubber/publish/candidates.py +262 -283
  116. stubber/publish/database.py +18 -18
  117. stubber/publish/defaults.py +45 -45
  118. stubber/publish/enums.py +24 -30
  119. stubber/publish/helpers.py +29 -29
  120. stubber/publish/merge_docstubs.py +130 -130
  121. stubber/publish/missing_class_methods.py +49 -49
  122. stubber/publish/package.py +146 -177
  123. stubber/publish/pathnames.py +51 -51
  124. stubber/publish/publish.py +120 -121
  125. stubber/publish/pypi.py +38 -38
  126. stubber/publish/stubpackage.py +1029 -1029
  127. stubber/rst/__init__.py +9 -9
  128. stubber/rst/classsort.py +77 -77
  129. stubber/rst/lookup.py +530 -530
  130. stubber/rst/output_dict.py +401 -401
  131. stubber/rst/reader.py +822 -823
  132. stubber/rst/report_return.py +69 -69
  133. stubber/rst/rst_utils.py +540 -540
  134. stubber/stubber.py +38 -38
  135. stubber/stubs_from_docs.py +90 -90
  136. stubber/tools/manifestfile.py +610 -610
  137. stubber/tools/readme.md +5 -5
  138. stubber/update_fallback.py +117 -117
  139. stubber/update_module_list.py +123 -125
  140. stubber/utils/__init__.py +5 -5
  141. stubber/utils/config.py +127 -127
  142. stubber/utils/makeversionhdr.py +54 -54
  143. stubber/utils/manifest.py +92 -92
  144. stubber/utils/post.py +79 -79
  145. stubber/utils/repos.py +157 -154
  146. stubber/utils/stubmaker.py +139 -139
  147. stubber/utils/typed_config_toml.py +77 -77
  148. stubber/utils/versions.py +128 -120
  149. stubber/variants.py +106 -106
  150. micropython_stubber-1.20.4.dist-info/RECORD +0 -154
  151. {micropython_stubber-1.20.4.dist-info → micropython_stubber-1.20.6.dist-info}/WHEEL +0 -0
  152. {micropython_stubber-1.20.4.dist-info → micropython_stubber-1.20.6.dist-info}/entry_points.txt +0 -0
@@ -1,283 +1,262 @@
1
- """
2
- In order to generate stups for all ports and boars and versions of micropython we need to know
3
- what versions are available. This module provides functions to :
4
- - get a list of all ports for a given version of micropython ( list micropython ports)
5
- - get a list of all ports and board for a given version of micropython (list micropython ports boards)
6
-
7
- - get a list of versions for micropython ( version candidates)
8
- - get the frozen stubs for a given version of micropython ( frozen candidates)
9
- - get a list of all the docstubs (docstub candidates)
10
- - get a list of the firmware/MCU stubs (firmware candidates)
11
- """
12
-
13
- import re
14
- from pathlib import Path
15
- from typing import Any, Dict, Generator, List, Optional, Union
16
-
17
- from loguru import logger as log
18
- from packaging.version import parse
19
-
20
- import stubber.basicgit as git
21
- from stubber import utils
22
- from stubber.publish.defaults import GENERIC, GENERIC_L, GENERIC_U
23
- from stubber.publish.enums import COMBO_STUBS, DOC_STUBS, FIRMWARE_STUBS
24
- from stubber.utils.config import CONFIG
25
- from stubber.utils.versions import OLDEST_VERSION, SET_PREVIEW, V_PREVIEW, clean_version, micropython_versions
26
-
27
-
28
- def subfolder_names(path: Path):
29
- "returns a list of names of the sub folders of the given path"
30
- if path.exists():
31
- for child in path.iterdir():
32
- if child.is_dir():
33
- yield child.name
34
-
35
-
36
- def version_candidates(
37
- suffix: str,
38
- prefix: str = r".*",
39
- *,
40
- path: Path = CONFIG.stub_path,
41
- oldest: str = OLDEST_VERSION,
42
- ) -> Generator[str, None, None]:
43
- "get a list of versions for the given family and suffix"
44
- if path.exists():
45
- folder_re = prefix + "-(.*)-" + suffix
46
- for name in subfolder_names(path):
47
- if match := re.match(folder_re, name):
48
- folder_ver = clean_version(match[1])
49
- if folder_ver == V_PREVIEW or parse(folder_ver) >= parse(oldest):
50
- yield folder_ver
51
-
52
-
53
- def list_frozen_ports(
54
- family: str = "micropython",
55
- version: str = V_PREVIEW,
56
- path: Path = CONFIG.stub_path,
57
- ):
58
- "get list of ports with frozen stubs for a given family and version"
59
- ports_path = path / f"{family}-{version}-frozen"
60
- return list(subfolder_names(ports_path))
61
-
62
-
63
- def list_micropython_ports(
64
- family: str = "micropython",
65
- mpy_path: Path = CONFIG.mpy_path,
66
- ):
67
- "get list of micropython ports for a given family and version"
68
- if family != "micropython":
69
- # todo: add support for other families
70
- return []
71
- mpy_path = Path("./repos/micropython")
72
-
73
- ports_path = mpy_path / "ports"
74
- return [p for p in list(subfolder_names(ports_path)) if p not in CONFIG.BLOCKED_PORTS]
75
-
76
-
77
- def list_micropython_port_boards(
78
- port: str,
79
- family: str = "micropython",
80
- mpy_path: Path = CONFIG.mpy_path,
81
- ):
82
- "get list of micropython boards for a given family version and board"
83
- if family != "micropython":
84
- # todo: add support for other families
85
- return []
86
- mpy_path = Path("./repos/micropython")
87
- boards_path = mpy_path / "ports" / port / "boards"
88
- return list(subfolder_names(boards_path))
89
-
90
-
91
- def frozen_candidates(
92
- family: str = "micropython",
93
- versions: Union[str, List[str]] = V_PREVIEW,
94
- ports: Union[str, List[str]] = "all",
95
- boards: Union[str, List[str]] = "all",
96
- *,
97
- path: Path = CONFIG.stub_path,
98
- ) -> Generator[Dict[str, Any], None, None]:
99
- """
100
- generate a list of possible MCU stubs for the given family (, version port and board) ?
101
- - family = micropython
102
- board and port are ignored, they are looked up from the available frozen stubs
103
- - versions = 'latest' , 'auto' or a list of versions
104
- - port = 'auto' or a specific port
105
- - board = 'auto' or a specific board, 'generic' must be specified in lowercare
106
- """
107
- auto_port = is_auto(ports)
108
- auto_board = is_auto(boards)
109
- if is_auto(versions):
110
- versions = list(version_candidates(suffix="frozen", prefix=family, path=path)) + [V_PREVIEW]
111
- else:
112
- versions = [versions] if isinstance(versions, str) else versions
113
-
114
- versions = [clean_version(v, flat=True) for v in versions]
115
-
116
- if isinstance(ports, str):
117
- ports = [ports]
118
- if isinstance(boards, str):
119
- boards = [boards]
120
- # ---------------------------------------------------------------------------
121
- # ---------------------------------------------------------------------------
122
- for version in versions:
123
- if auto_port:
124
- if family == "micropython":
125
- # lookup the (frozen) micropython ports
126
- ports = list_frozen_ports(family, version, path=path)
127
- else:
128
- raise NotImplementedError(f"auto ports not implemented for family {family}") # pragma: no cover
129
- # elif family == "pycom":
130
- # ports = ["esp32"]
131
- # elif family == "lobo":
132
- # ports = ["esp32"]
133
- # ---------------------------------------------------------------------------
134
- for port in ports:
135
- port_path = path / f"{family}-{version}-frozen" / port
136
- if port_path.exists():
137
- yield {
138
- "family": family,
139
- "version": version,
140
- "port": port,
141
- "board": GENERIC_L,
142
- "pkg_type": COMBO_STUBS,
143
- }
144
- # if not auto_board:
145
- # for board in boards:
146
- # port_path = board_path/ "board" / board
147
- # if port_path.exists():
148
- # yield {"family": family, "version": version, "port": port, "board": board, "pkg_type": COMBO_STUBS}
149
- # else: # auto board
150
- if auto_board:
151
- if family == "micropython":
152
- # lookup the (frozen) micropython ports
153
- boards = list(subfolder_names(port_path))
154
- # TODO: remove non-relevant boards
155
- # - release - used in release testing
156
- # generic_512 - small memory footprint
157
- #
158
-
159
- else:
160
- # raise NotImplementedError(f"auto boards not implemented for family {family}") # pragma: no cover
161
- raise NotImplementedError(f"auto boards not implemented for family {family}") # pragma: no cover
162
- # elif family == "pycom":
163
- # boards = ["wipy", "lopy", "gpy", "fipy"]
164
- # ---------------------------------------------------------------------------
165
- for board in boards:
166
- assert isinstance(board, str)
167
- # frozen stubs found, and not excluded, generic is already explicitly included, test builds excluded
168
- # Micropython repo uses CAPS for board names, but micropython-stubs are lowercase
169
- board_found = (path / f"{family}-{version}-frozen" / port / board.upper()).exists()
170
- if board_found and board.upper() not in [
171
- GENERIC_L.upper(),
172
- "RELEASE",
173
- "GENERIC_512K",
174
- ]:
175
- yield {
176
- "family": family,
177
- "version": version,
178
- "port": port,
179
- "board": board,
180
- "pkg_type": COMBO_STUBS,
181
- }
182
-
183
-
184
- def is_auto(thing: Union[None, str, List[str]]):
185
- "Is this version/port/board specified as 'auto' ?"
186
- if isinstance(thing, str):
187
- return thing in ["auto", "all"]
188
- if isinstance(thing, list):
189
- return any(i in ["auto", "all"] for i in thing)
190
-
191
-
192
- def docstub_candidates(
193
- family: str = "micropython",
194
- versions: Union[str, List[str]] = V_PREVIEW,
195
- path: Path = CONFIG.stub_path,
196
- ):
197
- """
198
- Generate a list of possible documentation stub candidates for the given family and version.
199
-
200
- Note that the folders do not need to exist, with the exception of auto which will scan the stubs folder for versions of docstubs
201
- """
202
- if isinstance(versions, str):
203
- if is_auto(versions): # auto with vprefix ...
204
- versions = list(version_candidates(suffix="docstubs", prefix=family, path=path))
205
- else:
206
- versions = [versions]
207
- versions = [clean_version(v, flat=True) for v in versions]
208
-
209
- for version in versions:
210
- yield {"family": family, "version": version, "pkg_type": DOC_STUBS}
211
-
212
-
213
- def board_candidates(
214
- family: str = "micropython",
215
- versions: Union[str, List[str]] = V_PREVIEW,
216
- *,
217
- mpy_path: Path = CONFIG.mpy_path,
218
- pt: str = FIRMWARE_STUBS,
219
- ):
220
- """
221
- generate a list of possible board stub candidates for the given family and version.
222
- list is based on the micropython repo: /ports/<list of ports>/boards/<list of boards>
223
- """
224
- if is_auto(versions):
225
- versions = list(micropython_versions(minver=OLDEST_VERSION))
226
- elif isinstance(versions, str):
227
- versions = [versions]
228
- versions = [clean_version(v, flat=False) for v in versions]
229
-
230
- for version in versions:
231
- # check out the micropython repo for this version
232
- if version in SET_PREVIEW:
233
- r = git.switch_branch(repo=mpy_path, branch="master")
234
- # get the current checked out version
235
- version = utils.checkedout_version(mpy_path)
236
- else:
237
- r = git.checkout_tag(repo=mpy_path, tag=version)
238
- if not r:
239
- log.warning(f"Incorrect version: {version} or did you forget to run `stubber clone` to get the micropython repo?")
240
- return []
241
- ports = list_micropython_ports(family=family, mpy_path=mpy_path)
242
- for port in ports:
243
- # Yield the generic port exactly one time
244
- yield {
245
- "family": family,
246
- "version": version,
247
- "port": port,
248
- "board": GENERIC_U,
249
- "pkg_type": pt,
250
- }
251
- for board in list_micropython_port_boards(family=family, mpy_path=mpy_path, port=port):
252
- if board not in GENERIC:
253
- yield {
254
- "family": family,
255
- "version": version,
256
- "port": port,
257
- "board": board,
258
- "pkg_type": pt,
259
- }
260
-
261
-
262
- def filter_list(
263
- worklist: List[Dict[str, str]],
264
- ports: Optional[Union[List[str], str]] = None,
265
- boards: Optional[Union[List[str], str]] = None,
266
- # versions: Optional[Union[List[str], str]] = None,
267
- ):
268
- """
269
- filter a list of candidates down to the ones we want, based on the ports and boards specified (case insensitive)
270
- for board also match using a 'GENERIC_' prefix, so board 's3' will match candidate 'GENERIC_S3'
271
- """
272
- worklist = [i for i in worklist if i["board"] != ""]
273
- if ports and not is_auto(ports):
274
- ports_ = [i.lower() for i in ports]
275
- worklist = [i for i in worklist if i["port"].lower() in ports_]
276
- if boards and not is_auto(boards):
277
- boards_ = [i.lower() for i in boards]
278
- worklist = [
279
- i
280
- for i in worklist
281
- if i["board"].lower() in boards_ or i["board"].lower().replace("generic_", "") in boards_
282
- ]
283
- return worklist
1
+ """
2
+ In order to generate stups for all ports and boars and versions of micropython we need to know
3
+ what versions are available. This module provides functions to :
4
+ - get a list of all ports for a given version of micropython ( list micropython ports)
5
+ - get a list of all ports and board for a given version of micropython (list micropython ports boards)
6
+
7
+ - get a list of versions for micropython ( version candidates)
8
+ - get the frozen stubs for a given version of micropython ( frozen candidates)
9
+ - get a list of all the docstubs (docstub candidates)
10
+ - get a list of the firmware/MCU stubs (firmware candidates)
11
+ """
12
+
13
+ import re
14
+ from pathlib import Path
15
+ from typing import Any, Dict, Generator, List, Optional, Union
16
+
17
+ from loguru import logger as log
18
+ from packaging.version import parse
19
+
20
+ import stubber.basicgit as git
21
+ from stubber import utils
22
+ from stubber.publish.defaults import GENERIC, GENERIC_L, GENERIC_U
23
+
24
+ # from stubber.publish.enums import COMBO_STUBS
25
+ from stubber.utils.config import CONFIG
26
+ from stubber.utils.versions import OLDEST_VERSION, SET_PREVIEW, V_PREVIEW, clean_version, micropython_versions
27
+
28
+
29
+ def subfolder_names(path: Path):
30
+ "returns a list of names of the sub folders of the given path"
31
+ if path.exists():
32
+ for child in path.iterdir():
33
+ if child.is_dir():
34
+ yield child.name
35
+
36
+
37
+ def version_candidates(
38
+ suffix: str,
39
+ prefix: str = r".*",
40
+ *,
41
+ path: Path = CONFIG.stub_path,
42
+ oldest: str = OLDEST_VERSION,
43
+ ) -> Generator[str, None, None]:
44
+ "get a list of versions for the given family and suffix"
45
+ if path.exists():
46
+ folder_re = prefix + "-(.*)-" + suffix
47
+ for name in subfolder_names(path):
48
+ if match := re.match(folder_re, name):
49
+ folder_ver = clean_version(match[1])
50
+ if folder_ver == V_PREVIEW or parse(folder_ver) >= parse(oldest):
51
+ yield folder_ver
52
+
53
+
54
+ def list_frozen_ports(
55
+ family: str = "micropython",
56
+ version: str = V_PREVIEW,
57
+ path: Path = CONFIG.stub_path,
58
+ ):
59
+ "get list of ports with frozen stubs for a given family and version"
60
+ ports_path = path / f"{family}-{version}-frozen"
61
+ return list(subfolder_names(ports_path))
62
+
63
+
64
+ def list_micropython_ports(
65
+ family: str = "micropython",
66
+ mpy_path: Path = CONFIG.mpy_path,
67
+ ):
68
+ "get list of micropython ports for a given family and version"
69
+ if family != "micropython":
70
+ # todo: add support for other families
71
+ return []
72
+ mpy_path = Path("./repos/micropython")
73
+
74
+ ports_path = mpy_path / "ports"
75
+ return [p for p in list(subfolder_names(ports_path)) if p not in CONFIG.BLOCKED_PORTS]
76
+
77
+
78
+ def list_micropython_port_boards(
79
+ port: str,
80
+ family: str = "micropython",
81
+ mpy_path: Path = CONFIG.mpy_path,
82
+ ):
83
+ "get list of micropython boards for a given family version and board"
84
+ if family != "micropython":
85
+ # todo: add support for other families
86
+ return []
87
+ mpy_path = Path("./repos/micropython")
88
+ boards_path = mpy_path / "ports" / port / "boards"
89
+ return list(subfolder_names(boards_path))
90
+
91
+
92
+ def frozen_candidates(
93
+ family: str = "micropython",
94
+ versions: Union[str, List[str]] = V_PREVIEW,
95
+ ports: Union[str, List[str]] = "all",
96
+ boards: Union[str, List[str]] = "all",
97
+ *,
98
+ path: Path = CONFIG.stub_path,
99
+ ) -> Generator[Dict[str, Any], None, None]:
100
+ """
101
+ generate a list of possible MCU stubs for the given family (, version port and board) ?
102
+ - family = micropython
103
+ board and port are ignored, they are looked up from the available frozen stubs
104
+ - versions = 'latest' , 'auto' or a list of versions
105
+ - port = 'auto' or a specific port
106
+ - board = 'auto' or a specific board, 'generic' must be specified in lowercare
107
+ """
108
+ auto_port = is_auto(ports)
109
+ auto_board = is_auto(boards)
110
+ if is_auto(versions):
111
+ versions = list(version_candidates(suffix="frozen", prefix=family, path=path)) + [V_PREVIEW]
112
+ else:
113
+ versions = [versions] if isinstance(versions, str) else versions
114
+
115
+ versions = [clean_version(v, flat=True) for v in versions]
116
+
117
+ if isinstance(ports, str):
118
+ ports = [ports]
119
+ if isinstance(boards, str):
120
+ boards = [boards]
121
+ # ---------------------------------------------------------------------------
122
+ # ---------------------------------------------------------------------------
123
+ for version in versions:
124
+ if auto_port:
125
+ if family == "micropython":
126
+ # lookup the (frozen) micropython ports
127
+ ports = list_frozen_ports(family, version, path=path)
128
+ else:
129
+ raise NotImplementedError(f"auto ports not implemented for family {family}") # pragma: no cover
130
+ # elif family == "pycom":
131
+ # ports = ["esp32"]
132
+ # elif family == "lobo":
133
+ # ports = ["esp32"]
134
+ # ---------------------------------------------------------------------------
135
+ for port in ports:
136
+ port_path = path / f"{family}-{version}-frozen" / port
137
+ if port_path.exists():
138
+ yield {
139
+ "family": family,
140
+ "version": version,
141
+ "port": port,
142
+ "board": GENERIC_L,
143
+ # "pkg_type": COMBO_STUBS,
144
+ }
145
+ # if not auto_board:
146
+ # for board in boards:
147
+ # port_path = board_path/ "board" / board
148
+ # if port_path.exists():
149
+ # yield {"family": family, "version": version, "port": port, "board": board, "pkg_type": COMBO_STUBS}
150
+ # else: # auto board
151
+ if auto_board:
152
+ if family == "micropython":
153
+ # lookup the (frozen) micropython ports
154
+ boards = list(subfolder_names(port_path))
155
+ # TODO: remove non-relevant boards
156
+ # - release - used in release testing
157
+ # generic_512 - small memory footprint
158
+ #
159
+
160
+ else:
161
+ # raise NotImplementedError(f"auto boards not implemented for family {family}") # pragma: no cover
162
+ raise NotImplementedError(f"auto boards not implemented for family {family}") # pragma: no cover
163
+ # elif family == "pycom":
164
+ # boards = ["wipy", "lopy", "gpy", "fipy"]
165
+ # ---------------------------------------------------------------------------
166
+ for board in boards:
167
+ assert isinstance(board, str)
168
+ # frozen stubs found, and not excluded, generic is already explicitly included, test builds excluded
169
+ # Micropython repo uses CAPS for board names, but micropython-stubs are lowercase
170
+ board_found = (path / f"{family}-{version}-frozen" / port / board.upper()).exists()
171
+ if board_found and board.upper() not in [
172
+ GENERIC_L.upper(),
173
+ "RELEASE",
174
+ "GENERIC_512K",
175
+ ]:
176
+ yield {
177
+ "family": family,
178
+ "version": version,
179
+ "port": port,
180
+ "board": board,
181
+ # "pkg_type": COMBO_STUBS,
182
+ }
183
+
184
+
185
+ def is_auto(thing: Union[None, str, List[str]]):
186
+ "Is this version/port/board specified as 'auto' ?"
187
+ if isinstance(thing, str):
188
+ return thing in ["auto", "all"]
189
+ if isinstance(thing, list):
190
+ return any(i in ["auto", "all"] for i in thing)
191
+
192
+
193
+ def board_candidates(
194
+ family: str = "micropython",
195
+ versions: Union[str, List[str]] = V_PREVIEW,
196
+ *,
197
+ mpy_path: Path = CONFIG.mpy_path,
198
+ ):
199
+ """
200
+ generate a list of possible board stub candidates for the given family and version.
201
+ list is based on the micropython repo: /ports/<list of ports>/boards/<list of boards>
202
+ """
203
+ if is_auto(versions):
204
+ versions = list(micropython_versions(minver=OLDEST_VERSION))
205
+ elif isinstance(versions, str):
206
+ versions = [versions]
207
+ versions = [clean_version(v, flat=False) for v in versions]
208
+
209
+ for version in versions:
210
+ # check out the micropython repo for this version
211
+ if version in SET_PREVIEW:
212
+ r = git.switch_branch(repo=mpy_path, branch="master")
213
+ # get the current checked out version
214
+ version = utils.checkedout_version(mpy_path)
215
+ else:
216
+ r = git.checkout_tag(repo=mpy_path, tag=version)
217
+ if not r:
218
+ log.warning(
219
+ f"Incorrect version: {version} or did you forget to run `stubber clone` to get the micropython repo?"
220
+ )
221
+ return []
222
+ ports = list_micropython_ports(family=family, mpy_path=mpy_path)
223
+ for port in ports:
224
+ # Yield the generic port exactly one time
225
+ yield {
226
+ "family": family,
227
+ "version": version,
228
+ "port": port,
229
+ "board": GENERIC_U,
230
+ }
231
+ for board in list_micropython_port_boards(family=family, mpy_path=mpy_path, port=port):
232
+ if board not in GENERIC:
233
+ yield {
234
+ "family": family,
235
+ "version": version,
236
+ "port": port,
237
+ "board": board,
238
+ }
239
+
240
+
241
+ def filter_list(
242
+ worklist: List[Dict[str, str]],
243
+ ports: Optional[Union[List[str], str]] = None,
244
+ boards: Optional[Union[List[str], str]] = None,
245
+ # versions: Optional[Union[List[str], str]] = None,
246
+ ):
247
+ """
248
+ filter a list of candidates down to the ones we want, based on the ports and boards specified (case insensitive)
249
+ for board also match using a 'GENERIC_' prefix, so board 's3' will match candidate 'GENERIC_S3'
250
+ """
251
+ worklist = [i for i in worklist if i["board"] != ""]
252
+ if ports and not is_auto(ports):
253
+ ports_ = [i.lower() for i in ports]
254
+ worklist = [i for i in worklist if i["port"].lower() in ports_]
255
+ if boards and not is_auto(boards):
256
+ boards_ = [i.lower() for i in boards]
257
+ worklist = [
258
+ i
259
+ for i in worklist
260
+ if i["board"].lower() in boards_ or i["board"].lower().replace("generic_", "") in boards_
261
+ ]
262
+ return worklist
@@ -1,18 +1,18 @@
1
- """basic interface to the json database"""
2
-
3
- from pathlib import Path
4
- from typing import Union
5
-
6
- from pysondb import PysonDB
7
-
8
-
9
- def get_database(publish_path: Union[Path, str], production: bool = False) -> PysonDB:
10
- """
11
- Open the json database at the given path.
12
-
13
- The database should be located in a subfolder `/publish` of the root path.
14
- The database name is determined by the production flag as `package_data[_test].jsondb`
15
- """
16
- publish_path = Path(publish_path)
17
- db_path = publish_path / f"package_data{'' if production else '_test'}.jsondb"
18
- return PysonDB(db_path.as_posix())
1
+ """basic interface to the json database"""
2
+
3
+ from pathlib import Path
4
+ from typing import Union
5
+
6
+ from pysondb import PysonDB
7
+
8
+
9
+ def get_database(publish_path: Union[Path, str], production: bool = False) -> PysonDB:
10
+ """
11
+ Open the json database at the given path.
12
+
13
+ The database should be located in a subfolder `/publish` of the root path.
14
+ The database name is determined by the production flag as `package_data[_test].jsondb`
15
+ """
16
+ publish_path = Path(publish_path)
17
+ db_path = publish_path / f"package_data{'' if production else '_test'}.jsondb"
18
+ return PysonDB(db_path.as_posix())