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
stubber/board/fw_info.py CHANGED
@@ -1,141 +1,141 @@
1
- # %%micropython
2
- import os
3
- import sys
4
-
5
-
6
- def _build(s):
7
- # extract build from sys.version or os.uname().version if available
8
- # sys.version: 'MicroPython v1.23.0-preview.6.g3d0b6276f'
9
- # sys.implementation.version: 'v1.13-103-gb137d064e'
10
- if not s:
11
- return ""
12
- s = s.split(" on ", 1)[0] if " on " in s else s
13
- if s.startswith("v"):
14
- if not "-" in s:
15
- return ""
16
- b = s.split("-")[1]
17
- return b
18
- if not "-preview" in s:
19
- return ""
20
- b = s.split("-preview")[1].split(".")[1]
21
- return b
22
-
23
-
24
- def _version_str(version: tuple): # -> str:
25
- v_str = ".".join([str(n) for n in version[:3]])
26
- if len(version) > 3 and version[3]:
27
- v_str += "-" + version[3]
28
- return v_str
29
-
30
-
31
- def _info(): # type:() -> dict[str, str]
32
- # sourcery skip: use-contextlib-suppress, use-fstring-for-formatting, use-named-expression
33
- info = dict(
34
- {
35
- "family": sys.implementation[0], # type: ignore
36
- "version": "",
37
- "build": "",
38
- "ver": "",
39
- "port": "stm32" if sys.platform.startswith("pyb") else sys.platform, # port: esp32 / win32 / linux / stm32
40
- "board": "GENERIC",
41
- "cpu": "",
42
- "mpy": "",
43
- "arch": "",
44
- }
45
- )
46
- try:
47
- info["version"] = _version_str(sys.implementation.version)
48
- except AttributeError:
49
- pass
50
- try:
51
- machine = sys.implementation._machine if "_machine" in dir(sys.implementation) else os.uname().machine
52
- info["board"] = machine.strip()
53
- info["cpu"] = machine.split("with")[-1].strip() if "with" in machine else ""
54
- info["mpy"] = (
55
- sys.implementation._mpy
56
- if "_mpy" in dir(sys.implementation)
57
- else sys.implementation.mpy if "mpy" in dir(sys.implementation) else ""
58
- )
59
- except (AttributeError, IndexError):
60
- pass
61
-
62
- try:
63
- if hasattr(sys, "version"):
64
- info["build"] = _build(sys.version)
65
- elif hasattr(os, "uname"):
66
- info["build"] = _build(os.uname()[3])
67
- if not info["build"]:
68
- # extract build from uname().release if available
69
- info["build"] = _build(os.uname()[2])
70
- except (AttributeError, IndexError):
71
- pass
72
- # avoid build hashes
73
- if info["build"] and len(info["build"]) > 5:
74
- info["build"] = ""
75
-
76
- if info["version"] == "" and sys.platform not in ("unix", "win32"):
77
- try:
78
- u = os.uname()
79
- info["version"] = u.release
80
- except (IndexError, AttributeError, TypeError):
81
- pass
82
- # detect families
83
- for fam_name, mod_name, mod_thing in [
84
- ("pycopy", "pycopy", "const"),
85
- ("pycom", "pycom", "FAT"),
86
- ("ev3-pybricks", "pybricks.hubs", "EV3Brick"),
87
- ]:
88
- try:
89
- _t = __import__(mod_name, None, None, (mod_thing))
90
- info["family"] = fam_name
91
- del _t
92
- break
93
- except (ImportError, KeyError):
94
- pass
95
-
96
- if info["family"] == "ev3-pybricks":
97
- info["release"] = "2.0.0"
98
-
99
- if info["family"] == "micropython":
100
- if (
101
- info["version"]
102
- and info["version"].endswith(".0")
103
- and info["version"] >= "1.10.0" # versions from 1.10.0 to 1.20.0 do not have a micro .0
104
- and info["version"] <= "1.19.9"
105
- ):
106
- # drop the .0 for newer releases
107
- info["version"] = info["version"][:-2]
108
-
109
- # spell-checker: disable
110
- if "mpy" in info and info["mpy"]: # mpy on some v1.11+ builds
111
- sys_mpy = int(info["mpy"])
112
- # .mpy architecture
113
- arch = [
114
- None,
115
- "x86",
116
- "x64",
117
- "armv6",
118
- "armv6m",
119
- "armv7m",
120
- "armv7em",
121
- "armv7emsp",
122
- "armv7emdp",
123
- "xtensa",
124
- "xtensawin",
125
- ][sys_mpy >> 10]
126
- if arch:
127
- info["arch"] = arch
128
- # .mpy version.minor
129
- info["mpy"] = "v{}.{}".format(sys_mpy & 0xFF, sys_mpy >> 8 & 3)
130
- # simple to use version[-build] string avoiding f-strings for backward compat
131
- info["ver"] = (
132
- "v{version}-{build}".format(version=info["version"], build=info["build"])
133
- if info["build"]
134
- else "v{version}".format(version=info["version"])
135
- )
136
-
137
- return info
138
-
139
-
140
- print(_info())
141
- del _info, _build, _version_str
1
+ # %%micropython
2
+ import os
3
+ import sys
4
+
5
+
6
+ def _build(s):
7
+ # extract build from sys.version or os.uname().version if available
8
+ # sys.version: 'MicroPython v1.23.0-preview.6.g3d0b6276f'
9
+ # sys.implementation.version: 'v1.13-103-gb137d064e'
10
+ if not s:
11
+ return ""
12
+ s = s.split(" on ", 1)[0] if " on " in s else s
13
+ if s.startswith("v"):
14
+ if not "-" in s:
15
+ return ""
16
+ b = s.split("-")[1]
17
+ return b
18
+ if not "-preview" in s:
19
+ return ""
20
+ b = s.split("-preview")[1].split(".")[1]
21
+ return b
22
+
23
+
24
+ def _version_str(version: tuple): # -> str:
25
+ v_str = ".".join([str(n) for n in version[:3]])
26
+ if len(version) > 3 and version[3]:
27
+ v_str += "-" + version[3]
28
+ return v_str
29
+
30
+
31
+ def _info(): # type:() -> dict[str, str]
32
+ # sourcery skip: use-contextlib-suppress, use-fstring-for-formatting, use-named-expression
33
+ info = dict(
34
+ {
35
+ "family": sys.implementation[0], # type: ignore
36
+ "version": "",
37
+ "build": "",
38
+ "ver": "",
39
+ "port": "stm32" if sys.platform.startswith("pyb") else sys.platform, # port: esp32 / win32 / linux / stm32
40
+ "board": "GENERIC",
41
+ "cpu": "",
42
+ "mpy": "",
43
+ "arch": "",
44
+ }
45
+ )
46
+ try:
47
+ info["version"] = _version_str(sys.implementation.version)
48
+ except AttributeError:
49
+ pass
50
+ try:
51
+ machine = sys.implementation._machine if "_machine" in dir(sys.implementation) else os.uname().machine
52
+ info["board"] = machine.strip()
53
+ info["cpu"] = machine.split("with")[-1].strip() if "with" in machine else ""
54
+ info["mpy"] = (
55
+ sys.implementation._mpy
56
+ if "_mpy" in dir(sys.implementation)
57
+ else sys.implementation.mpy if "mpy" in dir(sys.implementation) else ""
58
+ )
59
+ except (AttributeError, IndexError):
60
+ pass
61
+
62
+ try:
63
+ if hasattr(sys, "version"):
64
+ info["build"] = _build(sys.version)
65
+ elif hasattr(os, "uname"):
66
+ info["build"] = _build(os.uname()[3])
67
+ if not info["build"]:
68
+ # extract build from uname().release if available
69
+ info["build"] = _build(os.uname()[2])
70
+ except (AttributeError, IndexError):
71
+ pass
72
+ # avoid build hashes
73
+ if info["build"] and len(info["build"]) > 5:
74
+ info["build"] = ""
75
+
76
+ if info["version"] == "" and sys.platform not in ("unix", "win32"):
77
+ try:
78
+ u = os.uname()
79
+ info["version"] = u.release
80
+ except (IndexError, AttributeError, TypeError):
81
+ pass
82
+ # detect families
83
+ for fam_name, mod_name, mod_thing in [
84
+ ("pycopy", "pycopy", "const"),
85
+ ("pycom", "pycom", "FAT"),
86
+ ("ev3-pybricks", "pybricks.hubs", "EV3Brick"),
87
+ ]:
88
+ try:
89
+ _t = __import__(mod_name, None, None, (mod_thing))
90
+ info["family"] = fam_name
91
+ del _t
92
+ break
93
+ except (ImportError, KeyError):
94
+ pass
95
+
96
+ if info["family"] == "ev3-pybricks":
97
+ info["release"] = "2.0.0"
98
+
99
+ if info["family"] == "micropython":
100
+ if (
101
+ info["version"]
102
+ and info["version"].endswith(".0")
103
+ and info["version"] >= "1.10.0" # versions from 1.10.0 to 1.20.0 do not have a micro .0
104
+ and info["version"] <= "1.19.9"
105
+ ):
106
+ # drop the .0 for newer releases
107
+ info["version"] = info["version"][:-2]
108
+
109
+ # spell-checker: disable
110
+ if "mpy" in info and info["mpy"]: # mpy on some v1.11+ builds
111
+ sys_mpy = int(info["mpy"])
112
+ # .mpy architecture
113
+ arch = [
114
+ None,
115
+ "x86",
116
+ "x64",
117
+ "armv6",
118
+ "armv6m",
119
+ "armv7m",
120
+ "armv7em",
121
+ "armv7emsp",
122
+ "armv7emdp",
123
+ "xtensa",
124
+ "xtensawin",
125
+ ][sys_mpy >> 10]
126
+ if arch:
127
+ info["arch"] = arch
128
+ # .mpy version.minor
129
+ info["mpy"] = "v{}.{}".format(sys_mpy & 0xFF, sys_mpy >> 8 & 3)
130
+ # simple to use version[-build] string avoiding f-strings for backward compat
131
+ info["ver"] = (
132
+ "v{version}-{build}".format(version=info["version"], build=info["build"])
133
+ if info["build"]
134
+ else "v{version}".format(version=info["version"])
135
+ )
136
+
137
+ return info
138
+
139
+
140
+ print(_info())
141
+ del _info, _build, _version_str
stubber/board/info.py CHANGED
@@ -1,183 +1,183 @@
1
- import gc
2
- import logging
3
- import os
4
- import sys
5
-
6
- LIBS = [".", "/lib", "/sd/lib", "/flash/lib", "lib"]
7
- # from ujson import dumps
8
-
9
- try:
10
- from machine import reset # type: ignore
11
- except ImportError:
12
- pass
13
-
14
- try:
15
- from collections import OrderedDict
16
- except ImportError:
17
- from ucollections import OrderedDict # type: ignore
18
-
19
-
20
- def _info(): # type:() -> dict[str, str]
21
- info = OrderedDict(
22
- {
23
- "family": sys.implementation.name,
24
- "version": "",
25
- "build": "",
26
- "ver": "",
27
- "port": "stm32"
28
- if sys.platform.startswith("pyb")
29
- else sys.platform, # port: esp32 / win32 / linux / stm32
30
- "board": "GENERIC",
31
- "cpu": "",
32
- "mpy": "",
33
- "arch": "",
34
- }
35
- )
36
- try:
37
- info["version"] = ".".join([str(n) for n in sys.implementation.version])
38
- except AttributeError:
39
- pass
40
- try:
41
- machine = (
42
- sys.implementation._machine
43
- if "_machine" in dir(sys.implementation)
44
- else os.uname().machine
45
- )
46
- info["board"] = machine.strip()
47
- info["cpu"] = machine.split("with")[1].strip()
48
- info["mpy"] = (
49
- sys.implementation._mpy
50
- if "_mpy" in dir(sys.implementation)
51
- else sys.implementation.mpy
52
- if "mpy" in dir(sys.implementation)
53
- else ""
54
- )
55
- except (AttributeError, IndexError):
56
- pass
57
- gc.collect()
58
- for filename in [d + "/board_info.csv" for d in LIBS]:
59
- print("Check file:", filename)
60
- if file_exists(filename):
61
- print("Found board info file: {}".format(filename))
62
- b = info["board"].strip()
63
- if find_board(info, b, filename):
64
- break
65
- if "with" in b:
66
- b = b.split("with")[0].strip()
67
- if find_board(info, b, filename):
68
- break
69
- info["board"] = "GENERIC"
70
- break
71
- info["board"] = info["board"].replace(" ", "_")
72
- gc.collect()
73
-
74
- try:
75
- # extract build from uname().version if available
76
- info["build"] = _build(os.uname()[3])
77
- if not info["build"]:
78
- # extract build from uname().release if available
79
- info["build"] = _build(os.uname()[2])
80
- if not info["build"] and ";" in sys.version:
81
- # extract build from uname().release if available
82
- info["build"] = _build(sys.version.split(";")[1])
83
- except (AttributeError, IndexError):
84
- pass
85
- # avoid build hashes
86
- if info["build"] and len(info["build"]) > 5:
87
- info["build"] = ""
88
-
89
- if info["version"] == "" and sys.platform not in ("unix", "win32"):
90
- try:
91
- u = os.uname()
92
- info["version"] = u.release
93
- except (IndexError, AttributeError, TypeError):
94
- pass
95
- # detect families
96
- for fam_name, mod_name, mod_thing in [
97
- ("pycopy", "pycopy", "const"),
98
- ("pycom", "pycom", "FAT"),
99
- ("ev3-pybricks", "pybricks.hubs", "EV3Brick"),
100
- ]:
101
- try:
102
- _t = __import__(mod_name, None, None, (mod_thing))
103
- info["family"] = fam_name
104
- del _t
105
- break
106
- except (ImportError, KeyError):
107
- pass
108
-
109
- if info["family"] == "ev3-pybricks":
110
- info["release"] = "2.0.0"
111
-
112
- if info["family"] == "micropython":
113
- if (
114
- info["version"]
115
- and info["version"].endswith(".0")
116
- and info["version"]
117
- >= "1.10.0" # versions from 1.10.0 to 1.20.0 do not have a micro .0
118
- and info["version"] <= "1.19.9"
119
- ):
120
- # drop the .0 for newer releases
121
- info["version"] = info["version"][:-2]
122
-
123
- # spell-checker: disable
124
- if "mpy" in info and info["mpy"]: # mpy on some v1.11+ builds
125
- sys_mpy = int(info["mpy"])
126
- # .mpy architecture
127
- arch = [
128
- None,
129
- "x86",
130
- "x64",
131
- "armv6",
132
- "armv6m",
133
- "armv7m",
134
- "armv7em",
135
- "armv7emsp",
136
- "armv7emdp",
137
- "xtensa",
138
- "xtensawin",
139
- ][sys_mpy >> 10]
140
- if arch:
141
- info["arch"] = arch
142
- # .mpy version.minor
143
- info["mpy"] = "v{}.{}".format(sys_mpy & 0xFF, sys_mpy >> 8 & 3)
144
- # simple to use version[-build] string
145
- info["ver"] = f"v{info['version']}-{info['build']}" if info["build"] else f"v{info['version']}"
146
-
147
- return info
148
-
149
-
150
- def find_board(info: dict, board_descr: str, filename: str):
151
- print("Find board '{}' in the provided board_info.csv file".format(board_descr))
152
- with open(filename, "r") as file:
153
- # ugly code to make testable in python and micropython
154
- while 1:
155
- line = file.readline()
156
- if not line:
157
- break
158
- descr_, board_ = line.split(",")[0].strip(), line.split(",")[1].strip()
159
- if descr_ == board_descr:
160
- info["board"] = board_
161
- return True
162
- return False
163
-
164
-
165
- def file_exists(filename: str):
166
- try:
167
- if os.stat(filename)[0] >> 14:
168
- return True
169
- return False
170
- except OSError:
171
- return False
172
-
173
-
174
- def _build(s):
175
- # extract a build nr from a string
176
- if not s:
177
- return ""
178
- if " on " in s:
179
- s = s.split(" on ", 1)[0]
180
- return s.split("-")[1] if "-" in s else ""
181
-
182
-
183
- print(f"info: {_info()}")
1
+ import gc
2
+ import logging
3
+ import os
4
+ import sys
5
+
6
+ LIBS = [".", "/lib", "/sd/lib", "/flash/lib", "lib"]
7
+ # from ujson import dumps
8
+
9
+ try:
10
+ from machine import reset # type: ignore
11
+ except ImportError:
12
+ pass
13
+
14
+ try:
15
+ from collections import OrderedDict
16
+ except ImportError:
17
+ from ucollections import OrderedDict # type: ignore
18
+
19
+
20
+ def _info(): # type:() -> dict[str, str]
21
+ info = OrderedDict(
22
+ {
23
+ "family": sys.implementation.name,
24
+ "version": "",
25
+ "build": "",
26
+ "ver": "",
27
+ "port": "stm32"
28
+ if sys.platform.startswith("pyb")
29
+ else sys.platform, # port: esp32 / win32 / linux / stm32
30
+ "board": "GENERIC",
31
+ "cpu": "",
32
+ "mpy": "",
33
+ "arch": "",
34
+ }
35
+ )
36
+ try:
37
+ info["version"] = ".".join([str(n) for n in sys.implementation.version])
38
+ except AttributeError:
39
+ pass
40
+ try:
41
+ machine = (
42
+ sys.implementation._machine
43
+ if "_machine" in dir(sys.implementation)
44
+ else os.uname().machine
45
+ )
46
+ info["board"] = machine.strip()
47
+ info["cpu"] = machine.split("with")[1].strip()
48
+ info["mpy"] = (
49
+ sys.implementation._mpy
50
+ if "_mpy" in dir(sys.implementation)
51
+ else sys.implementation.mpy
52
+ if "mpy" in dir(sys.implementation)
53
+ else ""
54
+ )
55
+ except (AttributeError, IndexError):
56
+ pass
57
+ gc.collect()
58
+ for filename in [d + "/board_info.csv" for d in LIBS]:
59
+ print("Check file:", filename)
60
+ if file_exists(filename):
61
+ print("Found board info file: {}".format(filename))
62
+ b = info["board"].strip()
63
+ if find_board(info, b, filename):
64
+ break
65
+ if "with" in b:
66
+ b = b.split("with")[0].strip()
67
+ if find_board(info, b, filename):
68
+ break
69
+ info["board"] = "GENERIC"
70
+ break
71
+ info["board"] = info["board"].replace(" ", "_")
72
+ gc.collect()
73
+
74
+ try:
75
+ # extract build from uname().version if available
76
+ info["build"] = _build(os.uname()[3])
77
+ if not info["build"]:
78
+ # extract build from uname().release if available
79
+ info["build"] = _build(os.uname()[2])
80
+ if not info["build"] and ";" in sys.version:
81
+ # extract build from uname().release if available
82
+ info["build"] = _build(sys.version.split(";")[1])
83
+ except (AttributeError, IndexError):
84
+ pass
85
+ # avoid build hashes
86
+ if info["build"] and len(info["build"]) > 5:
87
+ info["build"] = ""
88
+
89
+ if info["version"] == "" and sys.platform not in ("unix", "win32"):
90
+ try:
91
+ u = os.uname()
92
+ info["version"] = u.release
93
+ except (IndexError, AttributeError, TypeError):
94
+ pass
95
+ # detect families
96
+ for fam_name, mod_name, mod_thing in [
97
+ ("pycopy", "pycopy", "const"),
98
+ ("pycom", "pycom", "FAT"),
99
+ ("ev3-pybricks", "pybricks.hubs", "EV3Brick"),
100
+ ]:
101
+ try:
102
+ _t = __import__(mod_name, None, None, (mod_thing))
103
+ info["family"] = fam_name
104
+ del _t
105
+ break
106
+ except (ImportError, KeyError):
107
+ pass
108
+
109
+ if info["family"] == "ev3-pybricks":
110
+ info["release"] = "2.0.0"
111
+
112
+ if info["family"] == "micropython":
113
+ if (
114
+ info["version"]
115
+ and info["version"].endswith(".0")
116
+ and info["version"]
117
+ >= "1.10.0" # versions from 1.10.0 to 1.20.0 do not have a micro .0
118
+ and info["version"] <= "1.19.9"
119
+ ):
120
+ # drop the .0 for newer releases
121
+ info["version"] = info["version"][:-2]
122
+
123
+ # spell-checker: disable
124
+ if "mpy" in info and info["mpy"]: # mpy on some v1.11+ builds
125
+ sys_mpy = int(info["mpy"])
126
+ # .mpy architecture
127
+ arch = [
128
+ None,
129
+ "x86",
130
+ "x64",
131
+ "armv6",
132
+ "armv6m",
133
+ "armv7m",
134
+ "armv7em",
135
+ "armv7emsp",
136
+ "armv7emdp",
137
+ "xtensa",
138
+ "xtensawin",
139
+ ][sys_mpy >> 10]
140
+ if arch:
141
+ info["arch"] = arch
142
+ # .mpy version.minor
143
+ info["mpy"] = "v{}.{}".format(sys_mpy & 0xFF, sys_mpy >> 8 & 3)
144
+ # simple to use version[-build] string
145
+ info["ver"] = f"v{info['version']}-{info['build']}" if info["build"] else f"v{info['version']}"
146
+
147
+ return info
148
+
149
+
150
+ def find_board(info: dict, board_descr: str, filename: str):
151
+ print("Find board '{}' in the provided board_info.csv file".format(board_descr))
152
+ with open(filename, "r") as file:
153
+ # ugly code to make testable in python and micropython
154
+ while 1:
155
+ line = file.readline()
156
+ if not line:
157
+ break
158
+ descr_, board_ = line.split(",")[0].strip(), line.split(",")[1].strip()
159
+ if descr_ == board_descr:
160
+ info["board"] = board_
161
+ return True
162
+ return False
163
+
164
+
165
+ def file_exists(filename: str):
166
+ try:
167
+ if os.stat(filename)[0] >> 14:
168
+ return True
169
+ return False
170
+ except OSError:
171
+ return False
172
+
173
+
174
+ def _build(s):
175
+ # extract a build nr from a string
176
+ if not s:
177
+ return ""
178
+ if " on " in s:
179
+ s = s.split(" on ", 1)[0]
180
+ return s.split("-")[1] if "-" in s else ""
181
+
182
+
183
+ print(f"info: {_info()}")