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.
- {micropython_stubber-1.23.1.dist-info → micropython_stubber-1.23.2.dist-info}/LICENSE +30 -30
- {micropython_stubber-1.23.1.dist-info → micropython_stubber-1.23.2.dist-info}/METADATA +32 -15
- micropython_stubber-1.23.2.dist-info/RECORD +158 -0
- micropython_stubber-1.23.2.dist-info/entry_points.txt +5 -0
- mpflash/README.md +220 -194
- mpflash/libusb_flash.ipynb +203 -203
- mpflash/mpflash/add_firmware.py +98 -98
- mpflash/mpflash/ask_input.py +236 -236
- mpflash/mpflash/basicgit.py +284 -284
- mpflash/mpflash/bootloader/__init__.py +2 -2
- mpflash/mpflash/bootloader/activate.py +60 -60
- mpflash/mpflash/bootloader/detect.py +82 -82
- mpflash/mpflash/bootloader/manual.py +101 -101
- mpflash/mpflash/bootloader/micropython.py +12 -12
- mpflash/mpflash/bootloader/touch1200.py +36 -36
- mpflash/mpflash/cli_download.py +129 -129
- mpflash/mpflash/cli_flash.py +224 -219
- mpflash/mpflash/cli_group.py +111 -111
- mpflash/mpflash/cli_list.py +87 -81
- mpflash/mpflash/cli_main.py +39 -39
- mpflash/mpflash/common.py +210 -165
- mpflash/mpflash/config.py +44 -44
- mpflash/mpflash/connected.py +96 -78
- mpflash/mpflash/download.py +364 -364
- mpflash/mpflash/downloaded.py +130 -130
- mpflash/mpflash/errors.py +9 -9
- mpflash/mpflash/flash/__init__.py +55 -55
- mpflash/mpflash/flash/esp.py +59 -59
- mpflash/mpflash/flash/stm32.py +19 -19
- mpflash/mpflash/flash/stm32_dfu.py +104 -104
- mpflash/mpflash/flash/uf2/__init__.py +88 -88
- mpflash/mpflash/flash/uf2/boardid.py +15 -15
- mpflash/mpflash/flash/uf2/linux.py +136 -130
- mpflash/mpflash/flash/uf2/macos.py +42 -42
- mpflash/mpflash/flash/uf2/uf2disk.py +12 -12
- mpflash/mpflash/flash/uf2/windows.py +43 -43
- mpflash/mpflash/flash/worklist.py +170 -170
- mpflash/mpflash/list.py +106 -99
- mpflash/mpflash/logger.py +41 -41
- mpflash/mpflash/mpboard_id/__init__.py +93 -93
- mpflash/mpflash/mpboard_id/add_boards.py +251 -251
- mpflash/mpflash/mpboard_id/board.py +37 -37
- mpflash/mpflash/mpboard_id/board_id.py +86 -86
- mpflash/mpflash/mpboard_id/store.py +43 -43
- mpflash/mpflash/mpremoteboard/__init__.py +266 -222
- mpflash/mpflash/mpremoteboard/mpy_fw_info.py +141 -141
- mpflash/mpflash/mpremoteboard/runner.py +140 -140
- mpflash/mpflash/vendor/click_aliases.py +91 -91
- mpflash/mpflash/vendor/dfu.py +165 -165
- mpflash/mpflash/vendor/pydfu.py +605 -605
- mpflash/mpflash/vendor/readme.md +2 -2
- mpflash/mpflash/versions.py +135 -135
- mpflash/poetry.lock +1599 -1599
- mpflash/pyproject.toml +65 -65
- mpflash/stm32_udev_rules.md +62 -62
- stubber/__init__.py +3 -3
- stubber/board/board_info.csv +193 -193
- stubber/board/boot.py +34 -34
- stubber/board/createstubs.py +1004 -986
- stubber/board/createstubs_db.py +826 -825
- stubber/board/createstubs_db_min.py +332 -331
- stubber/board/createstubs_db_mpy.mpy +0 -0
- stubber/board/createstubs_lvgl.py +741 -741
- stubber/board/createstubs_lvgl_min.py +741 -741
- stubber/board/createstubs_mem.py +767 -766
- stubber/board/createstubs_mem_min.py +307 -306
- stubber/board/createstubs_mem_mpy.mpy +0 -0
- stubber/board/createstubs_min.py +295 -294
- stubber/board/createstubs_mpy.mpy +0 -0
- stubber/board/fw_info.py +141 -141
- stubber/board/info.py +183 -183
- stubber/board/main.py +19 -19
- stubber/board/modulelist.txt +247 -247
- stubber/board/pyrightconfig.json +34 -34
- stubber/bulk/mcu_stubber.py +437 -454
- stubber/codemod/_partials/__init__.py +48 -48
- stubber/codemod/_partials/db_main.py +147 -147
- stubber/codemod/_partials/lvgl_main.py +77 -77
- stubber/codemod/_partials/modules_reader.py +80 -80
- stubber/codemod/add_comment.py +53 -53
- stubber/codemod/add_method.py +65 -65
- stubber/codemod/board.py +317 -317
- stubber/codemod/enrich.py +151 -145
- stubber/codemod/merge_docstub.py +284 -284
- stubber/codemod/modify_list.py +54 -54
- stubber/codemod/utils.py +56 -56
- stubber/commands/build_cmd.py +94 -94
- stubber/commands/cli.py +49 -55
- stubber/commands/clone_cmd.py +78 -78
- stubber/commands/config_cmd.py +29 -29
- stubber/commands/enrich_folder_cmd.py +71 -71
- stubber/commands/get_core_cmd.py +71 -71
- stubber/commands/get_docstubs_cmd.py +92 -89
- stubber/commands/get_frozen_cmd.py +117 -114
- stubber/commands/get_mcu_cmd.py +102 -61
- stubber/commands/merge_cmd.py +66 -66
- stubber/commands/publish_cmd.py +118 -118
- stubber/commands/stub_cmd.py +31 -31
- stubber/commands/switch_cmd.py +62 -62
- stubber/commands/variants_cmd.py +48 -48
- stubber/cst_transformer.py +178 -178
- stubber/data/board_info.csv +193 -193
- stubber/data/board_info.json +1729 -1729
- stubber/data/micropython_tags.csv +15 -15
- stubber/data/requirements-core-micropython.txt +38 -38
- stubber/data/requirements-core-pycopy.txt +39 -39
- stubber/downloader.py +37 -36
- stubber/freeze/common.py +72 -68
- stubber/freeze/freeze_folder.py +69 -69
- stubber/freeze/freeze_manifest_2.py +126 -113
- stubber/freeze/get_frozen.py +131 -127
- stubber/get_cpython.py +112 -101
- stubber/get_lobo.py +59 -59
- stubber/minify.py +423 -419
- stubber/publish/bump.py +86 -86
- stubber/publish/candidates.py +275 -256
- stubber/publish/database.py +18 -18
- stubber/publish/defaults.py +40 -40
- stubber/publish/enums.py +24 -24
- stubber/publish/helpers.py +29 -29
- stubber/publish/merge_docstubs.py +136 -130
- stubber/publish/missing_class_methods.py +51 -49
- stubber/publish/package.py +150 -146
- stubber/publish/pathnames.py +51 -51
- stubber/publish/publish.py +120 -120
- stubber/publish/pypi.py +42 -38
- stubber/publish/stubpackage.py +1055 -1027
- stubber/rst/__init__.py +9 -9
- stubber/rst/classsort.py +78 -77
- stubber/rst/lookup.py +533 -530
- stubber/rst/output_dict.py +401 -401
- stubber/rst/reader.py +814 -814
- stubber/rst/report_return.py +77 -69
- stubber/rst/rst_utils.py +541 -540
- stubber/stubber.py +38 -38
- stubber/stubs_from_docs.py +90 -90
- stubber/tools/manifestfile.py +654 -654
- stubber/tools/readme.md +6 -6
- stubber/update_fallback.py +117 -117
- stubber/update_module_list.py +123 -123
- stubber/utils/__init__.py +6 -6
- stubber/utils/config.py +137 -125
- stubber/utils/makeversionhdr.py +54 -54
- stubber/utils/manifest.py +90 -90
- stubber/utils/post.py +80 -79
- stubber/utils/repos.py +156 -150
- stubber/utils/stubmaker.py +139 -139
- stubber/utils/typed_config_toml.py +80 -77
- stubber/variants.py +106 -106
- micropython_stubber-1.23.1.dist-info/RECORD +0 -159
- micropython_stubber-1.23.1.dist-info/entry_points.txt +0 -3
- mpflash/basicgit.py +0 -288
- {micropython_stubber-1.23.1.dist-info → micropython_stubber-1.23.2.dist-info}/WHEEL +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()}")
|