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,113 +1,113 @@
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 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,127 +1,127 @@
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 stubber import utils
29
- from stubber.freeze.freeze_folder import freeze_folders # Micropython < v1.12
30
- from stubber.freeze.freeze_manifest_2 import freeze_one_manifest_2
31
- from stubber.utils.config import CONFIG
32
- from stubber.utils.versions import SET_PREVIEW, V_PREVIEW
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 loguru import logger as log
26
+ from packaging.version import Version
27
+
28
+ from stubber import utils
29
+ from stubber.freeze.freeze_folder import freeze_folders # Micropython < v1.12
30
+ from stubber.freeze.freeze_manifest_2 import freeze_one_manifest_2
31
+ from stubber.utils.config import CONFIG
32
+ from stubber.utils.versions import SET_PREVIEW, V_PREVIEW
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