micropython-stubber 1.23.1.post1__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 (152) hide show
  1. {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.2.dist-info}/LICENSE +30 -30
  2. {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.2.dist-info}/METADATA +4 -4
  3. micropython_stubber-1.23.2.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 +284 -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 +210 -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 +43 -43
  44. mpflash/mpflash/mpremoteboard/__init__.py +266 -266
  45. mpflash/mpflash/mpremoteboard/mpy_fw_info.py +141 -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 +1599 -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 +1004 -986
  59. stubber/board/createstubs_db.py +826 -825
  60. stubber/board/createstubs_db_min.py +332 -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 +767 -766
  65. stubber/board/createstubs_mem_min.py +307 -306
  66. stubber/board/createstubs_mem_mpy.mpy +0 -0
  67. stubber/board/createstubs_min.py +295 -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 +437 -437
  75. stubber/codemod/_partials/__init__.py +48 -48
  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 +151 -145
  83. stubber/codemod/merge_docstub.py +284 -284
  84. stubber/codemod/modify_list.py +54 -54
  85. stubber/codemod/utils.py +56 -56
  86. stubber/commands/build_cmd.py +94 -94
  87. stubber/commands/cli.py +49 -49
  88. stubber/commands/clone_cmd.py +78 -78
  89. stubber/commands/config_cmd.py +29 -29
  90. stubber/commands/enrich_folder_cmd.py +71 -71
  91. stubber/commands/get_core_cmd.py +71 -71
  92. stubber/commands/get_docstubs_cmd.py +92 -92
  93. stubber/commands/get_frozen_cmd.py +117 -117
  94. stubber/commands/get_mcu_cmd.py +102 -102
  95. stubber/commands/merge_cmd.py +66 -66
  96. stubber/commands/publish_cmd.py +118 -118
  97. stubber/commands/stub_cmd.py +31 -31
  98. stubber/commands/switch_cmd.py +62 -62
  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 +37 -37
  107. stubber/freeze/common.py +72 -72
  108. stubber/freeze/freeze_folder.py +69 -69
  109. stubber/freeze/freeze_manifest_2.py +126 -126
  110. stubber/freeze/get_frozen.py +131 -131
  111. stubber/get_cpython.py +112 -112
  112. stubber/get_lobo.py +59 -59
  113. stubber/minify.py +423 -423
  114. stubber/publish/bump.py +86 -86
  115. stubber/publish/candidates.py +275 -275
  116. stubber/publish/database.py +18 -18
  117. stubber/publish/defaults.py +40 -40
  118. stubber/publish/enums.py +24 -24
  119. stubber/publish/helpers.py +29 -29
  120. stubber/publish/merge_docstubs.py +136 -132
  121. stubber/publish/missing_class_methods.py +51 -51
  122. stubber/publish/package.py +150 -150
  123. stubber/publish/pathnames.py +51 -51
  124. stubber/publish/publish.py +120 -120
  125. stubber/publish/pypi.py +42 -42
  126. stubber/publish/stubpackage.py +1055 -1051
  127. stubber/rst/__init__.py +9 -9
  128. stubber/rst/classsort.py +78 -78
  129. stubber/rst/lookup.py +533 -531
  130. stubber/rst/output_dict.py +401 -401
  131. stubber/rst/reader.py +814 -814
  132. stubber/rst/report_return.py +77 -77
  133. stubber/rst/rst_utils.py +541 -541
  134. stubber/stubber.py +38 -38
  135. stubber/stubs_from_docs.py +90 -90
  136. stubber/tools/manifestfile.py +654 -654
  137. stubber/tools/readme.md +6 -6
  138. stubber/update_fallback.py +117 -117
  139. stubber/update_module_list.py +123 -123
  140. stubber/utils/__init__.py +6 -6
  141. stubber/utils/config.py +137 -137
  142. stubber/utils/makeversionhdr.py +54 -54
  143. stubber/utils/manifest.py +90 -90
  144. stubber/utils/post.py +80 -80
  145. stubber/utils/repos.py +156 -156
  146. stubber/utils/stubmaker.py +139 -139
  147. stubber/utils/typed_config_toml.py +80 -80
  148. stubber/variants.py +106 -106
  149. micropython_stubber-1.23.1.post1.dist-info/RECORD +0 -159
  150. mpflash/basicgit.py +0 -288
  151. {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.2.dist-info}/WHEEL +0 -0
  152. {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.2.dist-info}/entry_points.txt +0 -0
stubber/utils/post.py CHANGED
@@ -1,80 +1,80 @@
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)
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,156 +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 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
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