micropython-stubber 1.23.1__py3-none-any.whl → 1.23.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.
- {micropython_stubber-1.23.1.dist-info → micropython_stubber-1.23.2.dist-info}/LICENSE +30 -30
- {micropython_stubber-1.23.1.dist-info → micropython_stubber-1.23.2.dist-info}/METADATA +32 -15
- micropython_stubber-1.23.2.dist-info/RECORD +158 -0
- micropython_stubber-1.23.2.dist-info/entry_points.txt +5 -0
- mpflash/README.md +220 -194
- mpflash/libusb_flash.ipynb +203 -203
- mpflash/mpflash/add_firmware.py +98 -98
- mpflash/mpflash/ask_input.py +236 -236
- mpflash/mpflash/basicgit.py +284 -284
- mpflash/mpflash/bootloader/__init__.py +2 -2
- mpflash/mpflash/bootloader/activate.py +60 -60
- mpflash/mpflash/bootloader/detect.py +82 -82
- mpflash/mpflash/bootloader/manual.py +101 -101
- mpflash/mpflash/bootloader/micropython.py +12 -12
- mpflash/mpflash/bootloader/touch1200.py +36 -36
- mpflash/mpflash/cli_download.py +129 -129
- mpflash/mpflash/cli_flash.py +224 -219
- mpflash/mpflash/cli_group.py +111 -111
- mpflash/mpflash/cli_list.py +87 -81
- mpflash/mpflash/cli_main.py +39 -39
- mpflash/mpflash/common.py +210 -165
- mpflash/mpflash/config.py +44 -44
- mpflash/mpflash/connected.py +96 -78
- mpflash/mpflash/download.py +364 -364
- mpflash/mpflash/downloaded.py +130 -130
- mpflash/mpflash/errors.py +9 -9
- mpflash/mpflash/flash/__init__.py +55 -55
- mpflash/mpflash/flash/esp.py +59 -59
- mpflash/mpflash/flash/stm32.py +19 -19
- mpflash/mpflash/flash/stm32_dfu.py +104 -104
- mpflash/mpflash/flash/uf2/__init__.py +88 -88
- mpflash/mpflash/flash/uf2/boardid.py +15 -15
- mpflash/mpflash/flash/uf2/linux.py +136 -130
- mpflash/mpflash/flash/uf2/macos.py +42 -42
- mpflash/mpflash/flash/uf2/uf2disk.py +12 -12
- mpflash/mpflash/flash/uf2/windows.py +43 -43
- mpflash/mpflash/flash/worklist.py +170 -170
- mpflash/mpflash/list.py +106 -99
- mpflash/mpflash/logger.py +41 -41
- mpflash/mpflash/mpboard_id/__init__.py +93 -93
- mpflash/mpflash/mpboard_id/add_boards.py +251 -251
- mpflash/mpflash/mpboard_id/board.py +37 -37
- mpflash/mpflash/mpboard_id/board_id.py +86 -86
- mpflash/mpflash/mpboard_id/store.py +43 -43
- mpflash/mpflash/mpremoteboard/__init__.py +266 -222
- mpflash/mpflash/mpremoteboard/mpy_fw_info.py +141 -141
- mpflash/mpflash/mpremoteboard/runner.py +140 -140
- mpflash/mpflash/vendor/click_aliases.py +91 -91
- mpflash/mpflash/vendor/dfu.py +165 -165
- mpflash/mpflash/vendor/pydfu.py +605 -605
- mpflash/mpflash/vendor/readme.md +2 -2
- mpflash/mpflash/versions.py +135 -135
- mpflash/poetry.lock +1599 -1599
- mpflash/pyproject.toml +65 -65
- mpflash/stm32_udev_rules.md +62 -62
- stubber/__init__.py +3 -3
- stubber/board/board_info.csv +193 -193
- stubber/board/boot.py +34 -34
- stubber/board/createstubs.py +1004 -986
- stubber/board/createstubs_db.py +826 -825
- stubber/board/createstubs_db_min.py +332 -331
- stubber/board/createstubs_db_mpy.mpy +0 -0
- stubber/board/createstubs_lvgl.py +741 -741
- stubber/board/createstubs_lvgl_min.py +741 -741
- stubber/board/createstubs_mem.py +767 -766
- stubber/board/createstubs_mem_min.py +307 -306
- stubber/board/createstubs_mem_mpy.mpy +0 -0
- stubber/board/createstubs_min.py +295 -294
- stubber/board/createstubs_mpy.mpy +0 -0
- stubber/board/fw_info.py +141 -141
- stubber/board/info.py +183 -183
- stubber/board/main.py +19 -19
- stubber/board/modulelist.txt +247 -247
- stubber/board/pyrightconfig.json +34 -34
- stubber/bulk/mcu_stubber.py +437 -454
- stubber/codemod/_partials/__init__.py +48 -48
- stubber/codemod/_partials/db_main.py +147 -147
- stubber/codemod/_partials/lvgl_main.py +77 -77
- stubber/codemod/_partials/modules_reader.py +80 -80
- stubber/codemod/add_comment.py +53 -53
- stubber/codemod/add_method.py +65 -65
- stubber/codemod/board.py +317 -317
- stubber/codemod/enrich.py +151 -145
- stubber/codemod/merge_docstub.py +284 -284
- stubber/codemod/modify_list.py +54 -54
- stubber/codemod/utils.py +56 -56
- stubber/commands/build_cmd.py +94 -94
- stubber/commands/cli.py +49 -55
- stubber/commands/clone_cmd.py +78 -78
- stubber/commands/config_cmd.py +29 -29
- stubber/commands/enrich_folder_cmd.py +71 -71
- stubber/commands/get_core_cmd.py +71 -71
- stubber/commands/get_docstubs_cmd.py +92 -89
- stubber/commands/get_frozen_cmd.py +117 -114
- stubber/commands/get_mcu_cmd.py +102 -61
- stubber/commands/merge_cmd.py +66 -66
- stubber/commands/publish_cmd.py +118 -118
- stubber/commands/stub_cmd.py +31 -31
- stubber/commands/switch_cmd.py +62 -62
- stubber/commands/variants_cmd.py +48 -48
- stubber/cst_transformer.py +178 -178
- stubber/data/board_info.csv +193 -193
- stubber/data/board_info.json +1729 -1729
- stubber/data/micropython_tags.csv +15 -15
- stubber/data/requirements-core-micropython.txt +38 -38
- stubber/data/requirements-core-pycopy.txt +39 -39
- stubber/downloader.py +37 -36
- stubber/freeze/common.py +72 -68
- stubber/freeze/freeze_folder.py +69 -69
- stubber/freeze/freeze_manifest_2.py +126 -113
- stubber/freeze/get_frozen.py +131 -127
- stubber/get_cpython.py +112 -101
- stubber/get_lobo.py +59 -59
- stubber/minify.py +423 -419
- stubber/publish/bump.py +86 -86
- stubber/publish/candidates.py +275 -256
- stubber/publish/database.py +18 -18
- stubber/publish/defaults.py +40 -40
- stubber/publish/enums.py +24 -24
- stubber/publish/helpers.py +29 -29
- stubber/publish/merge_docstubs.py +136 -130
- stubber/publish/missing_class_methods.py +51 -49
- stubber/publish/package.py +150 -146
- stubber/publish/pathnames.py +51 -51
- stubber/publish/publish.py +120 -120
- stubber/publish/pypi.py +42 -38
- stubber/publish/stubpackage.py +1055 -1027
- stubber/rst/__init__.py +9 -9
- stubber/rst/classsort.py +78 -77
- stubber/rst/lookup.py +533 -530
- stubber/rst/output_dict.py +401 -401
- stubber/rst/reader.py +814 -814
- stubber/rst/report_return.py +77 -69
- stubber/rst/rst_utils.py +541 -540
- stubber/stubber.py +38 -38
- stubber/stubs_from_docs.py +90 -90
- stubber/tools/manifestfile.py +654 -654
- stubber/tools/readme.md +6 -6
- stubber/update_fallback.py +117 -117
- stubber/update_module_list.py +123 -123
- stubber/utils/__init__.py +6 -6
- stubber/utils/config.py +137 -125
- stubber/utils/makeversionhdr.py +54 -54
- stubber/utils/manifest.py +90 -90
- stubber/utils/post.py +80 -79
- stubber/utils/repos.py +156 -150
- stubber/utils/stubmaker.py +139 -139
- stubber/utils/typed_config_toml.py +80 -77
- stubber/variants.py +106 -106
- micropython_stubber-1.23.1.dist-info/RECORD +0 -159
- micropython_stubber-1.23.1.dist-info/entry_points.txt +0 -3
- mpflash/basicgit.py +0 -288
- {micropython_stubber-1.23.1.dist-info → micropython_stubber-1.23.2.dist-info}/WHEEL +0 -0
stubber/publish/defaults.py
CHANGED
@@ -1,40 +1,40 @@
|
|
1
|
-
"""Build and packaging defaults for stubber"""
|
2
|
-
|
3
|
-
from typing import Dict, List
|
4
|
-
|
5
|
-
from mpflash.versions import V_PREVIEW, clean_version
|
6
|
-
from stubber.utils.config import CONFIG
|
7
|
-
|
8
|
-
# The default board for the ports modules documented with base name only
|
9
|
-
# as the MicroPython BOARD naming convention has changed over time there are different options to try
|
10
|
-
# (newer to older)
|
11
|
-
|
12
|
-
DEFAULT_BOARDS: Dict[str, List[str]] = {
|
13
|
-
"stm32": ["PYBV11", ""],
|
14
|
-
"esp32": ["ESP32_GENERIC", "GENERIC", ""], # "GENERIC_SPIRAM",
|
15
|
-
"esp8266": ["ESP8266_GENERIC", "GENERIC", ""],
|
16
|
-
"rp2": ["RPI_PICO", "PICO", ""],
|
17
|
-
"samd": ["SEEED_WIO_TERMINAL", ""],
|
18
|
-
}
|
19
|
-
|
20
|
-
GENERIC_L = "generic"
|
21
|
-
"generic lowercase"
|
22
|
-
GENERIC_U = "GENERIC"
|
23
|
-
"GENERIC uppercase"
|
24
|
-
GENERIC = {GENERIC_L, GENERIC_U}
|
25
|
-
"GENERIC eithercase"
|
26
|
-
|
27
|
-
|
28
|
-
def default_board(port: str, version=V_PREVIEW) -> str: # sourcery skip: assign-if-exp
|
29
|
-
"""Return the default board for the given version and port"""
|
30
|
-
ver_flat = clean_version(version, flat=True)
|
31
|
-
if port in DEFAULT_BOARDS:
|
32
|
-
for board in DEFAULT_BOARDS[port]:
|
33
|
-
base = f"micropython-{ver_flat}-{port}-{board}" if board else f"micropython-{ver_flat}-{port}"
|
34
|
-
# check if we have a (merged)stub for this version and port
|
35
|
-
if (CONFIG.stub_path / f"{base}-merged").exists() or (CONFIG.stub_path / base).exists():
|
36
|
-
return board
|
37
|
-
# fallback to first listed board
|
38
|
-
return DEFAULT_BOARDS[port][0]
|
39
|
-
# fallback to generic
|
40
|
-
return GENERIC_U
|
1
|
+
"""Build and packaging defaults for stubber"""
|
2
|
+
|
3
|
+
from typing import Dict, List
|
4
|
+
|
5
|
+
from mpflash.versions import V_PREVIEW, clean_version
|
6
|
+
from stubber.utils.config import CONFIG
|
7
|
+
|
8
|
+
# The default board for the ports modules documented with base name only
|
9
|
+
# as the MicroPython BOARD naming convention has changed over time there are different options to try
|
10
|
+
# (newer to older)
|
11
|
+
|
12
|
+
DEFAULT_BOARDS: Dict[str, List[str]] = {
|
13
|
+
"stm32": ["PYBV11", ""],
|
14
|
+
"esp32": ["ESP32_GENERIC", "GENERIC", ""], # "GENERIC_SPIRAM",
|
15
|
+
"esp8266": ["ESP8266_GENERIC", "GENERIC", ""],
|
16
|
+
"rp2": ["RPI_PICO", "PICO", ""],
|
17
|
+
"samd": ["SEEED_WIO_TERMINAL", ""],
|
18
|
+
}
|
19
|
+
|
20
|
+
GENERIC_L = "generic"
|
21
|
+
"generic lowercase"
|
22
|
+
GENERIC_U = "GENERIC"
|
23
|
+
"GENERIC uppercase"
|
24
|
+
GENERIC = {GENERIC_L, GENERIC_U}
|
25
|
+
"GENERIC eithercase"
|
26
|
+
|
27
|
+
|
28
|
+
def default_board(port: str, version=V_PREVIEW) -> str: # sourcery skip: assign-if-exp
|
29
|
+
"""Return the default board for the given version and port"""
|
30
|
+
ver_flat = clean_version(version, flat=True)
|
31
|
+
if port in DEFAULT_BOARDS:
|
32
|
+
for board in DEFAULT_BOARDS[port]:
|
33
|
+
base = f"micropython-{ver_flat}-{port}-{board}" if board else f"micropython-{ver_flat}-{port}"
|
34
|
+
# check if we have a (merged)stub for this version and port
|
35
|
+
if (CONFIG.stub_path / f"{base}-merged").exists() or (CONFIG.stub_path / base).exists():
|
36
|
+
return board
|
37
|
+
# fallback to first listed board
|
38
|
+
return DEFAULT_BOARDS[port][0]
|
39
|
+
# fallback to generic
|
40
|
+
return GENERIC_U
|
stubber/publish/enums.py
CHANGED
@@ -1,24 +1,24 @@
|
|
1
|
-
"""Enumerations for the stubber package."""
|
2
|
-
from enum import Enum
|
3
|
-
|
4
|
-
|
5
|
-
class StubSource(str, Enum):
|
6
|
-
FIRMWARE = "MCU stubs"
|
7
|
-
"stubs built by combining the firmware, frozen and core stubs"
|
8
|
-
FROZEN = "Frozen stubs"
|
9
|
-
"stubs of python modules that are frozen as part of the firmware image"
|
10
|
-
CORE = "Core stubs"
|
11
|
-
"stubs that allow (some) MicroPython code to be run by CPython"
|
12
|
-
DOC = "Doc stubs"
|
13
|
-
"stubs built by parsing the micropython RST documentation files"
|
14
|
-
MERGED = "Merged stubs"
|
15
|
-
"stubs built by merging the information from doc-stubs and MCU stubs"
|
16
|
-
|
17
|
-
def __str__(self):
|
18
|
-
# Always force string values
|
19
|
-
return self.value
|
20
|
-
|
21
|
-
def __repr__(self):
|
22
|
-
# Always force string values
|
23
|
-
return self.value
|
24
|
-
|
1
|
+
"""Enumerations for the stubber package."""
|
2
|
+
from enum import Enum
|
3
|
+
|
4
|
+
|
5
|
+
class StubSource(str, Enum):
|
6
|
+
FIRMWARE = "MCU stubs"
|
7
|
+
"stubs built by combining the firmware, frozen and core stubs"
|
8
|
+
FROZEN = "Frozen stubs"
|
9
|
+
"stubs of python modules that are frozen as part of the firmware image"
|
10
|
+
CORE = "Core stubs"
|
11
|
+
"stubs that allow (some) MicroPython code to be run by CPython"
|
12
|
+
DOC = "Doc stubs"
|
13
|
+
"stubs built by parsing the micropython RST documentation files"
|
14
|
+
MERGED = "Merged stubs"
|
15
|
+
"stubs built by merging the information from doc-stubs and MCU stubs"
|
16
|
+
|
17
|
+
def __str__(self):
|
18
|
+
# Always force string values
|
19
|
+
return self.value
|
20
|
+
|
21
|
+
def __repr__(self):
|
22
|
+
# Always force string values
|
23
|
+
return self.value
|
24
|
+
|
stubber/publish/helpers.py
CHANGED
@@ -1,29 +1,29 @@
|
|
1
|
-
"""
|
2
|
-
This module provides a function to retrieve the docstring of a Python module.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from pathlib import Path
|
6
|
-
from typing import Any, Union
|
7
|
-
|
8
|
-
import libcst as cst
|
9
|
-
|
10
|
-
|
11
|
-
def get_module_docstring(fname: Path) -> Union[str, Any]:
|
12
|
-
"""
|
13
|
-
Retrieve the docstring of a Python module.
|
14
|
-
|
15
|
-
Args:
|
16
|
-
fname (Path): The path to the Python module file.
|
17
|
-
|
18
|
-
Returns:
|
19
|
-
Union[str, Any]: The docstring of the Python module, or None if no docstring is found.
|
20
|
-
"""
|
21
|
-
try:
|
22
|
-
with open(fname, "r") as file:
|
23
|
-
content = file.read()
|
24
|
-
mod = cst.parse_module(content)
|
25
|
-
return mod.get_docstring()
|
26
|
-
except Exception as e:
|
27
|
-
print(e)
|
28
|
-
return None
|
29
|
-
|
1
|
+
"""
|
2
|
+
This module provides a function to retrieve the docstring of a Python module.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from pathlib import Path
|
6
|
+
from typing import Any, Union
|
7
|
+
|
8
|
+
import libcst as cst
|
9
|
+
|
10
|
+
|
11
|
+
def get_module_docstring(fname: Path) -> Union[str, Any]:
|
12
|
+
"""
|
13
|
+
Retrieve the docstring of a Python module.
|
14
|
+
|
15
|
+
Args:
|
16
|
+
fname (Path): The path to the Python module file.
|
17
|
+
|
18
|
+
Returns:
|
19
|
+
Union[str, Any]: The docstring of the Python module, or None if no docstring is found.
|
20
|
+
"""
|
21
|
+
try:
|
22
|
+
with open(fname, "r") as file:
|
23
|
+
content = file.read()
|
24
|
+
mod = cst.parse_module(content)
|
25
|
+
return mod.get_docstring()
|
26
|
+
except Exception as e:
|
27
|
+
print(e)
|
28
|
+
return None
|
29
|
+
|
@@ -1,130 +1,136 @@
|
|
1
|
-
"""
|
2
|
-
Merge MCU stubs and docstubs into a single folder
|
3
|
-
"""
|
4
|
-
|
5
|
-
import shutil
|
6
|
-
from pathlib import Path
|
7
|
-
from typing import List, Optional, Union
|
8
|
-
|
9
|
-
from
|
10
|
-
|
11
|
-
from stubber.codemod.enrich import enrich_folder
|
12
|
-
from stubber.publish.candidates import board_candidates, filter_list
|
13
|
-
from stubber.publish.defaults import GENERIC, GENERIC_L, default_board
|
14
|
-
from stubber.publish.missing_class_methods import add_machine_pin_call
|
15
|
-
from stubber.publish.pathnames import get_base, get_board_path, get_merged_path
|
16
|
-
from stubber.utils.config import CONFIG
|
17
|
-
|
18
|
-
|
19
|
-
def merge_all_docstubs(
|
20
|
-
versions: Optional[Union[List[str], str]] = None,
|
21
|
-
family: str = "micropython",
|
22
|
-
ports: Optional[Union[List[str], str]] = None,
|
23
|
-
boards: Optional[Union[List[str], str]] = None,
|
24
|
-
*,
|
25
|
-
mpy_path: Path = CONFIG.mpy_path,
|
26
|
-
):
|
27
|
-
"""merge docstubs and MCU stubs to merged stubs"""
|
28
|
-
if versions is None:
|
29
|
-
versions = [CONFIG.stable_version]
|
30
|
-
if ports is None:
|
31
|
-
ports = ["all"]
|
32
|
-
if boards is None:
|
33
|
-
boards = [GENERIC_L]
|
34
|
-
if isinstance(versions, str):
|
35
|
-
versions = [versions]
|
36
|
-
if isinstance(ports, str):
|
37
|
-
ports = [ports]
|
38
|
-
if isinstance(boards, str):
|
39
|
-
boards = [boards]
|
40
|
-
|
41
|
-
candidates = list(board_candidates(versions=versions, family=family))
|
42
|
-
candidates = filter_list(candidates, ports, boards)
|
43
|
-
if not candidates:
|
44
|
-
log.error("No candidates found")
|
45
|
-
return
|
46
|
-
|
47
|
-
log.info(f"checking {len(candidates)} possible board candidates")
|
48
|
-
merged = 0
|
49
|
-
for candidate in candidates:
|
50
|
-
# use the default board for the port
|
51
|
-
if candidate["board"] in GENERIC:
|
52
|
-
candidate["board"] = default_board(
|
53
|
-
|
54
|
-
|
55
|
-
#
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
shutil.
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
(
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
#
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
1
|
+
"""
|
2
|
+
Merge MCU stubs and docstubs into a single folder
|
3
|
+
"""
|
4
|
+
|
5
|
+
import shutil
|
6
|
+
from pathlib import Path
|
7
|
+
from typing import List, Optional, Union
|
8
|
+
|
9
|
+
from mpflash.logger import log
|
10
|
+
|
11
|
+
from stubber.codemod.enrich import enrich_folder
|
12
|
+
from stubber.publish.candidates import board_candidates, filter_list
|
13
|
+
from stubber.publish.defaults import GENERIC, GENERIC_L, default_board
|
14
|
+
from stubber.publish.missing_class_methods import add_machine_pin_call
|
15
|
+
from stubber.publish.pathnames import get_base, get_board_path, get_merged_path
|
16
|
+
from stubber.utils.config import CONFIG
|
17
|
+
|
18
|
+
|
19
|
+
def merge_all_docstubs(
|
20
|
+
versions: Optional[Union[List[str], str]] = None,
|
21
|
+
family: str = "micropython",
|
22
|
+
ports: Optional[Union[List[str], str]] = None,
|
23
|
+
boards: Optional[Union[List[str], str]] = None,
|
24
|
+
*,
|
25
|
+
mpy_path: Path = CONFIG.mpy_path,
|
26
|
+
):
|
27
|
+
"""merge docstubs and MCU stubs to merged stubs"""
|
28
|
+
if versions is None:
|
29
|
+
versions = [CONFIG.stable_version]
|
30
|
+
if ports is None:
|
31
|
+
ports = ["all"]
|
32
|
+
if boards is None:
|
33
|
+
boards = [GENERIC_L]
|
34
|
+
if isinstance(versions, str):
|
35
|
+
versions = [versions]
|
36
|
+
if isinstance(ports, str):
|
37
|
+
ports = [ports]
|
38
|
+
if isinstance(boards, str):
|
39
|
+
boards = [boards]
|
40
|
+
|
41
|
+
candidates = list(board_candidates(versions=versions, family=family))
|
42
|
+
candidates = filter_list(candidates, ports, boards)
|
43
|
+
if not candidates:
|
44
|
+
log.error("No candidates found")
|
45
|
+
return
|
46
|
+
|
47
|
+
log.info(f"checking {len(candidates)} possible board candidates")
|
48
|
+
merged = 0
|
49
|
+
for candidate in candidates:
|
50
|
+
# use the default board for the port
|
51
|
+
if candidate["board"] in GENERIC:
|
52
|
+
candidate["board"] = default_board(
|
53
|
+
port=candidate["port"], version=candidate["version"]
|
54
|
+
)
|
55
|
+
# check if we have MCU stubs of this version and port
|
56
|
+
doc_path = CONFIG.stub_path / f"{get_base(candidate)}-docstubs"
|
57
|
+
# src and dest paths
|
58
|
+
board_path = get_board_path(candidate)
|
59
|
+
merged_path = get_merged_path(candidate)
|
60
|
+
|
61
|
+
# only continue if both folders exist
|
62
|
+
if not doc_path.exists():
|
63
|
+
log.warning(f"No docstubs found for {candidate['version']}")
|
64
|
+
continue
|
65
|
+
if not board_path.exists():
|
66
|
+
log.info(f"skipping {merged_path.name}, no MCU stubs found in {board_path}")
|
67
|
+
continue
|
68
|
+
log.info(f"Merge {candidate['version']} docstubs with boardstubs to {merged_path.name}")
|
69
|
+
try:
|
70
|
+
result = copy_and_merge_docstubs(board_path, merged_path, doc_path)
|
71
|
+
# Add methods from docstubs to the MCU stubs that do not exist in the MCU stubs
|
72
|
+
# Add the __call__ method to the machine.Pin and pyb.Pin class
|
73
|
+
add_machine_pin_call(merged_path, candidate["version"])
|
74
|
+
except Exception as e:
|
75
|
+
log.error(f"Error parsing {candidate['version']} docstubs: {e}")
|
76
|
+
continue
|
77
|
+
if result:
|
78
|
+
merged += 1
|
79
|
+
log.info(f"merged {merged} of {len(candidates)} candidates")
|
80
|
+
return merged
|
81
|
+
|
82
|
+
|
83
|
+
def copy_and_merge_docstubs(fw_path: Path, dest_path: Path, docstub_path: Path):
|
84
|
+
"""
|
85
|
+
Parameters:
|
86
|
+
fw_path: Path to MCU stubs (absolute path)
|
87
|
+
dest_path: Path to destination (absolute path)
|
88
|
+
mpy_version: micropython version ('1.18')
|
89
|
+
|
90
|
+
Copy files from the firmware stub folders to the merged
|
91
|
+
- 1 - Copy all MCU stubs to the package folder
|
92
|
+
- 1.B - clean up a little bit
|
93
|
+
- 2 - Enrich the MCU stubs with the document stubs
|
94
|
+
|
95
|
+
"""
|
96
|
+
if dest_path.exists():
|
97
|
+
# delete all files and folders from the destination
|
98
|
+
shutil.rmtree(dest_path, ignore_errors=True)
|
99
|
+
dest_path.mkdir(parents=True, exist_ok=True)
|
100
|
+
|
101
|
+
# 1 - Copy the stubs to the package, directly in the package folder (no folders)
|
102
|
+
try:
|
103
|
+
log.debug(f"Copying MCU stubs from {fw_path}")
|
104
|
+
shutil.copytree(fw_path, dest_path, symlinks=True, dirs_exist_ok=True)
|
105
|
+
except OSError as e:
|
106
|
+
log.error(f"Error copying stubs from : { fw_path}, {e}")
|
107
|
+
raise (e)
|
108
|
+
# rename the module.json file to firmware.json
|
109
|
+
if (dest_path / "modules.json").exists():
|
110
|
+
(dest_path / "modules.json").rename(dest_path / "firmware_stubs.json")
|
111
|
+
|
112
|
+
# avoid duplicate modules : folder - file combinations
|
113
|
+
# prefer folder from frozen stubs, over file from MCU stubs
|
114
|
+
# No frozen here - OLD code ?
|
115
|
+
for f in dest_path.glob("*"):
|
116
|
+
if f.is_dir():
|
117
|
+
for suffix in [".py", ".pyi"]:
|
118
|
+
if (dest_path / f.name).with_suffix(suffix).exists():
|
119
|
+
(dest_path / f.name).with_suffix(suffix).unlink()
|
120
|
+
|
121
|
+
# delete builtins.pyi in the package folder
|
122
|
+
for name in [
|
123
|
+
"builtins", # creates conflicts, better removed
|
124
|
+
"pycopy_imphook", # is not intended to be used directly, and has an unresolved subclass
|
125
|
+
]:
|
126
|
+
for suffix in [".py", ".pyi"]:
|
127
|
+
if (dest_path / name).with_suffix(suffix).exists(): # type: ignore
|
128
|
+
(dest_path / name).with_suffix(suffix).unlink() # type: ignore
|
129
|
+
|
130
|
+
# 2 - Enrich the MCU stubs with the document stubs
|
131
|
+
result = enrich_folder(dest_path, docstub_path=docstub_path, write_back=True)
|
132
|
+
|
133
|
+
# copy the docstubs manifest.json file to the package folder
|
134
|
+
if (docstub_path / "modules.json").exists():
|
135
|
+
shutil.copy(docstub_path / "modules.json", dest_path / "doc_stubs.json")
|
136
|
+
return result
|
@@ -1,49 +1,51 @@
|
|
1
|
-
"""
|
2
|
-
Add missing methods to classes in the stubs that are documented in the docstubs
|
3
|
-
|
4
|
-
"""
|
5
|
-
|
6
|
-
from pathlib import Path
|
7
|
-
|
8
|
-
import libcst as cst
|
9
|
-
from
|
10
|
-
|
11
|
-
from mpflash.versions import clean_version
|
12
|
-
from stubber.codemod.add_method import CallAdder, CallFinder
|
13
|
-
from stubber.utils.config import CONFIG
|
14
|
-
from stubber.utils.post import run_black
|
15
|
-
|
16
|
-
|
17
|
-
def add_machine_pin_call(merged_path: Path, version: str):
|
18
|
-
"""
|
19
|
-
Add the __call__ method to the machine.Pin and pyb.Pin class
|
20
|
-
in all pyb and machine/umachine stubs
|
21
|
-
"""
|
22
|
-
# TODO: this should be done in the merge_docstubs.py to avoid needing to run black twice
|
23
|
-
# and to avoid having to parse the file twice
|
24
|
-
|
25
|
-
# first find the __call__ method in the default stubs
|
26
|
-
mod_path =
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
1
|
+
"""
|
2
|
+
Add missing methods to classes in the stubs that are documented in the docstubs
|
3
|
+
|
4
|
+
"""
|
5
|
+
|
6
|
+
from pathlib import Path
|
7
|
+
|
8
|
+
import libcst as cst
|
9
|
+
from mpflash.logger import log
|
10
|
+
|
11
|
+
from mpflash.versions import clean_version
|
12
|
+
from stubber.codemod.add_method import CallAdder, CallFinder
|
13
|
+
from stubber.utils.config import CONFIG
|
14
|
+
from stubber.utils.post import run_black
|
15
|
+
|
16
|
+
|
17
|
+
def add_machine_pin_call(merged_path: Path, version: str):
|
18
|
+
"""
|
19
|
+
Add the __call__ method to the machine.Pin and pyb.Pin class
|
20
|
+
in all pyb and machine/umachine stubs
|
21
|
+
"""
|
22
|
+
# TODO: this should be done in the merge_docstubs.py to avoid needing to run black twice
|
23
|
+
# and to avoid having to parse the file twice
|
24
|
+
|
25
|
+
# first find the __call__ method in the default stubs
|
26
|
+
mod_path = (
|
27
|
+
CONFIG.stub_path / f"micropython-{clean_version(version, flat=True)}-docstubs/machine.pyi"
|
28
|
+
)
|
29
|
+
if not mod_path.exists():
|
30
|
+
log.error(f"no docstubs found for {version}")
|
31
|
+
return False
|
32
|
+
log.trace(f"Parsing {mod_path} for __call__ method")
|
33
|
+
source = mod_path.read_text(encoding="utf-8")
|
34
|
+
module = cst.parse_module(source)
|
35
|
+
|
36
|
+
call_finder = CallFinder()
|
37
|
+
module.visit(call_finder)
|
38
|
+
|
39
|
+
if call_finder.call_meth is None:
|
40
|
+
log.error("no __call__ method found")
|
41
|
+
return False
|
42
|
+
|
43
|
+
# then use the CallAdder to add the __call__ method to all machine and pyb stubs
|
44
|
+
mod_paths = [f for f in merged_path.rglob("*.*") if f.stem in {"machine", "umachine", "pyb"}]
|
45
|
+
for mod_path in mod_paths:
|
46
|
+
source = mod_path.read_text(encoding="utf-8")
|
47
|
+
machine_module = cst.parse_module(source)
|
48
|
+
new_module = machine_module.visit(CallAdder(call_finder.call_meth))
|
49
|
+
mod_path.write_text(new_module.code, encoding="utf-8")
|
50
|
+
run_black(mod_path)
|
51
|
+
return True
|