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
stubber/utils/post.py CHANGED
@@ -1,79 +1,80 @@
1
- """Pre/Post Processing for createstubs.py"""
2
- import subprocess
3
- import sys
4
- from pathlib import Path
5
- from typing import List
6
-
7
- import autoflake
8
- from loguru import logger as log
9
-
10
- from .stubmaker import generate_pyi_files
11
-
12
-
13
- def do_post_processing(stub_paths: List[Path], stubgen: bool, black: bool, autoflake: bool):
14
- "Common post processing"
15
- for path in stub_paths:
16
- if stubgen:
17
- log.debug("Generate type hint files (pyi) in folder: {}".format(path))
18
- generate_pyi_files(path)
19
- if black:
20
- run_black(path)
21
- if autoflake:
22
- run_autoflake(path, process_pyi=True)
23
-
24
-
25
- def run_black(path: Path, capture_output: bool = False):
26
- """
27
- run black to format the code / stubs
28
- """
29
- log.debug("Running black on: {}".format(path))
30
- cmd = [
31
- sys.executable,
32
- "-m",
33
- "black",
34
- path.as_posix(),
35
- "--line-length",
36
- "140",
37
- ]
38
- result = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8")
39
-
40
- return result.returncode
41
-
42
-
43
- def run_autoflake(path: Path, capture_output: bool = False, process_pyi: bool = False):
44
- """
45
- run autoflake to remove unused imports
46
- needs to be run BEFORE black otherwise it does not recognize long import from`s.
47
- note: is run file-by-file to include processing .pyi files
48
- """
49
- if not path.exists():
50
- log.warning(f"Path does not exist: {path}")
51
- return -1
52
- log.info(f"Running autoflake on: {path}")
53
- # create a list of files to be formatted
54
- files: List[str] = []
55
- files.extend([str(f) for f in path.rglob("*.py")])
56
- if process_pyi:
57
- files.extend([str(f) for f in path.rglob("*.pyi")])
58
-
59
- # build an argument list
60
- autoflake_args = {
61
- "write_to_stdout": False, # print changed text to stdout
62
- "in_place": True, # make changes to files instead of printing diffs
63
- "remove_all_unused_imports": False,
64
- "ignore_init_module_imports": False, # exclude __init__.py when removing unused imports
65
- "expand_star_imports": False,
66
- "remove_duplicate_keys": False,
67
- "remove_unused_variables": False, # remove all unused imports (not just those from the standard library)
68
- "remove_rhs_for_unused_variables": False,
69
- "ignore_pass_statements": False, # remove pass when superfluous
70
- "ignore_pass_after_docstring": False, # ignore pass statements after a newline ending on '"""'
71
- "check": False, # return error code if changes are needed
72
- "check_diff": False,
73
- "quiet": False,
74
- }
75
- # format the files
76
- exit_status = 0
77
- for name in files:
78
- log.debug(f"Running autoflake on: {name}")
79
- exit_status |= autoflake.fix_file(name, args=autoflake_args)
1
+ """Pre/Post Processing for createstubs.py"""
2
+
3
+ import subprocess
4
+ import sys
5
+ from pathlib import Path
6
+ from typing import List
7
+
8
+ import autoflake
9
+ from mpflash.logger import log
10
+
11
+ from .stubmaker import generate_pyi_files
12
+
13
+
14
+ def do_post_processing(stub_paths: List[Path], stubgen: bool, black: bool, autoflake: bool):
15
+ "Common post processing"
16
+ for path in stub_paths:
17
+ if stubgen:
18
+ log.debug("Generate type hint files (pyi) in folder: {}".format(path))
19
+ generate_pyi_files(path)
20
+ if black:
21
+ run_black(path)
22
+ if autoflake:
23
+ run_autoflake(path, process_pyi=True)
24
+
25
+
26
+ def run_black(path: Path, capture_output: bool = False):
27
+ """
28
+ run black to format the code / stubs
29
+ """
30
+ log.debug("Running black on: {}".format(path))
31
+ cmd = [
32
+ sys.executable,
33
+ "-m",
34
+ "black",
35
+ path.as_posix(),
36
+ "--line-length",
37
+ "140",
38
+ ]
39
+ result = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8")
40
+
41
+ return result.returncode
42
+
43
+
44
+ def run_autoflake(path: Path, capture_output: bool = False, process_pyi: bool = False):
45
+ """
46
+ run autoflake to remove unused imports
47
+ needs to be run BEFORE black otherwise it does not recognize long import from`s.
48
+ note: is run file-by-file to include processing .pyi files
49
+ """
50
+ if not path.exists():
51
+ log.warning(f"Path does not exist: {path}")
52
+ return -1
53
+ log.info(f"Running autoflake on: {path}")
54
+ # create a list of files to be formatted
55
+ files: List[str] = []
56
+ files.extend([str(f) for f in path.rglob("*.py")])
57
+ if process_pyi:
58
+ files.extend([str(f) for f in path.rglob("*.pyi")])
59
+
60
+ # build an argument list
61
+ autoflake_args = {
62
+ "write_to_stdout": False, # print changed text to stdout
63
+ "in_place": True, # make changes to files instead of printing diffs
64
+ "remove_all_unused_imports": False,
65
+ "ignore_init_module_imports": False, # exclude __init__.py when removing unused imports
66
+ "expand_star_imports": False,
67
+ "remove_duplicate_keys": False,
68
+ "remove_unused_variables": False, # remove all unused imports (not just those from the standard library)
69
+ "remove_rhs_for_unused_variables": False,
70
+ "ignore_pass_statements": False, # remove pass when superfluous
71
+ "ignore_pass_after_docstring": False, # ignore pass statements after a newline ending on '"""'
72
+ "check": False, # return error code if changes are needed
73
+ "check_diff": False,
74
+ "quiet": False,
75
+ }
76
+ # format the files
77
+ exit_status = 0
78
+ for name in files:
79
+ log.debug(f"Running autoflake on: {name}")
80
+ exit_status |= autoflake.fix_file(name, args=autoflake_args)
stubber/utils/repos.py CHANGED
@@ -1,150 +1,156 @@
1
- """ utility functions to handle to cloned repos needed for stubbing."""
2
-
3
- import csv
4
- import os
5
- import pkgutil
6
- import tempfile
7
- from collections import defaultdict
8
- from pathlib import Path
9
- from typing import Tuple
10
-
11
- from loguru import logger as log
12
- from packaging.version import Version
13
-
14
- import mpflash.basicgit as git
15
- from mpflash.versions import SET_PREVIEW, V_PREVIEW, get_stable_mp_version
16
- from stubber.utils.config import CONFIG
17
-
18
- # # log = logging.getLogger(__name__)
19
-
20
-
21
- def switch(tag: str, *, mpy_path: Path, mpy_lib_path: Path):
22
- """
23
- Switch to a specific version of the micropython repos.
24
-
25
- Specify the version with --tag or --version to specify the version tag
26
- of the MicroPython repo.
27
- The Micropython-lib repo will be checked out to a commit that corresponds
28
- in time to that version tag, in order to allow non-current versions to be
29
- stubbed correctly.
30
-
31
- The repros must be cloned already
32
- """
33
- # fetch then switch
34
- git.fetch(mpy_path)
35
- git.fetch(mpy_lib_path)
36
-
37
- if not tag or tag in {"master", ""}:
38
- tag = V_PREVIEW
39
- if tag in SET_PREVIEW:
40
- git.switch_branch(repo=mpy_path, branch="master")
41
- else:
42
- git.checkout_tag(repo=mpy_path, tag=tag)
43
- match_lib_with_mpy(version_tag=tag, mpy_path=mpy_path, lib_path=mpy_lib_path)
44
-
45
-
46
- def read_micropython_lib_commits(filename: str = "data/micropython_tags.csv"):
47
- """
48
- Read a csv with the micropython version and matching micropython-lib commit-hashes
49
- these can be used to make sure that the correct micropython-lib version is checked out.
50
-
51
- filename is relative to the 'stubber' package
52
-
53
- git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags
54
- """
55
- data = pkgutil.get_data("stubber", filename)
56
- if not data:
57
- raise FileNotFoundError(f"Resource {filename} not found")
58
- version_commit = defaultdict() # lgtm [py/multiple-definition]
59
- with tempfile.NamedTemporaryFile(prefix="tags", suffix=".csv", mode="w+t") as ntf:
60
- ntf.file.write(data.decode(encoding="utf8"))
61
- ntf.file.seek(0)
62
- # read the csv file using DictReader
63
- reader = csv.DictReader(ntf.file, skipinitialspace=True) # dialect="excel",
64
- rows = list(reader)
65
- # create a dict version --> commit_hash
66
- version_commit = {row["version"].split("/")[-1]: row["lib_commit_hash"] for row in rows if row["version"].startswith("refs/tags/")}
67
- # add default
68
- version_commit = defaultdict(lambda: "master", version_commit)
69
- return version_commit
70
-
71
-
72
- def match_lib_with_mpy(version_tag: str, mpy_path: Path, lib_path: Path) -> bool:
73
- micropython_lib_commits = read_micropython_lib_commits()
74
- # Make sure that the correct micropython-lib release is checked out
75
- # check if micropython-lib has matching tags
76
- if version_tag in SET_PREVIEW:
77
- # micropython-lib is now a submodule
78
- result = git.checkout_commit("master", lib_path)
79
- if not result:
80
- log.error("Could not checkout micropython-lib @master")
81
- return False
82
-
83
- return git.sync_submodules(mpy_path)
84
- elif Version(version_tag) >= Version("v1.20.0"):
85
- # micropython-lib is now a submodule
86
- result = git.checkout_tag(version_tag, lib_path)
87
- if not result:
88
- log.warning(f"Could not checkout micropython-lib @{version_tag}")
89
- if not git.checkout_tag("master", lib_path):
90
- log.error("Could not checkout micropython-lib @master")
91
- return False
92
- return git.sync_submodules(mpy_path)
93
- else:
94
- log.info(f"Matching repo's: Micropython {version_tag} needs micropython-lib:{micropython_lib_commits[version_tag]}")
95
- return git.checkout_commit(micropython_lib_commits[version_tag], lib_path)
96
-
97
-
98
- def fetch_repos(tag: str, mpy_path: Path, mpy_lib_path: Path):
99
- """Fetch updates, then switch to the provided tag"""
100
- log.info("fetch updates")
101
- git.fetch(mpy_path)
102
- git.fetch(mpy_lib_path)
103
- try:
104
- git.fetch(CONFIG.mpy_stubs_path)
105
- except Exception:
106
- log.trace("no stubs repo found : {CONFIG.mpy_stubs_path}")
107
-
108
- if not tag:
109
- tag = V_PREVIEW
110
-
111
- log.info(f"Switching to {tag}")
112
- if tag == V_PREVIEW:
113
- git.switch_branch(repo=mpy_path, branch="master")
114
- else:
115
- if tag == "stable":
116
- tag = get_stable_mp_version()
117
- git.switch_tag(tag, repo=mpy_path)
118
- result = match_lib_with_mpy(version_tag=tag, mpy_path=mpy_path, lib_path=mpy_lib_path)
119
-
120
- log.info(f"{str(mpy_path):<40} {git.get_local_tag(mpy_path)}")
121
- log.info(f"{str(mpy_lib_path):<40} {git.get_local_tag(mpy_lib_path)}")
122
- try:
123
- sub_mod_path = mpy_path / "lib/micropython-lib"
124
- if (sub_mod_path / ".git").exists():
125
- log.info(f"{str(sub_mod_path):<40} {git.get_local_tag(sub_mod_path)}")
126
- except Exception:
127
- pass
128
- return result
129
-
130
-
131
- def repo_paths(dest_path: Path) -> Tuple[Path, Path]:
132
- """Return the paths to the micropython and micropython-lib repos, given a path to the repos.'"""
133
- if not dest_path.exists():
134
- os.mkdir(dest_path)
135
- # repos are relative to provided path
136
- if dest_path != CONFIG.repo_path:
137
- mpy_path = dest_path / "micropython"
138
- mpy_lib_path = dest_path / "micropython-lib"
139
- else:
140
- mpy_path = CONFIG.mpy_path
141
- mpy_lib_path = CONFIG.mpy_lib_path
142
-
143
- # if no repos then error
144
- if not (mpy_path / ".git").exists():
145
- log.error("micropython repo not found")
146
- raise LookupError
147
- if not (mpy_lib_path / ".git").exists():
148
- log.error("micropython-lib repo not found")
149
- raise LookupError
150
- return mpy_path, mpy_lib_path
1
+ """ utility functions to handle to cloned repos needed for stubbing."""
2
+
3
+ import csv
4
+ import os
5
+ import pkgutil
6
+ import tempfile
7
+ from collections import defaultdict
8
+ from pathlib import Path
9
+ from typing import Tuple
10
+
11
+ from mpflash.logger import log
12
+ from packaging.version import Version
13
+
14
+ import mpflash.basicgit as git
15
+ from mpflash.versions import SET_PREVIEW, V_PREVIEW, get_stable_mp_version
16
+ from stubber.utils.config import CONFIG
17
+
18
+ # # log = logging.getLogger(__name__)
19
+
20
+
21
+ def switch(tag: str, *, mpy_path: Path, mpy_lib_path: Path):
22
+ """
23
+ Switch to a specific version of the micropython repos.
24
+
25
+ Specify the version with --tag or --version to specify the version tag
26
+ of the MicroPython repo.
27
+ The Micropython-lib repo will be checked out to a commit that corresponds
28
+ in time to that version tag, in order to allow non-current versions to be
29
+ stubbed correctly.
30
+
31
+ The repros must be cloned already
32
+ """
33
+ # fetch then switch
34
+ git.fetch(mpy_path)
35
+ git.fetch(mpy_lib_path)
36
+
37
+ if not tag or tag in {"master", ""}:
38
+ tag = V_PREVIEW
39
+ if tag in SET_PREVIEW:
40
+ git.switch_branch(repo=mpy_path, branch="master")
41
+ else:
42
+ git.checkout_tag(repo=mpy_path, tag=tag)
43
+ match_lib_with_mpy(version_tag=tag, mpy_path=mpy_path, lib_path=mpy_lib_path)
44
+
45
+
46
+ def read_micropython_lib_commits(filename: str = "data/micropython_tags.csv"):
47
+ """
48
+ Read a csv with the micropython version and matching micropython-lib commit-hashes
49
+ these can be used to make sure that the correct micropython-lib version is checked out.
50
+
51
+ filename is relative to the 'stubber' package
52
+
53
+ git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags
54
+ """
55
+ data = pkgutil.get_data("stubber", filename)
56
+ if not data:
57
+ raise FileNotFoundError(f"Resource {filename} not found")
58
+ version_commit = defaultdict() # lgtm [py/multiple-definition]
59
+ with tempfile.NamedTemporaryFile(prefix="tags", suffix=".csv", mode="w+t") as ntf:
60
+ ntf.file.write(data.decode(encoding="utf8"))
61
+ ntf.file.seek(0)
62
+ # read the csv file using DictReader
63
+ reader = csv.DictReader(ntf.file, skipinitialspace=True) # dialect="excel",
64
+ rows = list(reader)
65
+ # create a dict version --> commit_hash
66
+ version_commit = {
67
+ row["version"].split("/")[-1]: row["lib_commit_hash"]
68
+ for row in rows
69
+ if row["version"].startswith("refs/tags/")
70
+ }
71
+ # add default
72
+ version_commit = defaultdict(lambda: "master", version_commit)
73
+ return version_commit
74
+
75
+
76
+ def match_lib_with_mpy(version_tag: str, mpy_path: Path, lib_path: Path) -> bool:
77
+ micropython_lib_commits = read_micropython_lib_commits()
78
+ # Make sure that the correct micropython-lib release is checked out
79
+ # check if micropython-lib has matching tags
80
+ if version_tag in SET_PREVIEW:
81
+ # micropython-lib is now a submodule
82
+ result = git.checkout_commit("master", lib_path)
83
+ if not result:
84
+ log.error("Could not checkout micropython-lib @master")
85
+ return False
86
+
87
+ return git.sync_submodules(mpy_path)
88
+ elif Version(version_tag) >= Version("v1.20.0"):
89
+ # micropython-lib is now a submodule
90
+ result = git.checkout_tag(version_tag, lib_path)
91
+ if not result:
92
+ log.warning(f"Could not checkout micropython-lib @{version_tag}")
93
+ if not git.checkout_tag("master", lib_path):
94
+ log.error("Could not checkout micropython-lib @master")
95
+ return False
96
+ return git.sync_submodules(mpy_path)
97
+ else:
98
+ log.info(
99
+ f"Matching repo's: Micropython {version_tag} needs micropython-lib:{micropython_lib_commits[version_tag]}"
100
+ )
101
+ return git.checkout_commit(micropython_lib_commits[version_tag], lib_path)
102
+
103
+
104
+ def fetch_repos(tag: str, mpy_path: Path, mpy_lib_path: Path):
105
+ """Fetch updates, then switch to the provided tag"""
106
+ log.info("fetch updates")
107
+ git.fetch(mpy_path)
108
+ git.fetch(mpy_lib_path)
109
+ try:
110
+ git.fetch(CONFIG.mpy_stubs_path)
111
+ except Exception:
112
+ log.trace("no stubs repo found : {CONFIG.mpy_stubs_path}")
113
+
114
+ if not tag:
115
+ tag = V_PREVIEW
116
+
117
+ log.info(f"Switching to {tag}")
118
+ if tag == V_PREVIEW:
119
+ git.switch_branch(repo=mpy_path, branch="master")
120
+ else:
121
+ if tag == "stable":
122
+ tag = get_stable_mp_version()
123
+ git.switch_tag(tag, repo=mpy_path)
124
+ result = match_lib_with_mpy(version_tag=tag, mpy_path=mpy_path, lib_path=mpy_lib_path)
125
+
126
+ log.info(f"{str(mpy_path):<40} {git.get_local_tag(mpy_path)}")
127
+ log.info(f"{str(mpy_lib_path):<40} {git.get_local_tag(mpy_lib_path)}")
128
+ try:
129
+ sub_mod_path = mpy_path / "lib/micropython-lib"
130
+ if (sub_mod_path / ".git").exists():
131
+ log.info(f"{str(sub_mod_path):<40} {git.get_local_tag(sub_mod_path)}")
132
+ except Exception:
133
+ pass
134
+ return result
135
+
136
+
137
+ def repo_paths(dest_path: Path) -> Tuple[Path, Path]:
138
+ """Return the paths to the micropython and micropython-lib repos, given a path to the repos.'"""
139
+ if not dest_path.exists():
140
+ os.mkdir(dest_path)
141
+ # repos are relative to provided path
142
+ if dest_path != CONFIG.repo_path:
143
+ mpy_path = dest_path / "micropython"
144
+ mpy_lib_path = dest_path / "micropython-lib"
145
+ else:
146
+ mpy_path = CONFIG.mpy_path
147
+ mpy_lib_path = CONFIG.mpy_lib_path
148
+
149
+ # if no repos then error
150
+ if not (mpy_path / ".git").exists():
151
+ log.error("micropython repo not found")
152
+ raise LookupError
153
+ if not (mpy_lib_path / ".git").exists():
154
+ log.error("micropython-lib repo not found")
155
+ raise LookupError
156
+ return mpy_path, mpy_lib_path