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.
Files changed (153) hide show
  1. {micropython_stubber-1.23.1.dist-info → micropython_stubber-1.23.2.dist-info}/LICENSE +30 -30
  2. {micropython_stubber-1.23.1.dist-info → micropython_stubber-1.23.2.dist-info}/METADATA +32 -15
  3. micropython_stubber-1.23.2.dist-info/RECORD +158 -0
  4. micropython_stubber-1.23.2.dist-info/entry_points.txt +5 -0
  5. mpflash/README.md +220 -194
  6. mpflash/libusb_flash.ipynb +203 -203
  7. mpflash/mpflash/add_firmware.py +98 -98
  8. mpflash/mpflash/ask_input.py +236 -236
  9. mpflash/mpflash/basicgit.py +284 -284
  10. mpflash/mpflash/bootloader/__init__.py +2 -2
  11. mpflash/mpflash/bootloader/activate.py +60 -60
  12. mpflash/mpflash/bootloader/detect.py +82 -82
  13. mpflash/mpflash/bootloader/manual.py +101 -101
  14. mpflash/mpflash/bootloader/micropython.py +12 -12
  15. mpflash/mpflash/bootloader/touch1200.py +36 -36
  16. mpflash/mpflash/cli_download.py +129 -129
  17. mpflash/mpflash/cli_flash.py +224 -219
  18. mpflash/mpflash/cli_group.py +111 -111
  19. mpflash/mpflash/cli_list.py +87 -81
  20. mpflash/mpflash/cli_main.py +39 -39
  21. mpflash/mpflash/common.py +210 -165
  22. mpflash/mpflash/config.py +44 -44
  23. mpflash/mpflash/connected.py +96 -78
  24. mpflash/mpflash/download.py +364 -364
  25. mpflash/mpflash/downloaded.py +130 -130
  26. mpflash/mpflash/errors.py +9 -9
  27. mpflash/mpflash/flash/__init__.py +55 -55
  28. mpflash/mpflash/flash/esp.py +59 -59
  29. mpflash/mpflash/flash/stm32.py +19 -19
  30. mpflash/mpflash/flash/stm32_dfu.py +104 -104
  31. mpflash/mpflash/flash/uf2/__init__.py +88 -88
  32. mpflash/mpflash/flash/uf2/boardid.py +15 -15
  33. mpflash/mpflash/flash/uf2/linux.py +136 -130
  34. mpflash/mpflash/flash/uf2/macos.py +42 -42
  35. mpflash/mpflash/flash/uf2/uf2disk.py +12 -12
  36. mpflash/mpflash/flash/uf2/windows.py +43 -43
  37. mpflash/mpflash/flash/worklist.py +170 -170
  38. mpflash/mpflash/list.py +106 -99
  39. mpflash/mpflash/logger.py +41 -41
  40. mpflash/mpflash/mpboard_id/__init__.py +93 -93
  41. mpflash/mpflash/mpboard_id/add_boards.py +251 -251
  42. mpflash/mpflash/mpboard_id/board.py +37 -37
  43. mpflash/mpflash/mpboard_id/board_id.py +86 -86
  44. mpflash/mpflash/mpboard_id/store.py +43 -43
  45. mpflash/mpflash/mpremoteboard/__init__.py +266 -222
  46. mpflash/mpflash/mpremoteboard/mpy_fw_info.py +141 -141
  47. mpflash/mpflash/mpremoteboard/runner.py +140 -140
  48. mpflash/mpflash/vendor/click_aliases.py +91 -91
  49. mpflash/mpflash/vendor/dfu.py +165 -165
  50. mpflash/mpflash/vendor/pydfu.py +605 -605
  51. mpflash/mpflash/vendor/readme.md +2 -2
  52. mpflash/mpflash/versions.py +135 -135
  53. mpflash/poetry.lock +1599 -1599
  54. mpflash/pyproject.toml +65 -65
  55. mpflash/stm32_udev_rules.md +62 -62
  56. stubber/__init__.py +3 -3
  57. stubber/board/board_info.csv +193 -193
  58. stubber/board/boot.py +34 -34
  59. stubber/board/createstubs.py +1004 -986
  60. stubber/board/createstubs_db.py +826 -825
  61. stubber/board/createstubs_db_min.py +332 -331
  62. stubber/board/createstubs_db_mpy.mpy +0 -0
  63. stubber/board/createstubs_lvgl.py +741 -741
  64. stubber/board/createstubs_lvgl_min.py +741 -741
  65. stubber/board/createstubs_mem.py +767 -766
  66. stubber/board/createstubs_mem_min.py +307 -306
  67. stubber/board/createstubs_mem_mpy.mpy +0 -0
  68. stubber/board/createstubs_min.py +295 -294
  69. stubber/board/createstubs_mpy.mpy +0 -0
  70. stubber/board/fw_info.py +141 -141
  71. stubber/board/info.py +183 -183
  72. stubber/board/main.py +19 -19
  73. stubber/board/modulelist.txt +247 -247
  74. stubber/board/pyrightconfig.json +34 -34
  75. stubber/bulk/mcu_stubber.py +437 -454
  76. stubber/codemod/_partials/__init__.py +48 -48
  77. stubber/codemod/_partials/db_main.py +147 -147
  78. stubber/codemod/_partials/lvgl_main.py +77 -77
  79. stubber/codemod/_partials/modules_reader.py +80 -80
  80. stubber/codemod/add_comment.py +53 -53
  81. stubber/codemod/add_method.py +65 -65
  82. stubber/codemod/board.py +317 -317
  83. stubber/codemod/enrich.py +151 -145
  84. stubber/codemod/merge_docstub.py +284 -284
  85. stubber/codemod/modify_list.py +54 -54
  86. stubber/codemod/utils.py +56 -56
  87. stubber/commands/build_cmd.py +94 -94
  88. stubber/commands/cli.py +49 -55
  89. stubber/commands/clone_cmd.py +78 -78
  90. stubber/commands/config_cmd.py +29 -29
  91. stubber/commands/enrich_folder_cmd.py +71 -71
  92. stubber/commands/get_core_cmd.py +71 -71
  93. stubber/commands/get_docstubs_cmd.py +92 -89
  94. stubber/commands/get_frozen_cmd.py +117 -114
  95. stubber/commands/get_mcu_cmd.py +102 -61
  96. stubber/commands/merge_cmd.py +66 -66
  97. stubber/commands/publish_cmd.py +118 -118
  98. stubber/commands/stub_cmd.py +31 -31
  99. stubber/commands/switch_cmd.py +62 -62
  100. stubber/commands/variants_cmd.py +48 -48
  101. stubber/cst_transformer.py +178 -178
  102. stubber/data/board_info.csv +193 -193
  103. stubber/data/board_info.json +1729 -1729
  104. stubber/data/micropython_tags.csv +15 -15
  105. stubber/data/requirements-core-micropython.txt +38 -38
  106. stubber/data/requirements-core-pycopy.txt +39 -39
  107. stubber/downloader.py +37 -36
  108. stubber/freeze/common.py +72 -68
  109. stubber/freeze/freeze_folder.py +69 -69
  110. stubber/freeze/freeze_manifest_2.py +126 -113
  111. stubber/freeze/get_frozen.py +131 -127
  112. stubber/get_cpython.py +112 -101
  113. stubber/get_lobo.py +59 -59
  114. stubber/minify.py +423 -419
  115. stubber/publish/bump.py +86 -86
  116. stubber/publish/candidates.py +275 -256
  117. stubber/publish/database.py +18 -18
  118. stubber/publish/defaults.py +40 -40
  119. stubber/publish/enums.py +24 -24
  120. stubber/publish/helpers.py +29 -29
  121. stubber/publish/merge_docstubs.py +136 -130
  122. stubber/publish/missing_class_methods.py +51 -49
  123. stubber/publish/package.py +150 -146
  124. stubber/publish/pathnames.py +51 -51
  125. stubber/publish/publish.py +120 -120
  126. stubber/publish/pypi.py +42 -38
  127. stubber/publish/stubpackage.py +1055 -1027
  128. stubber/rst/__init__.py +9 -9
  129. stubber/rst/classsort.py +78 -77
  130. stubber/rst/lookup.py +533 -530
  131. stubber/rst/output_dict.py +401 -401
  132. stubber/rst/reader.py +814 -814
  133. stubber/rst/report_return.py +77 -69
  134. stubber/rst/rst_utils.py +541 -540
  135. stubber/stubber.py +38 -38
  136. stubber/stubs_from_docs.py +90 -90
  137. stubber/tools/manifestfile.py +654 -654
  138. stubber/tools/readme.md +6 -6
  139. stubber/update_fallback.py +117 -117
  140. stubber/update_module_list.py +123 -123
  141. stubber/utils/__init__.py +6 -6
  142. stubber/utils/config.py +137 -125
  143. stubber/utils/makeversionhdr.py +54 -54
  144. stubber/utils/manifest.py +90 -90
  145. stubber/utils/post.py +80 -79
  146. stubber/utils/repos.py +156 -150
  147. stubber/utils/stubmaker.py +139 -139
  148. stubber/utils/typed_config_toml.py +80 -77
  149. stubber/variants.py +106 -106
  150. micropython_stubber-1.23.1.dist-info/RECORD +0 -159
  151. micropython_stubber-1.23.1.dist-info/entry_points.txt +0 -3
  152. mpflash/basicgit.py +0 -288
  153. {micropython_stubber-1.23.1.dist-info → micropython_stubber-1.23.2.dist-info}/WHEEL +0 -0
@@ -1,113 +1,126 @@
1
- """
2
- Freeze manifest files for micropython 1.16 and later
3
- uses the manifest file to generate frozen stubs
4
-
5
- """
6
-
7
- import os
8
- import shutil
9
- from pathlib import Path
10
- from typing import List, Optional
11
-
12
- from loguru import logger as log
13
-
14
- from stubber import utils
15
- from stubber.tools.manifestfile import MODE_FREEZE, ManifestFile, ManifestFileError, ManifestOutput
16
- from stubber.utils.config import CONFIG
17
-
18
- from .common import apply_frozen_module_fixes, get_freeze_path, get_portboard
19
-
20
-
21
- def make_path_vars(
22
- *,
23
- mpy_path: Path = CONFIG.mpy_path,
24
- mpy_lib_path: Path = CONFIG.mpy_lib_path, # ? if <= 1.19.1
25
- port: Optional[str] = None,
26
- board: Optional[str] = None,
27
- ):
28
- if port is None or port == "": # pragma: no cover
29
- port_path = mpy_path
30
- else:
31
- port_path = mpy_path / "ports" / port
32
-
33
- if board is None or board == "": # pragma: no cover
34
- board_path = port_path
35
- else:
36
- board_path = port_path / "boards" / board
37
-
38
- log.trace(f"port_path : {port_path}")
39
- log.trace(f"board_path: {board_path}")
40
- if not port_path.exists(): # pragma: no cover
41
- raise ValueError("port board path not found")
42
- if not board_path.exists(): # pragma: no cover
43
- raise ValueError("board path not found")
44
-
45
- # VARS must be absolute paths
46
- return {
47
- "MPY_DIR": mpy_path.absolute().as_posix(),
48
- "MPY_LIB_DIR": mpy_lib_path.absolute().as_posix(),
49
- "PORT_DIR": port_path.absolute().as_posix(),
50
- "BOARD_DIR": board_path.absolute().as_posix(),
51
- }
52
-
53
-
54
- def freeze_one_manifest_2(manifest: Path, frozen_stub_path: Path, mpy_path: Path, mpy_lib_path: Path, version: str):
55
- # apparently there can be multiple manifest files to a board ?
56
- # save cwd for 'misbehaving' older esp8266 manifest files
57
- cwd = Path.cwd()
58
- # so we need to get the port and board from the path
59
- log.debug(f"input_manifest: {manifest}")
60
- port, board = get_portboard(manifest)
61
-
62
- log.info("port-board: {}".format((port + "-" + board).rstrip("-")))
63
-
64
- path_vars = make_path_vars(port=port, board=board, mpy_path=mpy_path, mpy_lib_path=mpy_lib_path)
65
- upy_manifest = ManifestFile(MODE_FREEZE, path_vars)
66
- try:
67
- # assume manifestneeds to be run from the port's folder
68
- os.chdir(path_vars["PORT_DIR"])
69
- upy_manifest.execute(manifest.as_posix())
70
- except ManifestFileError as er:
71
- log.error('freeze error executing "{}": {}'.format(manifest, er.args[0]))
72
- raise er
73
- log.debug(f"total {len(upy_manifest.files())} files")
74
-
75
- # restore working directory
76
- os.chdir(cwd)
77
- # save the frozen files to the stubs
78
- copy_frozen_to_stubs(frozen_stub_path, port, board, upy_manifest.files(), version, mpy_path=mpy_path)
79
-
80
-
81
- def copy_frozen_to_stubs(
82
- stub_path: Path, port: str, board: str, files: List[ManifestOutput], version: str, mpy_path: Path
83
- ):
84
- """
85
- copy the frozen files from the manifest to the stubs folder
86
-
87
- stubpath = the destination : # stubs/{family}-{version}-frozen
88
- """
89
- freeze_path, board = get_freeze_path(stub_path, port, board)
90
-
91
- log.debug(f"copy frozen: {port}-{board} to {freeze_path}")
92
- freeze_path.mkdir(parents=True, exist_ok=True)
93
- # clean target folder
94
- shutil.rmtree(freeze_path, ignore_errors=True)
95
-
96
- # print(tabulate(files))
97
- # copy the frozen files to the stubs
98
- for f in files:
99
- dest = freeze_path / f.target_path
100
- log.trace(f"copying {f.full_path} to {f.target_path}")
101
- dest.parent.mkdir(parents=True, exist_ok=True)
102
- try:
103
- shutil.copy(f.full_path, dest)
104
- except OSError as er:
105
- log.warning(f"error copying {f.full_path} to {dest}: {er}")
106
- raise er
107
- # try to continue
108
-
109
- apply_frozen_module_fixes(freeze_path, mpy_path=mpy_path)
110
-
111
- # make a module manifest
112
- FAMILY = "micropython"
113
- utils.make_manifest(freeze_path, FAMILY, port=port, board=board, version=version, stubtype="frozen")
1
+ """
2
+ Freeze manifest files for micropython 1.16 and later
3
+ uses the manifest file to generate frozen stubs
4
+
5
+ """
6
+
7
+ import os
8
+ import shutil
9
+ from pathlib import Path
10
+ from typing import List, Optional
11
+
12
+ from mpflash.logger import log
13
+
14
+ from stubber import utils
15
+ from stubber.tools.manifestfile import MODE_FREEZE, ManifestFile, ManifestFileError, ManifestOutput
16
+ from stubber.utils.config import CONFIG
17
+
18
+ from .common import apply_frozen_module_fixes, get_freeze_path, get_portboard
19
+
20
+
21
+ def make_path_vars(
22
+ *,
23
+ mpy_path: Path = CONFIG.mpy_path,
24
+ mpy_lib_path: Path = CONFIG.mpy_lib_path, # ? if <= 1.19.1
25
+ port: Optional[str] = None,
26
+ board: Optional[str] = None,
27
+ ):
28
+ if port is None or port == "": # pragma: no cover
29
+ port_path = mpy_path
30
+ else:
31
+ port_path = mpy_path / "ports" / port
32
+
33
+ if board is None or board == "": # pragma: no cover
34
+ board_path = port_path
35
+ else:
36
+ board_path = port_path / "boards" / board
37
+
38
+ log.trace(f"port_path : {port_path}")
39
+ log.trace(f"board_path: {board_path}")
40
+ if not port_path.exists(): # pragma: no cover
41
+ raise ValueError("port board path not found")
42
+ if not board_path.exists(): # pragma: no cover
43
+ raise ValueError("board path not found")
44
+
45
+ # VARS must be absolute paths
46
+ return {
47
+ "MPY_DIR": mpy_path.absolute().as_posix(),
48
+ "MPY_LIB_DIR": mpy_lib_path.absolute().as_posix(),
49
+ "PORT_DIR": port_path.absolute().as_posix(),
50
+ "BOARD_DIR": board_path.absolute().as_posix(),
51
+ }
52
+
53
+
54
+ def freeze_one_manifest_2(
55
+ manifest: Path, frozen_stub_path: Path, mpy_path: Path, mpy_lib_path: Path, version: str
56
+ ):
57
+ # apparently there can be multiple manifest files to a board ?
58
+ # save cwd for 'misbehaving' older esp8266 manifest files
59
+ cwd = Path.cwd()
60
+ # so we need to get the port and board from the path
61
+ log.debug(f"input_manifest: {manifest}")
62
+ port, board = get_portboard(manifest)
63
+
64
+ log.info("port-board: {}".format((port + "-" + board).rstrip("-")))
65
+
66
+ path_vars = make_path_vars(
67
+ port=port, board=board, mpy_path=mpy_path, mpy_lib_path=mpy_lib_path
68
+ )
69
+ upy_manifest = ManifestFile(MODE_FREEZE, path_vars)
70
+ try:
71
+ # assume manifestneeds to be run from the port's folder
72
+ os.chdir(path_vars["PORT_DIR"])
73
+ upy_manifest.execute(manifest.as_posix())
74
+ except ManifestFileError as er:
75
+ log.error('freeze error executing "{}": {}'.format(manifest, er.args[0]))
76
+ raise er
77
+ log.debug(f"total {len(upy_manifest.files())} files")
78
+
79
+ # restore working directory
80
+ os.chdir(cwd)
81
+ # save the frozen files to the stubs
82
+ copy_frozen_to_stubs(
83
+ frozen_stub_path, port, board, upy_manifest.files(), version, mpy_path=mpy_path
84
+ )
85
+
86
+
87
+ def copy_frozen_to_stubs(
88
+ stub_path: Path,
89
+ port: str,
90
+ board: str,
91
+ files: List[ManifestOutput],
92
+ version: str,
93
+ mpy_path: Path,
94
+ ):
95
+ """
96
+ copy the frozen files from the manifest to the stubs folder
97
+
98
+ stubpath = the destination : # stubs/{family}-{version}-frozen
99
+ """
100
+ freeze_path, board = get_freeze_path(stub_path, port, board)
101
+
102
+ log.debug(f"copy frozen: {port}-{board} to {freeze_path}")
103
+ freeze_path.mkdir(parents=True, exist_ok=True)
104
+ # clean target folder
105
+ shutil.rmtree(freeze_path, ignore_errors=True)
106
+
107
+ # print(tabulate(files))
108
+ # copy the frozen files to the stubs
109
+ for f in files:
110
+ dest = freeze_path / f.target_path
111
+ log.trace(f"copying {f.full_path} to {f.target_path}")
112
+ dest.parent.mkdir(parents=True, exist_ok=True)
113
+ try:
114
+ shutil.copy(f.full_path, dest)
115
+ except OSError as er:
116
+ log.warning(f"error copying {f.full_path} to {dest}: {er}")
117
+ raise er
118
+ # try to continue
119
+
120
+ apply_frozen_module_fixes(freeze_path, mpy_path=mpy_path)
121
+
122
+ # make a module manifest
123
+ FAMILY = "micropython"
124
+ utils.make_manifest(
125
+ freeze_path, FAMILY, port=port, board=board, version=version, stubtype="frozen"
126
+ )
@@ -1,127 +1,131 @@
1
- #!/usr/bin/env python3
2
- """
3
- Collect modules and python stubs from MicroPython source projects (v1.12 +) and stores them in the all_stubs folder
4
- The all_stubs folder should be mapped/symlinked to the micropython_stubs/stubs repo/folder
5
-
6
- """
7
-
8
- # Copyright (c) 2020 Jos Verlinde
9
- # MIT license
10
- # some functions used from micropython/micropython/tools/makemanifest.py,
11
- # part of the MicroPython project, http://micropython.org/
12
- # Copyright (c) 2019 Damien P. George
13
-
14
- # locating frozen modules :
15
- # tested on MicroPython v1.12 - v1.13
16
- # - 1.16 - using manifests.py, include can specify kwargs
17
- # - 1.13 - using manifests.py, and support for variant
18
- # - 1.12 - using manifests.py, possible also include content of /port/modules folder ?
19
- # - 1.11 and older - include content of /port/modules folder if it exists
20
- import os
21
- import shutil # start moving from os & glob to pathlib
22
- from pathlib import Path
23
- from typing import List, Optional
24
-
25
- from loguru import logger as log
26
- from packaging.version import Version
27
-
28
- from mpflash.versions import SET_PREVIEW, V_PREVIEW
29
- from stubber import utils
30
- from stubber.freeze.freeze_folder import freeze_folders # Micropython < v1.12
31
- from stubber.freeze.freeze_manifest_2 import freeze_one_manifest_2
32
- from stubber.utils.config import CONFIG
33
-
34
- FAMILY = "micropython"
35
-
36
-
37
- def get_manifests(mpy_path: Path) -> List[Path]:
38
- """
39
- Returns a list of all manifests.py files found in the ports folder of the MicroPython repo
40
- """
41
- log.info(f"looking for manifests in {mpy_path}")
42
- all_manifests = [
43
- m.absolute()
44
- for m in (mpy_path / "ports").rglob("manifest.py")
45
- if Path(m).parent.name != "coverage" and "venv" not in m.parts and ".venv" not in m.parts
46
- ]
47
- log.info(f"manifests found: {len(all_manifests)}")
48
- return all_manifests
49
-
50
-
51
- def add_comment_to_path(path: Path, comment: str) -> None:
52
- """
53
- Add a comment to the top of each file in the path
54
- using a codemod
55
- """
56
- # TODO: #305 add comment line to each file with the micropython version it was generated from
57
- # frozen_stub_path
58
- # python -m libcst.tool codemod --include-stubs --no-format add_comment.AddComment .\repos\micropython-stubs\stubs\micropython-v1_19_1-frozen\ --comment "# Micropython 1.19.1 frozen stubs"
59
- pass
60
-
61
-
62
- def freeze_any(
63
- stub_folder: Optional[Path] = None,
64
- version: str = V_PREVIEW,
65
- mpy_path: Optional[Path] = None,
66
- mpy_lib_path: Optional[Path] = None,
67
- ) -> Path:
68
- """
69
- Get and parse the to-be-frozen .py modules for micropython to extract the static type information
70
- - requires that the MicroPython and Micropython-lib repos are checked out and available on a local path
71
- - repos should be cloned side-by-side as some of the manifests refer to micropython-lib scripts using a relative path
72
-
73
- The micropython-* repos must be checked out to the required version/tag.
74
-
75
- """
76
- count = 0
77
- current_dir = os.getcwd()
78
- mpy_path = Path(mpy_path).absolute() if mpy_path else CONFIG.mpy_path.absolute()
79
- mpy_lib_path = Path(mpy_lib_path).absolute() if mpy_lib_path else CONFIG.mpy_path.absolute()
80
-
81
- # if old version of micropython, use the old freeze method
82
- if version not in SET_PREVIEW and Version(version) <= Version("1.11"):
83
- frozen_stub_path = get_fsp(version, stub_folder)
84
- log.debug("MicroPython v1.11, older or other")
85
- # others
86
- modules = freeze_folders(frozen_stub_path.as_posix(), mpy_path.as_posix(), mpy_lib_path.as_posix(), version)
87
- count = len(modules)
88
- else:
89
- # get the current checked out version
90
- version = utils.checkedout_version(CONFIG.mpy_path)
91
-
92
- frozen_stub_path = get_fsp(version, stub_folder)
93
- # get the manifests of the different ports and boards
94
- all_manifests = get_manifests(mpy_path)
95
-
96
- # process all_manifests under the ports folder and update the frozen files in the stubs folder
97
- # we are going to jump around, avoid relative paths
98
- mpy_path = mpy_path.absolute()
99
- mpy_lib_path = mpy_lib_path.absolute()
100
-
101
- if len(all_manifests) > 0:
102
- log.info(f"manifests: {len(all_manifests)}")
103
- shutil.rmtree(frozen_stub_path, ignore_errors=True)
104
- else:
105
- log.warning("no manifests found")
106
- for manifest in all_manifests:
107
- try:
108
- freeze_one_manifest_2(manifest, frozen_stub_path, mpy_path, mpy_lib_path, version)
109
- count += 1
110
- except Exception as e:
111
- log.error(f"Error processing manifest {manifest} : {e}")
112
-
113
- # add comment line to each file with the micropython version it was generated from
114
- add_comment_to_path(frozen_stub_path, f"# Micropython {version} frozen stubs")
115
-
116
- # restore cwd
117
- os.chdir(current_dir)
118
- return frozen_stub_path
119
-
120
-
121
- def get_fsp(version: str, stub_folder: Optional[Path] = None) -> Path:
122
- if not stub_folder:
123
- frozen_stub_path = CONFIG.stub_path / f"{FAMILY}-{utils.clean_version(version, flat=True)}-frozen"
124
- frozen_stub_path = frozen_stub_path.absolute()
125
- else:
126
- frozen_stub_path: Path = Path(stub_folder).absolute()
127
- return frozen_stub_path
1
+ #!/usr/bin/env python3
2
+ """
3
+ Collect modules and python stubs from MicroPython source projects (v1.12 +) and stores them in the all_stubs folder
4
+ The all_stubs folder should be mapped/symlinked to the micropython_stubs/stubs repo/folder
5
+
6
+ """
7
+
8
+ # Copyright (c) 2020 Jos Verlinde
9
+ # MIT license
10
+ # some functions used from micropython/micropython/tools/makemanifest.py,
11
+ # part of the MicroPython project, http://micropython.org/
12
+ # Copyright (c) 2019 Damien P. George
13
+
14
+ # locating frozen modules :
15
+ # tested on MicroPython v1.12 - v1.13
16
+ # - 1.16 - using manifests.py, include can specify kwargs
17
+ # - 1.13 - using manifests.py, and support for variant
18
+ # - 1.12 - using manifests.py, possible also include content of /port/modules folder ?
19
+ # - 1.11 and older - include content of /port/modules folder if it exists
20
+ import os
21
+ import shutil # start moving from os & glob to pathlib
22
+ from pathlib import Path
23
+ from typing import List, Optional
24
+
25
+ from mpflash.logger import log
26
+ from packaging.version import Version
27
+
28
+ from mpflash.versions import SET_PREVIEW, V_PREVIEW
29
+ from stubber import utils
30
+ from stubber.freeze.freeze_folder import freeze_folders # Micropython < v1.12
31
+ from stubber.freeze.freeze_manifest_2 import freeze_one_manifest_2
32
+ from stubber.utils.config import CONFIG
33
+
34
+ FAMILY = "micropython"
35
+
36
+
37
+ def get_manifests(mpy_path: Path) -> List[Path]:
38
+ """
39
+ Returns a list of all manifests.py files found in the ports folder of the MicroPython repo
40
+ """
41
+ log.info(f"looking for manifests in {mpy_path}")
42
+ all_manifests = [
43
+ m.absolute()
44
+ for m in (mpy_path / "ports").rglob("manifest.py")
45
+ if Path(m).parent.name != "coverage" and "venv" not in m.parts and ".venv" not in m.parts
46
+ ]
47
+ log.info(f"manifests found: {len(all_manifests)}")
48
+ return all_manifests
49
+
50
+
51
+ def add_comment_to_path(path: Path, comment: str) -> None:
52
+ """
53
+ Add a comment to the top of each file in the path
54
+ using a codemod
55
+ """
56
+ # TODO: #305 add comment line to each file with the micropython version it was generated from
57
+ # frozen_stub_path
58
+ # python -m libcst.tool codemod --include-stubs --no-format add_comment.AddComment .\repos\micropython-stubs\stubs\micropython-v1_19_1-frozen\ --comment "# Micropython 1.19.1 frozen stubs"
59
+ pass
60
+
61
+
62
+ def freeze_any(
63
+ stub_folder: Optional[Path] = None,
64
+ version: str = V_PREVIEW,
65
+ mpy_path: Optional[Path] = None,
66
+ mpy_lib_path: Optional[Path] = None,
67
+ ) -> Path:
68
+ """
69
+ Get and parse the to-be-frozen .py modules for micropython to extract the static type information
70
+ - requires that the MicroPython and Micropython-lib repos are checked out and available on a local path
71
+ - repos should be cloned side-by-side as some of the manifests refer to micropython-lib scripts using a relative path
72
+
73
+ The micropython-* repos must be checked out to the required version/tag.
74
+
75
+ """
76
+ count = 0
77
+ current_dir = os.getcwd()
78
+ mpy_path = Path(mpy_path).absolute() if mpy_path else CONFIG.mpy_path.absolute()
79
+ mpy_lib_path = Path(mpy_lib_path).absolute() if mpy_lib_path else CONFIG.mpy_path.absolute()
80
+
81
+ # if old version of micropython, use the old freeze method
82
+ if version not in SET_PREVIEW and Version(version) <= Version("1.11"):
83
+ frozen_stub_path = get_fsp(version, stub_folder)
84
+ log.debug("MicroPython v1.11, older or other")
85
+ # others
86
+ modules = freeze_folders(
87
+ frozen_stub_path.as_posix(), mpy_path.as_posix(), mpy_lib_path.as_posix(), version
88
+ )
89
+ count = len(modules)
90
+ else:
91
+ # get the current checked out version
92
+ version = utils.checkedout_version(CONFIG.mpy_path)
93
+
94
+ frozen_stub_path = get_fsp(version, stub_folder)
95
+ # get the manifests of the different ports and boards
96
+ all_manifests = get_manifests(mpy_path)
97
+
98
+ # process all_manifests under the ports folder and update the frozen files in the stubs folder
99
+ # we are going to jump around, avoid relative paths
100
+ mpy_path = mpy_path.absolute()
101
+ mpy_lib_path = mpy_lib_path.absolute()
102
+
103
+ if len(all_manifests) > 0:
104
+ log.info(f"manifests: {len(all_manifests)}")
105
+ shutil.rmtree(frozen_stub_path, ignore_errors=True)
106
+ else:
107
+ log.warning("no manifests found")
108
+ for manifest in all_manifests:
109
+ try:
110
+ freeze_one_manifest_2(manifest, frozen_stub_path, mpy_path, mpy_lib_path, version)
111
+ count += 1
112
+ except Exception as e:
113
+ log.error(f"Error processing manifest {manifest} : {e}")
114
+
115
+ # add comment line to each file with the micropython version it was generated from
116
+ add_comment_to_path(frozen_stub_path, f"# Micropython {version} frozen stubs")
117
+
118
+ # restore cwd
119
+ os.chdir(current_dir)
120
+ return frozen_stub_path
121
+
122
+
123
+ def get_fsp(version: str, stub_folder: Optional[Path] = None) -> Path:
124
+ if not stub_folder:
125
+ frozen_stub_path = (
126
+ CONFIG.stub_path / f"{FAMILY}-{utils.clean_version(version, flat=True)}-frozen"
127
+ )
128
+ frozen_stub_path = frozen_stub_path.absolute()
129
+ else:
130
+ frozen_stub_path: Path = Path(stub_folder).absolute()
131
+ return frozen_stub_path