micropython-stubber 1.23.1.post1__py3-none-any.whl → 1.23.3__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 (149) hide show
  1. {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.3.dist-info}/LICENSE +30 -30
  2. {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.3.dist-info}/METADATA +5 -5
  3. micropython_stubber-1.23.3.dist-info/RECORD +158 -0
  4. mpflash/README.md +220 -220
  5. mpflash/libusb_flash.ipynb +203 -203
  6. mpflash/mpflash/add_firmware.py +98 -98
  7. mpflash/mpflash/ask_input.py +236 -236
  8. mpflash/mpflash/basicgit.py +304 -284
  9. mpflash/mpflash/bootloader/__init__.py +2 -2
  10. mpflash/mpflash/bootloader/activate.py +60 -60
  11. mpflash/mpflash/bootloader/detect.py +82 -82
  12. mpflash/mpflash/bootloader/manual.py +101 -101
  13. mpflash/mpflash/bootloader/micropython.py +12 -12
  14. mpflash/mpflash/bootloader/touch1200.py +36 -36
  15. mpflash/mpflash/cli_download.py +129 -129
  16. mpflash/mpflash/cli_flash.py +224 -216
  17. mpflash/mpflash/cli_group.py +111 -111
  18. mpflash/mpflash/cli_list.py +87 -87
  19. mpflash/mpflash/cli_main.py +39 -39
  20. mpflash/mpflash/common.py +207 -166
  21. mpflash/mpflash/config.py +44 -44
  22. mpflash/mpflash/connected.py +96 -77
  23. mpflash/mpflash/download.py +364 -364
  24. mpflash/mpflash/downloaded.py +130 -130
  25. mpflash/mpflash/errors.py +9 -9
  26. mpflash/mpflash/flash/__init__.py +55 -55
  27. mpflash/mpflash/flash/esp.py +59 -59
  28. mpflash/mpflash/flash/stm32.py +19 -19
  29. mpflash/mpflash/flash/stm32_dfu.py +104 -104
  30. mpflash/mpflash/flash/uf2/__init__.py +88 -88
  31. mpflash/mpflash/flash/uf2/boardid.py +15 -15
  32. mpflash/mpflash/flash/uf2/linux.py +136 -130
  33. mpflash/mpflash/flash/uf2/macos.py +42 -42
  34. mpflash/mpflash/flash/uf2/uf2disk.py +12 -12
  35. mpflash/mpflash/flash/uf2/windows.py +43 -43
  36. mpflash/mpflash/flash/worklist.py +170 -170
  37. mpflash/mpflash/list.py +106 -106
  38. mpflash/mpflash/logger.py +41 -41
  39. mpflash/mpflash/mpboard_id/__init__.py +93 -93
  40. mpflash/mpflash/mpboard_id/add_boards.py +251 -251
  41. mpflash/mpflash/mpboard_id/board.py +37 -37
  42. mpflash/mpflash/mpboard_id/board_id.py +86 -86
  43. mpflash/mpflash/mpboard_id/store.py +48 -43
  44. mpflash/mpflash/mpremoteboard/__init__.py +266 -266
  45. mpflash/mpflash/mpremoteboard/mpy_fw_info.py +152 -141
  46. mpflash/mpflash/mpremoteboard/runner.py +140 -140
  47. mpflash/mpflash/vendor/click_aliases.py +91 -91
  48. mpflash/mpflash/vendor/dfu.py +165 -165
  49. mpflash/mpflash/vendor/pydfu.py +605 -605
  50. mpflash/mpflash/vendor/readme.md +2 -2
  51. mpflash/mpflash/versions.py +135 -135
  52. mpflash/poetry.lock +1687 -1599
  53. mpflash/pyproject.toml +65 -65
  54. mpflash/stm32_udev_rules.md +62 -62
  55. stubber/__init__.py +3 -3
  56. stubber/board/board_info.csv +193 -193
  57. stubber/board/boot.py +34 -34
  58. stubber/board/createstubs.py +986 -986
  59. stubber/board/createstubs_db.py +825 -825
  60. stubber/board/createstubs_db_min.py +331 -331
  61. stubber/board/createstubs_lvgl.py +741 -741
  62. stubber/board/createstubs_lvgl_min.py +741 -741
  63. stubber/board/createstubs_mem.py +766 -766
  64. stubber/board/createstubs_mem_min.py +306 -306
  65. stubber/board/createstubs_min.py +294 -294
  66. stubber/board/fw_info.py +141 -141
  67. stubber/board/info.py +183 -183
  68. stubber/board/main.py +19 -19
  69. stubber/board/modulelist.txt +247 -247
  70. stubber/board/pyrightconfig.json +34 -34
  71. stubber/bulk/mcu_stubber.py +437 -437
  72. stubber/codemod/_partials/__init__.py +48 -48
  73. stubber/codemod/_partials/db_main.py +147 -147
  74. stubber/codemod/_partials/lvgl_main.py +77 -77
  75. stubber/codemod/_partials/modules_reader.py +80 -80
  76. stubber/codemod/add_comment.py +53 -53
  77. stubber/codemod/add_method.py +65 -65
  78. stubber/codemod/board.py +317 -317
  79. stubber/codemod/enrich.py +145 -145
  80. stubber/codemod/merge_docstub.py +284 -284
  81. stubber/codemod/modify_list.py +54 -54
  82. stubber/codemod/utils.py +56 -56
  83. stubber/commands/build_cmd.py +94 -94
  84. stubber/commands/cli.py +49 -49
  85. stubber/commands/clone_cmd.py +78 -78
  86. stubber/commands/config_cmd.py +29 -29
  87. stubber/commands/enrich_folder_cmd.py +71 -71
  88. stubber/commands/get_core_cmd.py +71 -71
  89. stubber/commands/get_docstubs_cmd.py +92 -92
  90. stubber/commands/get_frozen_cmd.py +117 -117
  91. stubber/commands/get_mcu_cmd.py +102 -102
  92. stubber/commands/merge_cmd.py +66 -66
  93. stubber/commands/publish_cmd.py +118 -118
  94. stubber/commands/stub_cmd.py +31 -31
  95. stubber/commands/switch_cmd.py +62 -62
  96. stubber/commands/variants_cmd.py +48 -48
  97. stubber/cst_transformer.py +178 -178
  98. stubber/data/board_info.csv +193 -193
  99. stubber/data/board_info.json +1729 -1729
  100. stubber/data/micropython_tags.csv +15 -15
  101. stubber/data/requirements-core-micropython.txt +38 -38
  102. stubber/data/requirements-core-pycopy.txt +39 -39
  103. stubber/downloader.py +37 -37
  104. stubber/freeze/common.py +72 -72
  105. stubber/freeze/freeze_folder.py +69 -69
  106. stubber/freeze/freeze_manifest_2.py +126 -126
  107. stubber/freeze/get_frozen.py +131 -131
  108. stubber/get_cpython.py +112 -112
  109. stubber/get_lobo.py +59 -59
  110. stubber/minify.py +423 -423
  111. stubber/publish/bump.py +86 -86
  112. stubber/publish/candidates.py +275 -275
  113. stubber/publish/database.py +18 -18
  114. stubber/publish/defaults.py +40 -40
  115. stubber/publish/enums.py +24 -24
  116. stubber/publish/helpers.py +29 -29
  117. stubber/publish/merge_docstubs.py +132 -132
  118. stubber/publish/missing_class_methods.py +51 -51
  119. stubber/publish/package.py +150 -150
  120. stubber/publish/pathnames.py +51 -51
  121. stubber/publish/publish.py +120 -120
  122. stubber/publish/pypi.py +42 -42
  123. stubber/publish/stubpackage.py +1051 -1051
  124. stubber/rst/__init__.py +9 -9
  125. stubber/rst/classsort.py +78 -78
  126. stubber/rst/lookup.py +531 -531
  127. stubber/rst/output_dict.py +401 -401
  128. stubber/rst/reader.py +814 -814
  129. stubber/rst/report_return.py +77 -77
  130. stubber/rst/rst_utils.py +541 -541
  131. stubber/stubber.py +38 -38
  132. stubber/stubs_from_docs.py +90 -90
  133. stubber/tools/manifestfile.py +654 -654
  134. stubber/tools/readme.md +6 -6
  135. stubber/update_fallback.py +117 -117
  136. stubber/update_module_list.py +123 -123
  137. stubber/utils/__init__.py +6 -6
  138. stubber/utils/config.py +137 -137
  139. stubber/utils/makeversionhdr.py +54 -54
  140. stubber/utils/manifest.py +90 -90
  141. stubber/utils/post.py +80 -80
  142. stubber/utils/repos.py +156 -156
  143. stubber/utils/stubmaker.py +139 -139
  144. stubber/utils/typed_config_toml.py +80 -80
  145. stubber/variants.py +106 -106
  146. micropython_stubber-1.23.1.post1.dist-info/RECORD +0 -159
  147. mpflash/basicgit.py +0 -288
  148. {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.3.dist-info}/WHEEL +0 -0
  149. {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.3.dist-info}/entry_points.txt +0 -0
@@ -1,126 +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 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
+ """
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,131 +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 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
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