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,255 +1,255 @@
1
- """
2
- Collects board name and description information from MicroPython and writes it to JSON and CSV files.
3
- """
4
-
5
- import re
6
- from pathlib import Path
7
- from typing import List, Optional
8
-
9
- import inquirer
10
- import rich
11
- import rich.table
12
- from rich.console import Console
13
- from rich.progress import track
14
-
15
- import mpflash.vendor.basicgit as git
16
- from mpflash.logger import log
17
- from mpflash.mpboard_id import Board
18
- from mpflash.mpboard_id.store import write_boardinfo_json
19
- from mpflash.vendor.versions import micropython_versions
20
-
21
- # look for all mpconfigboard.h files and extract the board name
22
- # from the #define MICROPY_HW_BOARD_NAME "PYBD_SF6"
23
- # and the #define MICROPY_HW_MCU_NAME "STM32F767xx"
24
- RE_H_MICROPY_HW_BOARD_NAME = re.compile(r"#define\s+MICROPY_HW_BOARD_NAME\s+\"(.+)\"")
25
- RE_H_MICROPY_HW_MCU_NAME = re.compile(r"#define\s+MICROPY_HW_MCU_NAME\s+\"(.+)\"")
26
- # find in the mpconfigboard.cmake files
27
-
28
- RE_CMAKE_MICROPY_HW_BOARD_NAME = re.compile(r"MICROPY_HW_BOARD_NAME\s?=\s?\"(?P<variant>[\w\s\S]*)\"")
29
- RE_CMAKE_MICROPY_HW_MCU_NAME = re.compile(r"MICROPY_HW_MCU_NAME\s?=\s?\"(?P<variant>[\w\s\S]*)\"")
30
- # TODO: normal make files
31
-
32
-
33
- def boards_from_repo(mpy_path: Path, version: str, family: Optional[str] = None) -> List[Board]:
34
- """Collects board name and decriptions from mpconfigboard.h files.
35
-
36
- Args:
37
- mpy_path (Path): The path to the MicroPython repository.
38
- version (str): The version of MicroPython.
39
-
40
- Returns:
41
- List[Board]: A list of Board objects containing the board information.
42
- """
43
- if not mpy_path.exists() or not mpy_path.is_dir():
44
- raise FileNotFoundError(f"MicroPython path {mpy_path} does not exist.")
45
- if not family:
46
- family = "micropython"
47
- if not version:
48
- version = git.get_local_tag() # type: ignore
49
- if not version:
50
- raise ValueError("No version provided and no local tag found.")
51
-
52
- board_list: List[Board] = []
53
- # look in mpconfigboard.h files
54
- board_list = boards_from_cmake(mpy_path, version, family)
55
-
56
- # look for variants in the .cmake files
57
- board_list.extend(boards_from_headers(mpy_path, version, family))
58
- # TODO:? look for variants in the Makefile files
59
-
60
- return board_list
61
-
62
-
63
- def boards_from_cmake(mpy_path: Path, version: str, family: str):
64
- """Get boards from the mpconfigboard.cmake files to the board_list."""
65
- board_list = []
66
- for path in mpy_path.glob("ports/**/mpconfigboard.cmake"):
67
- board = path.parent.name
68
- port = path.parent.parent.parent.name
69
- with open(path, "r") as f:
70
- board_name = mcu_name = "-"
71
- for line in f:
72
- line = line.strip()
73
- if match := RE_CMAKE_MICROPY_HW_BOARD_NAME.match(line):
74
- description = match["variant"]
75
- board_list.append(
76
- Board(
77
- board_id=board,
78
- port=port,
79
- board_name=board_name,
80
- mcu_name=mcu_name,
81
- description=description,
82
- path=path.relative_to(mpy_path),
83
- version=version,
84
- family=family,
85
- )
86
- )
87
- elif match := RE_CMAKE_MICROPY_HW_MCU_NAME.match(line):
88
- description = match["variant"]
89
- board_list.append(
90
- Board(
91
- board_id=board,
92
- port=port,
93
- board_name=board_name,
94
- mcu_name=mcu_name,
95
- description=description,
96
- path=path.relative_to(mpy_path),
97
- version=version,
98
- family=family,
99
- )
100
- )
101
- return board_list
102
-
103
-
104
- def boards_from_headers(mpy_path: Path, version: str, family: str):
105
- """Get boards from the mpconfigboard.h files to the board_list."""
106
- board_list = []
107
- for path in mpy_path.glob("ports/**/mpconfigboard.h"):
108
- board = path.parent.name
109
- port = path.parent.parent.parent.name
110
- with open(path, "r") as f:
111
- board_name = mcu_name = "-"
112
- found = 0
113
- for line in f:
114
- if match := RE_H_MICROPY_HW_BOARD_NAME.match(line):
115
- board_name = match[1]
116
- found += 1
117
- elif match := RE_H_MICROPY_HW_MCU_NAME.match(line):
118
- mcu_name = match[1]
119
- found += 1
120
- if found == 2:
121
- description = f"{board_name} with {mcu_name}" if mcu_name != "-" else board_name
122
- board_list.append(
123
- Board(
124
- board_id=board,
125
- port=port,
126
- board_name=board_name,
127
- mcu_name=mcu_name,
128
- description=description,
129
- path=path.relative_to(mpy_path),
130
- version=version,
131
- family=family,
132
- )
133
- )
134
- found = 0
135
- if found == 1:
136
- description = board_name
137
- board_list.append(
138
- Board(
139
- board_id=board,
140
- port=port,
141
- board_name=board_name,
142
- mcu_name=mcu_name,
143
- description=description,
144
- path=path.relative_to(mpy_path),
145
- version=version,
146
- family=family,
147
- )
148
- )
149
- return board_list
150
-
151
-
152
- def boards_for_versions(versions: List[str], mpy_path: Path):
153
- """Gets the list of boards for multiple versions of MicroPython.
154
-
155
- Args:
156
- versions (List[str]): The list of MicroPython versions.
157
- mpy_path (Path): The path to the MicroPython repository.
158
-
159
- Returns:
160
- List[Board]: The list of Board objects.
161
- """
162
- board_list: List[Board] = []
163
- for version in track(versions, description="Searching MicroPython versions"):
164
- if git.checkout_tag(tag=version, repo=mpy_path):
165
- new_ones = boards_from_repo(mpy_path, version, family="micropython")
166
- print(f"Found {len(new_ones)} board definitions for {version}.")
167
- board_list += new_ones
168
- else:
169
- print(f"Could not checkout version {version}.")
170
-
171
- # sort the board_list by description and board
172
- print("Total number of boards found:", len(board_list))
173
-
174
- board_list = unique_boards(board_list)
175
- print("Unique board descriptions found:", len(board_list))
176
- return board_list
177
-
178
-
179
- def unique_boards(board_list: List[Board], *, key_version: bool = True):
180
- """Remove duplicate boards by 'BOARD_ID description' from the list."""
181
- seen = set()
182
- result = []
183
- for x in board_list:
184
- if key_version:
185
- key = f"{x.board_id}|{x.version}|{x.description}"
186
- else:
187
- key = f"{x.board_id}|{x.description}"
188
- if key not in seen:
189
- result.append(x)
190
- seen.add(key)
191
- result.sort(key=lambda x: x.description.lower())
192
- return result
193
-
194
-
195
- def make_table(board_list: List[Board]) -> rich.table.Table:
196
- """Creates a rich table with board information."""
197
- is_wide = True
198
-
199
- table = rich.table.Table(title="MicroPython Board Information")
200
- table.add_column("BOARD_ID", justify="left", style="green")
201
- table.add_column("Description", justify="left", style="cyan")
202
- table.add_column("Port", justify="left", style="magenta")
203
- table.add_column("Board Name", justify="left", style="blue")
204
- if is_wide:
205
- table.add_column("MCU Name", justify="left", style="blue")
206
- table.add_column("Detection", justify="left", style="yellow")
207
- table.add_column("Version", justify="left", style="blue")
208
- if is_wide:
209
- table.add_column("Family", justify="left", style="blue")
210
-
211
- for board in board_list:
212
- row = [board.board_id, board.description, *(board.port, board.board_name)]
213
- if is_wide:
214
- row.append(board.mcu_name)
215
- row.extend((str(Path(board.path).suffix), board.version))
216
- if is_wide:
217
- row.append(board.family)
218
- table.add_row(*row)
219
-
220
- return table
221
-
222
-
223
- def ask_mpy_path():
224
- """Ask the user for the path to the MicroPython repository."""
225
- questions = [
226
- inquirer.Text(
227
- "mpy_path", message="Enter the path to the MicroPython repository", default=".\\repos\\micropython"
228
- )
229
- ]
230
- if answers := inquirer.prompt(questions):
231
- return Path(answers["mpy_path"])
232
- else:
233
- raise ValueError("No path provided.")
234
-
235
-
236
- def main():
237
- """Main function to collect and write board information."""
238
-
239
- console = Console()
240
-
241
- mpy_path = ask_mpy_path()
242
- versions = micropython_versions(minver="v1.10") + ["master"]
243
- board_list = boards_for_versions(versions, mpy_path)
244
-
245
- here = Path(__file__).parent
246
- log.info(write_boardinfo_json(board_list, folder=here))
247
- # write_files(board_list, folder=CONFIG.board_path)
248
-
249
- # table of when the board was added
250
- table = make_table(unique_boards(board_list, key_version=False))
251
- console.print(table)
252
-
253
-
254
- if __name__ == "__main__":
255
- main()
1
+ """
2
+ Collects board name and description information from MicroPython and writes it to JSON and CSV files.
3
+ """
4
+
5
+ import re
6
+ from pathlib import Path
7
+ from typing import List, Optional
8
+
9
+ import inquirer
10
+ import rich
11
+ import rich.table
12
+ from rich.console import Console
13
+ from rich.progress import track
14
+
15
+ import mpflash.vendor.basicgit as git
16
+ from mpflash.logger import log
17
+ from mpflash.mpboard_id import Board
18
+ from mpflash.mpboard_id.store import write_boardinfo_json
19
+ from mpflash.vendor.versions import micropython_versions
20
+
21
+ # look for all mpconfigboard.h files and extract the board name
22
+ # from the #define MICROPY_HW_BOARD_NAME "PYBD_SF6"
23
+ # and the #define MICROPY_HW_MCU_NAME "STM32F767xx"
24
+ RE_H_MICROPY_HW_BOARD_NAME = re.compile(r"#define\s+MICROPY_HW_BOARD_NAME\s+\"(.+)\"")
25
+ RE_H_MICROPY_HW_MCU_NAME = re.compile(r"#define\s+MICROPY_HW_MCU_NAME\s+\"(.+)\"")
26
+ # find in the mpconfigboard.cmake files
27
+
28
+ RE_CMAKE_MICROPY_HW_BOARD_NAME = re.compile(r"MICROPY_HW_BOARD_NAME\s?=\s?\"(?P<variant>[\w\s\S]*)\"")
29
+ RE_CMAKE_MICROPY_HW_MCU_NAME = re.compile(r"MICROPY_HW_MCU_NAME\s?=\s?\"(?P<variant>[\w\s\S]*)\"")
30
+ # TODO: normal make files
31
+
32
+
33
+ def boards_from_repo(mpy_path: Path, version: str, family: Optional[str] = None) -> List[Board]:
34
+ """Collects board name and decriptions from mpconfigboard.h files.
35
+
36
+ Args:
37
+ mpy_path (Path): The path to the MicroPython repository.
38
+ version (str): The version of MicroPython.
39
+
40
+ Returns:
41
+ List[Board]: A list of Board objects containing the board information.
42
+ """
43
+ if not mpy_path.exists() or not mpy_path.is_dir():
44
+ raise FileNotFoundError(f"MicroPython path {mpy_path} does not exist.")
45
+ if not family:
46
+ family = "micropython"
47
+ if not version:
48
+ version = git.get_local_tag() # type: ignore
49
+ if not version:
50
+ raise ValueError("No version provided and no local tag found.")
51
+
52
+ board_list: List[Board] = []
53
+ # look in mpconfigboard.h files
54
+ board_list = boards_from_cmake(mpy_path, version, family)
55
+
56
+ # look for variants in the .cmake files
57
+ board_list.extend(boards_from_headers(mpy_path, version, family))
58
+ # TODO:? look for variants in the Makefile files
59
+
60
+ return board_list
61
+
62
+
63
+ def boards_from_cmake(mpy_path: Path, version: str, family: str):
64
+ """Get boards from the mpconfigboard.cmake files to the board_list."""
65
+ board_list = []
66
+ for path in mpy_path.glob("ports/**/mpconfigboard.cmake"):
67
+ board = path.parent.name
68
+ port = path.parent.parent.parent.name
69
+ with open(path, "r") as f:
70
+ board_name = mcu_name = "-"
71
+ for line in f:
72
+ line = line.strip()
73
+ if match := RE_CMAKE_MICROPY_HW_BOARD_NAME.match(line):
74
+ description = match["variant"]
75
+ board_list.append(
76
+ Board(
77
+ board_id=board,
78
+ port=port,
79
+ board_name=board_name,
80
+ mcu_name=mcu_name,
81
+ description=description,
82
+ path=path.relative_to(mpy_path),
83
+ version=version,
84
+ family=family,
85
+ )
86
+ )
87
+ elif match := RE_CMAKE_MICROPY_HW_MCU_NAME.match(line):
88
+ description = match["variant"]
89
+ board_list.append(
90
+ Board(
91
+ board_id=board,
92
+ port=port,
93
+ board_name=board_name,
94
+ mcu_name=mcu_name,
95
+ description=description,
96
+ path=path.relative_to(mpy_path),
97
+ version=version,
98
+ family=family,
99
+ )
100
+ )
101
+ return board_list
102
+
103
+
104
+ def boards_from_headers(mpy_path: Path, version: str, family: str):
105
+ """Get boards from the mpconfigboard.h files to the board_list."""
106
+ board_list = []
107
+ for path in mpy_path.glob("ports/**/mpconfigboard.h"):
108
+ board = path.parent.name
109
+ port = path.parent.parent.parent.name
110
+ with open(path, "r") as f:
111
+ board_name = mcu_name = "-"
112
+ found = 0
113
+ for line in f:
114
+ if match := RE_H_MICROPY_HW_BOARD_NAME.match(line):
115
+ board_name = match[1]
116
+ found += 1
117
+ elif match := RE_H_MICROPY_HW_MCU_NAME.match(line):
118
+ mcu_name = match[1]
119
+ found += 1
120
+ if found == 2:
121
+ description = f"{board_name} with {mcu_name}" if mcu_name != "-" else board_name
122
+ board_list.append(
123
+ Board(
124
+ board_id=board,
125
+ port=port,
126
+ board_name=board_name,
127
+ mcu_name=mcu_name,
128
+ description=description,
129
+ path=path.relative_to(mpy_path),
130
+ version=version,
131
+ family=family,
132
+ )
133
+ )
134
+ found = 0
135
+ if found == 1:
136
+ description = board_name
137
+ board_list.append(
138
+ Board(
139
+ board_id=board,
140
+ port=port,
141
+ board_name=board_name,
142
+ mcu_name=mcu_name,
143
+ description=description,
144
+ path=path.relative_to(mpy_path),
145
+ version=version,
146
+ family=family,
147
+ )
148
+ )
149
+ return board_list
150
+
151
+
152
+ def boards_for_versions(versions: List[str], mpy_path: Path):
153
+ """Gets the list of boards for multiple versions of MicroPython.
154
+
155
+ Args:
156
+ versions (List[str]): The list of MicroPython versions.
157
+ mpy_path (Path): The path to the MicroPython repository.
158
+
159
+ Returns:
160
+ List[Board]: The list of Board objects.
161
+ """
162
+ board_list: List[Board] = []
163
+ for version in track(versions, description="Searching MicroPython versions"):
164
+ if git.checkout_tag(tag=version, repo=mpy_path):
165
+ new_ones = boards_from_repo(mpy_path, version, family="micropython")
166
+ print(f"Found {len(new_ones)} board definitions for {version}.")
167
+ board_list += new_ones
168
+ else:
169
+ print(f"Could not checkout version {version}.")
170
+
171
+ # sort the board_list by description and board
172
+ print("Total number of boards found:", len(board_list))
173
+
174
+ board_list = unique_boards(board_list)
175
+ print("Unique board descriptions found:", len(board_list))
176
+ return board_list
177
+
178
+
179
+ def unique_boards(board_list: List[Board], *, key_version: bool = True):
180
+ """Remove duplicate boards by 'BOARD_ID description' from the list."""
181
+ seen = set()
182
+ result = []
183
+ for x in board_list:
184
+ if key_version:
185
+ key = f"{x.board_id}|{x.version}|{x.description}"
186
+ else:
187
+ key = f"{x.board_id}|{x.description}"
188
+ if key not in seen:
189
+ result.append(x)
190
+ seen.add(key)
191
+ result.sort(key=lambda x: x.description.lower())
192
+ return result
193
+
194
+
195
+ def make_table(board_list: List[Board]) -> rich.table.Table:
196
+ """Creates a rich table with board information."""
197
+ is_wide = True
198
+
199
+ table = rich.table.Table(title="MicroPython Board Information")
200
+ table.add_column("BOARD_ID", justify="left", style="green")
201
+ table.add_column("Description", justify="left", style="cyan")
202
+ table.add_column("Port", justify="left", style="magenta")
203
+ table.add_column("Board Name", justify="left", style="blue")
204
+ if is_wide:
205
+ table.add_column("MCU Name", justify="left", style="blue")
206
+ table.add_column("Detection", justify="left", style="yellow")
207
+ table.add_column("Version", justify="left", style="blue")
208
+ if is_wide:
209
+ table.add_column("Family", justify="left", style="blue")
210
+
211
+ for board in board_list:
212
+ row = [board.board_id, board.description, *(board.port, board.board_name)]
213
+ if is_wide:
214
+ row.append(board.mcu_name)
215
+ row.extend((str(Path(board.path).suffix), board.version))
216
+ if is_wide:
217
+ row.append(board.family)
218
+ table.add_row(*row)
219
+
220
+ return table
221
+
222
+
223
+ def ask_mpy_path():
224
+ """Ask the user for the path to the MicroPython repository."""
225
+ questions = [
226
+ inquirer.Text(
227
+ "mpy_path", message="Enter the path to the MicroPython repository", default=".\\repos\\micropython"
228
+ )
229
+ ]
230
+ if answers := inquirer.prompt(questions):
231
+ return Path(answers["mpy_path"])
232
+ else:
233
+ raise ValueError("No path provided.")
234
+
235
+
236
+ def main():
237
+ """Main function to collect and write board information."""
238
+
239
+ console = Console()
240
+
241
+ mpy_path = ask_mpy_path()
242
+ versions = micropython_versions(minver="v1.10") + ["master"]
243
+ board_list = boards_for_versions(versions, mpy_path)
244
+
245
+ here = Path(__file__).parent
246
+ log.info(write_boardinfo_json(board_list, folder=here))
247
+ # write_files(board_list, folder=CONFIG.board_path)
248
+
249
+ # table of when the board was added
250
+ table = make_table(unique_boards(board_list, key_version=False))
251
+ console.print(table)
252
+
253
+
254
+ if __name__ == "__main__":
255
+ main()
@@ -1,37 +1,37 @@
1
- from dataclasses import dataclass, field
2
- from pathlib import Path
3
- from typing import Union
4
-
5
-
6
- # - source : get_boardnames.py
7
- @dataclass
8
- class Board:
9
- """
10
- MicroPython Board definitions, parsed from the make and header files
11
- """
12
-
13
- port: str # micropython port
14
- board_id: str # BOARD_ID (Foldername) as used in the make files
15
- board_name: str # Short board description
16
- description: str # Long board description
17
- path: Union[Path, str]
18
- version: str = field(default="") # version of MicroPython""
19
- # versions: List[str] = field(default=[]) # version of MicroPython""
20
- family: str = field(default="micropython")
21
- mcu_name: str = field(default="")
22
- cpu: str = field(default="")
23
- # TODO: add variant
24
-
25
- def __post_init__(self):
26
- if not self.cpu:
27
- if " with " in self.description:
28
- self.cpu = self.description.split(" with ")[-1]
29
- else:
30
- self.cpu = self.port
31
-
32
- @staticmethod
33
- def from_dict(data: dict) -> "Board":
34
- return Board(**data)
35
-
36
- def to_dict(self) -> dict:
37
- return self.__dict__
1
+ from dataclasses import dataclass, field
2
+ from pathlib import Path
3
+ from typing import Union
4
+
5
+
6
+ # - source : get_boardnames.py
7
+ @dataclass
8
+ class Board:
9
+ """
10
+ MicroPython Board definitions, parsed from the make and header files
11
+ """
12
+
13
+ port: str # micropython port
14
+ board_id: str # BOARD_ID (Foldername) as used in the make files
15
+ board_name: str # Short board description
16
+ description: str # Long board description
17
+ path: Union[Path, str]
18
+ version: str = field(default="") # version of MicroPython""
19
+ # versions: List[str] = field(default=[]) # version of MicroPython""
20
+ family: str = field(default="micropython")
21
+ mcu_name: str = field(default="")
22
+ cpu: str = field(default="")
23
+ # TODO: add variant
24
+
25
+ def __post_init__(self):
26
+ if not self.cpu:
27
+ if " with " in self.description:
28
+ self.cpu = self.description.split(" with ")[-1]
29
+ else:
30
+ self.cpu = self.port
31
+
32
+ @staticmethod
33
+ def from_dict(data: dict) -> "Board":
34
+ return Board(**data)
35
+
36
+ def to_dict(self) -> dict:
37
+ return self.__dict__