micropython-stubber 1.15.0__py3-none-any.whl → 1.15.1__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.15.0.dist-info → micropython_stubber-1.15.1.dist-info}/METADATA +2 -2
- {micropython_stubber-1.15.0.dist-info → micropython_stubber-1.15.1.dist-info}/RECORD +23 -22
- stubber/__init__.py +1 -1
- stubber/board/createstubs.py +34 -36
- stubber/board/createstubs_db.py +35 -35
- stubber/board/createstubs_db_min.py +195 -193
- stubber/board/createstubs_db_mpy.mpy +0 -0
- stubber/board/createstubs_info.py +73 -42
- stubber/board/createstubs_lvgl.py +35 -35
- stubber/board/createstubs_lvgl_min.py +88 -87
- stubber/board/createstubs_lvgl_mpy.mpy +0 -0
- stubber/board/createstubs_mem.py +44 -40
- stubber/board/createstubs_mem_min.py +179 -174
- stubber/board/createstubs_mem_mpy.mpy +0 -0
- stubber/board/createstubs_min.py +75 -74
- stubber/board/createstubs_mpy.mpy +0 -0
- stubber/board/info.py +183 -0
- stubber/minify.py +42 -27
- stubber/publish/stubpacker.py +2 -1
- stubber/rst/lookup.py +1 -1
- {micropython_stubber-1.15.0.dist-info → micropython_stubber-1.15.1.dist-info}/LICENSE +0 -0
- {micropython_stubber-1.15.0.dist-info → micropython_stubber-1.15.1.dist-info}/WHEEL +0 -0
- {micropython_stubber-1.15.0.dist-info → micropython_stubber-1.15.1.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: micropython-stubber
|
3
|
-
Version: 1.15.
|
3
|
+
Version: 1.15.1
|
4
4
|
Summary: Tooling to create and maintain stubs for MicroPython
|
5
5
|
Home-page: https://github.com/Josverl/micropython-stubber#readme
|
6
6
|
License: MIT
|
@@ -25,7 +25,7 @@ Requires-Dist: click (>=8.1.3,<9.0.0)
|
|
25
25
|
Requires-Dist: esptool (>=4.4,<5.0) ; extra == "tools"
|
26
26
|
Requires-Dist: executing (>=2.0.1,<3.0.0)
|
27
27
|
Requires-Dist: importlib-metadata (>=1.0,<2.0) ; python_version < "3.8"
|
28
|
-
Requires-Dist: libcst (>=0.4.9,<
|
28
|
+
Requires-Dist: libcst (>=0.4.9,<1.2.0)
|
29
29
|
Requires-Dist: loguru (>=0.6,<0.8)
|
30
30
|
Requires-Dist: mypy (==1.7.0)
|
31
31
|
Requires-Dist: packaging (>=21.3,<24.0)
|
@@ -1,20 +1,21 @@
|
|
1
|
-
stubber/__init__.py,sha256=
|
1
|
+
stubber/__init__.py,sha256=7AzDjHjHOU4qlF4FalwV28Ino4VUpEqY3T0n1Unil80,51
|
2
2
|
stubber/basicgit.py,sha256=2QbI0dNBO-Vr7zkSh8x7SLaje5voP79-UfRq7QdqirM,9606
|
3
3
|
stubber/board/board_info.csv,sha256=e3xY-VTOh-iOmpGhhuADXnk3Rq-17ID0PJr8eKSH5Fw,7040
|
4
4
|
stubber/board/boot.py,sha256=XjWlKErU5nI1HJSugXIP_3hlwgRQboE6sJrpcbSygnk,1120
|
5
|
-
stubber/board/createstubs.py,sha256=
|
6
|
-
stubber/board/createstubs_db.py,sha256=
|
7
|
-
stubber/board/createstubs_db_min.py,sha256=
|
8
|
-
stubber/board/createstubs_db_mpy.mpy,sha256=
|
9
|
-
stubber/board/createstubs_info.py,sha256=
|
10
|
-
stubber/board/createstubs_lvgl.py,sha256=
|
11
|
-
stubber/board/createstubs_lvgl_min.py,sha256=
|
12
|
-
stubber/board/createstubs_lvgl_mpy.mpy,sha256=
|
13
|
-
stubber/board/createstubs_mem.py,sha256=
|
14
|
-
stubber/board/createstubs_mem_min.py,sha256=
|
15
|
-
stubber/board/createstubs_mem_mpy.mpy,sha256=
|
16
|
-
stubber/board/createstubs_min.py,sha256=
|
17
|
-
stubber/board/createstubs_mpy.mpy,sha256=
|
5
|
+
stubber/board/createstubs.py,sha256=PF-ZQFmP44o8aF0zOhZrs8-zYZjzYODKwtXCRJ0T_48,30800
|
6
|
+
stubber/board/createstubs_db.py,sha256=v4zXCshMtLTIyv4StBh_aiwxvOG9N5-n39wnokRH_3o,28342
|
7
|
+
stubber/board/createstubs_db_min.py,sha256=OTnbMdx3Uo8sTXieCNsasC3CLZZYCNIDabY8Ulcj920,10498
|
8
|
+
stubber/board/createstubs_db_mpy.mpy,sha256=gdzT7ugmmCqApAohu40dZ2bxm-4Zw73x-Fpg-9maf7Y,8638
|
9
|
+
stubber/board/createstubs_info.py,sha256=TMq_nbJyQorlUrf2fRvQhQk1pfgk1rsMYVzYvRq-g7I,30804
|
10
|
+
stubber/board/createstubs_lvgl.py,sha256=6dPScUZzpauK2nU7gdrS55tN-sJiNStZjH1tU_4wvDc,25551
|
11
|
+
stubber/board/createstubs_lvgl_min.py,sha256=sVIGo6pqHLeMYOizcVaywPLVLweKOf6M6dWCFKwEeHE,9748
|
12
|
+
stubber/board/createstubs_lvgl_mpy.mpy,sha256=IGNxkP8UMhLdFIU3Sztjjsf51HCXIsJX43Ry8EmKo0w,8064
|
13
|
+
stubber/board/createstubs_mem.py,sha256=IOZetXX0syoCOKj9ny-REfp49Eam_9INP6l5nYS9XbQ,26451
|
14
|
+
stubber/board/createstubs_mem_min.py,sha256=Niirax4b2QhBNEc0Cy1tpormAKHz1l2FPIsuBpj4LwI,9866
|
15
|
+
stubber/board/createstubs_mem_mpy.mpy,sha256=aLLFmM2wx4sRhBdbf8XIQLdIvuE4ZsAaFEAO2phY-N4,8078
|
16
|
+
stubber/board/createstubs_min.py,sha256=gOnDmHhOnwZ9e9_SgMkvOm7hHeF6zLoGMWjin4xWAUw,12131
|
17
|
+
stubber/board/createstubs_mpy.mpy,sha256=6mR2Tan_N-EXNVHf5FjGV4rQ0jo6Y0EIebSRS5tiDzs,10886
|
18
|
+
stubber/board/info.py,sha256=b7SOPZHVsVhaayKCwVkFZlYu0BW-UFI7LuG1Eop9480,5629
|
18
19
|
stubber/board/logging.py,sha256=rdneoAwZg84uiWBJWYIp0gMcT2oU9Lu-1WIu1LqT_9w,2218
|
19
20
|
stubber/board/main.py,sha256=f6V3tdt6sPZVLuwemT-NLuK9GySfW2c2J6PJMOOWQQw,413
|
20
21
|
stubber/board/modulelist.txt,sha256=-LaSa5Qk3IVFecAm9cs_GBXLOO2O-Fx_SIvMCOzS13Y,2717
|
@@ -63,7 +64,7 @@ stubber/freeze/freeze_manifest_2.py,sha256=Vdrs2A5vvDDZ4WamcHG9sleKqNYGwIJ5yNQXp
|
|
63
64
|
stubber/freeze/get_frozen.py,sha256=a7df4ltuYgw1A_Zu2tyQFZaWNZjWrWG9xDAgK1resso,4936
|
64
65
|
stubber/get_cpython.py,sha256=RYL3HHbNjaapT0JQZaLVd8wLSfm6RB6XpVELOae1z98,3782
|
65
66
|
stubber/get_lobo.py,sha256=jyysWbeEwNuZZtkTudJP1QbyVvh-TwFom5cE7iCi9lE,1776
|
66
|
-
stubber/minify.py,sha256=
|
67
|
+
stubber/minify.py,sha256=fN8vmIvDXm8DaKbcApK8A7oJGXoUVyUc8YbGDrq7kPg,14002
|
67
68
|
stubber/publish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
68
69
|
stubber/publish/bump.py,sha256=qSb1DpaIxgyoH3YcPU1XKyDKgqkomxSm0WWf1sAVh0Y,3262
|
69
70
|
stubber/publish/candidates.py,sha256=FUrFyPex6pe3_ISH6Sp3ZYrC4DYZCPjaM7hXaA6Uidg,11463
|
@@ -76,10 +77,10 @@ stubber/publish/package.py,sha256=ZXIHDXKxzYZpCzT-g2xSxS0hB7PGyPsmXKfNXgxYZTw,63
|
|
76
77
|
stubber/publish/pathnames.py,sha256=04zlFoRUcvTV7qVyc9z8mq2QdnGB82duclcCfTivO-0,1807
|
77
78
|
stubber/publish/publish.py,sha256=9Lce_NjTySwM92-eiXgXcfBGT4q0-PvBySKumtzgOKA,3569
|
78
79
|
stubber/publish/pypi.py,sha256=Mu1F7Xx4e0NPWK1_Erck6QGEfdY8w67EBeWFi6JiAzk,1240
|
79
|
-
stubber/publish/stubpacker.py,sha256=
|
80
|
+
stubber/publish/stubpacker.py,sha256=Vqsio0ihUDQcvoLV3OmKaXnxjGkGoHf-F5UEB-4pr54,36385
|
80
81
|
stubber/rst/__init__.py,sha256=5VcbDCotIICa2xnJDs_gw2sFXpjjGOZZbwCrNKXy1OE,293
|
81
82
|
stubber/rst/classsort.py,sha256=YCmF4QEYXqZ1Yu2FZb1iPQBrVkq-mrZaBaRcSUlC7ZE,2655
|
82
|
-
stubber/rst/lookup.py,sha256=
|
83
|
+
stubber/rst/lookup.py,sha256=gXaqgoXT9rkPEl9DDIDOKOEi0U4jW4CV8aaMAIyMGvI,19856
|
83
84
|
stubber/rst/output_dict.py,sha256=cpBXRtUD-uh0EgjWIBiRrMLBmIAEXjoJFSOAg-qJQiU,14755
|
84
85
|
stubber/rst/reader.py,sha256=uR0MW6oFrxD5zJS9J4-wevUmcUHOPG6nhHifI9kkuIs,33336
|
85
86
|
stubber/rst/report_return.py,sha256=WZJSbgjsjxFeCeY-vLms56gv_x3TubaGXGQ8--d8RqI,2814
|
@@ -101,8 +102,8 @@ stubber/utils/stubmaker.py,sha256=jHvRbbJA-Hp60R8NKct-TNM8ufFy2Rl2hesMW7ia7L8,46
|
|
101
102
|
stubber/utils/typed_config_toml.py,sha256=ikifCIZGNhS_uqsfp6IwIpxdtZqbLtywprjWG_Q0y8o,2629
|
102
103
|
stubber/utils/versions.py,sha256=_xSOwpJV0gAO-TK2KHu-Ze3m__739f1YUVIxiHE2vqY,1859
|
103
104
|
stubber/variants.py,sha256=Tm5PfHwKa_rrKAYWXtiNompqAJcD_DOV1B6lJD7L5Bg,3747
|
104
|
-
micropython_stubber-1.15.
|
105
|
-
micropython_stubber-1.15.
|
106
|
-
micropython_stubber-1.15.
|
107
|
-
micropython_stubber-1.15.
|
108
|
-
micropython_stubber-1.15.
|
105
|
+
micropython_stubber-1.15.1.dist-info/entry_points.txt,sha256=NQi_M36fgq5k6giSuASas3LrpF6CVdkzfvJC0ja73_g,55
|
106
|
+
micropython_stubber-1.15.1.dist-info/LICENSE,sha256=2zsOXlYgl9W7_XGXcncAXIYfvSVlyNcVBycC6hhlKhA,1542
|
107
|
+
micropython_stubber-1.15.1.dist-info/METADATA,sha256=IMj5-66gCyYaozwTM-4xSvon8a8QpUAWFf-OwTYntDk,18938
|
108
|
+
micropython_stubber-1.15.1.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
|
109
|
+
micropython_stubber-1.15.1.dist-info/RECORD,,
|
stubber/__init__.py
CHANGED
stubber/board/createstubs.py
CHANGED
@@ -20,7 +20,7 @@ try:
|
|
20
20
|
except ImportError:
|
21
21
|
from ucollections import OrderedDict # type: ignore
|
22
22
|
|
23
|
-
__version__ = "v1.15.
|
23
|
+
__version__ = "v1.15.1"
|
24
24
|
ENOENT = 2
|
25
25
|
_MAX_CLASS_LEVEL = 2 # Max class nesting
|
26
26
|
LIBS = [".", "/lib", "/sd/lib", "/flash/lib", "lib"]
|
@@ -36,12 +36,12 @@ class Stubber:
|
|
36
36
|
raise NotImplementedError("MicroPython 1.13.0 cannot be stubbed")
|
37
37
|
except AttributeError:
|
38
38
|
pass
|
39
|
-
|
40
|
-
self.
|
39
|
+
self.log = None
|
40
|
+
self.log = logging.getLogger("stubber")
|
41
41
|
self._report = [] # type: list[str]
|
42
42
|
self.info = _info()
|
43
|
-
self.
|
44
|
-
self.
|
43
|
+
self.log.info("Port: {}".format(self.info["port"]))
|
44
|
+
self.log.info("Board: {}".format(self.info["board"]))
|
45
45
|
gc.collect()
|
46
46
|
if firmware_id:
|
47
47
|
self._fwid = firmware_id.lower()
|
@@ -59,11 +59,11 @@ class Stubber:
|
|
59
59
|
path = get_root()
|
60
60
|
|
61
61
|
self.path = "{}/stubs/{}".format(path, self.flat_fwid).replace("//", "/")
|
62
|
-
self.
|
62
|
+
self.log.debug(self.path)
|
63
63
|
try:
|
64
64
|
ensure_folder(path + "/")
|
65
65
|
except OSError:
|
66
|
-
self.
|
66
|
+
self.log.error("error creating stub folder {}".format(path))
|
67
67
|
self.problematic = [
|
68
68
|
"upip",
|
69
69
|
"upysh",
|
@@ -88,11 +88,11 @@ class Stubber:
|
|
88
88
|
# name_, repr_(value), type as text, item_instance
|
89
89
|
_result = []
|
90
90
|
_errors = []
|
91
|
-
self.
|
91
|
+
self.log.debug("get attributes {} {}".format(repr(item_instance), item_instance))
|
92
92
|
for name in dir(item_instance):
|
93
93
|
if name.startswith("_") and not name in self.modules:
|
94
94
|
continue
|
95
|
-
self.
|
95
|
+
self.log.debug("get attribute {}".format(name))
|
96
96
|
try:
|
97
97
|
val = getattr(item_instance, name)
|
98
98
|
# name , item_repr(value) , type as text, item_instance, order
|
@@ -132,18 +132,18 @@ class Stubber:
|
|
132
132
|
|
133
133
|
def create_all_stubs(self):
|
134
134
|
"Create stubs for all configured modules"
|
135
|
-
self.
|
135
|
+
self.log.info("Start micropython-stubber v{} on {}".format(__version__, self._fwid))
|
136
136
|
gc.collect()
|
137
137
|
for module_name in self.modules:
|
138
138
|
self.create_one_stub(module_name)
|
139
|
-
self.
|
139
|
+
self.log.info("Finally done")
|
140
140
|
|
141
141
|
def create_one_stub(self, module_name: str):
|
142
142
|
if module_name in self.problematic:
|
143
|
-
self.
|
143
|
+
self.log.warning("Skip module: {:<25} : Known problematic".format(module_name))
|
144
144
|
return False
|
145
145
|
if module_name in self.excluded:
|
146
|
-
self.
|
146
|
+
self.log.warning("Skip module: {:<25} : Excluded".format(module_name))
|
147
147
|
return False
|
148
148
|
|
149
149
|
file_name = "{}/{}.py".format(self.path, module_name.replace(".", "/"))
|
@@ -178,14 +178,12 @@ class Stubber:
|
|
178
178
|
try:
|
179
179
|
new_module = __import__(module_name, None, None, ("*"))
|
180
180
|
m1 = gc.mem_free() # type: ignore
|
181
|
-
self.
|
181
|
+
self.log.info(
|
182
182
|
"Stub module: {:<25} to file: {:<70} mem:{:>5}".format(module_name, fname, m1)
|
183
183
|
)
|
184
184
|
|
185
185
|
except ImportError:
|
186
|
-
self.
|
187
|
-
"Skip module: {:<25} {:<79}".format(module_name, "Module not found.")
|
188
|
-
)
|
186
|
+
self.log.warning("Skip module: {:<25} {:<79}".format(module_name, "Module not found."))
|
189
187
|
return False
|
190
188
|
|
191
189
|
# Start a new file
|
@@ -209,11 +207,11 @@ class Stubber:
|
|
209
207
|
try:
|
210
208
|
del new_module
|
211
209
|
except (OSError, KeyError): # lgtm [py/unreachable-statement]
|
212
|
-
self.
|
210
|
+
self.log.warning("could not del new_module")
|
213
211
|
try:
|
214
212
|
del sys.modules[module_name]
|
215
213
|
except KeyError:
|
216
|
-
self.
|
214
|
+
self.log.debug("could not del sys.modules[{}]".format(module_name))
|
217
215
|
gc.collect()
|
218
216
|
return True
|
219
217
|
|
@@ -223,14 +221,14 @@ class Stubber:
|
|
223
221
|
"Write a module/object stub to an open file. Can be called recursive."
|
224
222
|
gc.collect()
|
225
223
|
if object_expr in self.problematic:
|
226
|
-
self.
|
224
|
+
self.log.warning("SKIPPING problematic module:{}".format(object_expr))
|
227
225
|
return
|
228
226
|
|
229
|
-
# self.
|
227
|
+
# self.log.debug("DUMP : {}".format(object_expr))
|
230
228
|
items, errors = self.get_obj_attributes(object_expr)
|
231
229
|
|
232
230
|
if errors:
|
233
|
-
self.
|
231
|
+
self.log.error(errors)
|
234
232
|
|
235
233
|
for item_name, item_repr, item_type_txt, item_instance, _ in items:
|
236
234
|
# name_, repr_(value), type as text, item_instance, order
|
@@ -238,11 +236,11 @@ class Stubber:
|
|
238
236
|
# do not create stubs for these primitives
|
239
237
|
continue
|
240
238
|
if item_name[0].isdigit():
|
241
|
-
self.
|
239
|
+
self.log.warning("NameError: invalid name {}".format(item_name))
|
242
240
|
continue
|
243
241
|
# Class expansion only on first 3 levels (bit of a hack)
|
244
242
|
if item_type_txt == "<class 'type'>" and len(indent) <= _MAX_CLASS_LEVEL * 4:
|
245
|
-
self.
|
243
|
+
self.log.debug("{0}class {1}:".format(indent, item_name))
|
246
244
|
superclass = ""
|
247
245
|
is_exception = (
|
248
246
|
item_name.endswith("Exception")
|
@@ -265,7 +263,7 @@ class Stubber:
|
|
265
263
|
# write classdef
|
266
264
|
fp.write(s)
|
267
265
|
# first write the class literals and methods
|
268
|
-
self.
|
266
|
+
self.log.debug("# recursion over class {0}".format(item_name))
|
269
267
|
self.write_object_stub(
|
270
268
|
fp,
|
271
269
|
item_instance,
|
@@ -279,7 +277,7 @@ class Stubber:
|
|
279
277
|
s += indent + " ...\n\n"
|
280
278
|
fp.write(s)
|
281
279
|
elif any(word in item_type_txt for word in ["method", "function", "closure"]):
|
282
|
-
self.
|
280
|
+
self.log.debug(
|
283
281
|
"# def {1} function/method/closure, type = '{0}'".format(
|
284
282
|
item_type_txt, item_name
|
285
283
|
)
|
@@ -303,7 +301,7 @@ class Stubber:
|
|
303
301
|
)
|
304
302
|
s += indent + " ...\n\n"
|
305
303
|
fp.write(s)
|
306
|
-
self.
|
304
|
+
self.log.debug("\n" + s)
|
307
305
|
elif item_type_txt == "<class 'module'>":
|
308
306
|
# Skip imported modules
|
309
307
|
# fp.write("# import {}\n".format(item_name))
|
@@ -331,10 +329,10 @@ class Stubber:
|
|
331
329
|
indent, item_name, t, item_type_txt, item_repr
|
332
330
|
)
|
333
331
|
fp.write(s)
|
334
|
-
self.
|
332
|
+
self.log.debug("\n" + s)
|
335
333
|
else:
|
336
334
|
# keep only the name
|
337
|
-
self.
|
335
|
+
self.log.debug("# all other, type = '{0}'".format(item_type_txt))
|
338
336
|
fp.write("# all other, type = '{0}'\n".format(item_type_txt))
|
339
337
|
|
340
338
|
fp.write(indent + item_name + " # type: Incomplete\n")
|
@@ -360,7 +358,7 @@ class Stubber:
|
|
360
358
|
"Remove all files from the stub folder"
|
361
359
|
if path is None:
|
362
360
|
path = self.path
|
363
|
-
self.
|
361
|
+
self.log.info("Clean/remove files in folder: {}".format(path))
|
364
362
|
try:
|
365
363
|
os.stat(path) # TEMP workaround mpremote listdir bug -
|
366
364
|
items = os.listdir(path)
|
@@ -380,13 +378,13 @@ class Stubber:
|
|
380
378
|
|
381
379
|
def report(self, filename: str = "modules.json"):
|
382
380
|
"create json with list of exported modules"
|
383
|
-
self.
|
381
|
+
self.log.info(
|
384
382
|
"Created stubs for {} modules on board {}\nPath: {}".format(
|
385
383
|
len(self._report), self._fwid, self.path
|
386
384
|
)
|
387
385
|
)
|
388
386
|
f_name = "{}/{}".format(self.path, filename)
|
389
|
-
self.
|
387
|
+
self.log.info("Report file: {}".format(f_name))
|
390
388
|
gc.collect()
|
391
389
|
try:
|
392
390
|
# write json by node to reduce memory requirements
|
@@ -398,9 +396,9 @@ class Stubber:
|
|
398
396
|
first = False
|
399
397
|
self.write_json_end(f)
|
400
398
|
used = self._start_free - gc.mem_free() # type: ignore
|
401
|
-
self.
|
399
|
+
self.log.info("Memory used: {0} Kb".format(used // 1024))
|
402
400
|
except OSError:
|
403
|
-
self.
|
401
|
+
self.log.error("Failed to create the report.")
|
404
402
|
|
405
403
|
def write_json_header(self, f):
|
406
404
|
f.write("{")
|
@@ -435,7 +433,7 @@ def ensure_folder(path: str):
|
|
435
433
|
try:
|
436
434
|
os.mkdir(p)
|
437
435
|
except OSError as e2:
|
438
|
-
|
436
|
+
log.error("failed to create folder {}".format(p))
|
439
437
|
raise e2
|
440
438
|
# next level deep
|
441
439
|
start = i + 1
|
@@ -912,7 +910,7 @@ def main():
|
|
912
910
|
|
913
911
|
if __name__ == "__main__" or is_micropython():
|
914
912
|
try:
|
915
|
-
|
913
|
+
log = logging.getLogger("stubber")
|
916
914
|
logging.basicConfig(level=logging.INFO)
|
917
915
|
# logging.basicConfig(level=logging.DEBUG)
|
918
916
|
except NameError:
|
stubber/board/createstubs_db.py
CHANGED
@@ -18,7 +18,7 @@ Create stubs for (all) modules on a MicroPython board.
|
|
18
18
|
- cross compilation, using mpy-cross, to avoid the compilation step on the micropython device
|
19
19
|
|
20
20
|
|
21
|
-
This variant was generated from createstubs.py by micropython-stubber v1.15.
|
21
|
+
This variant was generated from createstubs.py by micropython-stubber v1.15.1
|
22
22
|
"""
|
23
23
|
# Copyright (c) 2019-2023 Jos Verlinde
|
24
24
|
# pylint: disable= invalid-name, missing-function-docstring, import-outside-toplevel, logging-not-lazy
|
@@ -39,7 +39,7 @@ try:
|
|
39
39
|
except ImportError:
|
40
40
|
from ucollections import OrderedDict # type: ignore
|
41
41
|
|
42
|
-
__version__ = "v1.15.
|
42
|
+
__version__ = "v1.15.1"
|
43
43
|
ENOENT = 2
|
44
44
|
_MAX_CLASS_LEVEL = 2 # Max class nesting
|
45
45
|
LIBS = [".", "/lib", "/sd/lib", "/flash/lib", "lib"]
|
@@ -55,12 +55,12 @@ class Stubber:
|
|
55
55
|
raise NotImplementedError("MicroPython 1.13.0 cannot be stubbed")
|
56
56
|
except AttributeError:
|
57
57
|
pass
|
58
|
-
|
59
|
-
self.
|
58
|
+
self.log = None
|
59
|
+
self.log = logging.getLogger("stubber")
|
60
60
|
self._report = [] # type: list[str]
|
61
61
|
self.info = _info()
|
62
|
-
self.
|
63
|
-
self.
|
62
|
+
self.log.info("Port: {}".format(self.info["port"]))
|
63
|
+
self.log.info("Board: {}".format(self.info["board"]))
|
64
64
|
gc.collect()
|
65
65
|
if firmware_id:
|
66
66
|
self._fwid = firmware_id.lower()
|
@@ -78,11 +78,11 @@ class Stubber:
|
|
78
78
|
path = get_root()
|
79
79
|
|
80
80
|
self.path = "{}/stubs/{}".format(path, self.flat_fwid).replace("//", "/")
|
81
|
-
self.
|
81
|
+
self.log.debug(self.path)
|
82
82
|
try:
|
83
83
|
ensure_folder(path + "/")
|
84
84
|
except OSError:
|
85
|
-
self.
|
85
|
+
self.log.error("error creating stub folder {}".format(path))
|
86
86
|
self.problematic = [
|
87
87
|
"upip",
|
88
88
|
"upysh",
|
@@ -107,11 +107,11 @@ class Stubber:
|
|
107
107
|
# name_, repr_(value), type as text, item_instance
|
108
108
|
_result = []
|
109
109
|
_errors = []
|
110
|
-
self.
|
110
|
+
self.log.debug("get attributes {} {}".format(repr(item_instance), item_instance))
|
111
111
|
for name in dir(item_instance):
|
112
112
|
if name.startswith("_") and not name in self.modules:
|
113
113
|
continue
|
114
|
-
self.
|
114
|
+
self.log.debug("get attribute {}".format(name))
|
115
115
|
try:
|
116
116
|
val = getattr(item_instance, name)
|
117
117
|
# name , item_repr(value) , type as text, item_instance, order
|
@@ -147,18 +147,18 @@ class Stubber:
|
|
147
147
|
|
148
148
|
def create_all_stubs(self):
|
149
149
|
"Create stubs for all configured modules"
|
150
|
-
self.
|
150
|
+
self.log.info("Start micropython-stubber v{} on {}".format(__version__, self._fwid))
|
151
151
|
gc.collect()
|
152
152
|
for module_name in self.modules:
|
153
153
|
self.create_one_stub(module_name)
|
154
|
-
self.
|
154
|
+
self.log.info("Finally done")
|
155
155
|
|
156
156
|
def create_one_stub(self, module_name: str):
|
157
157
|
if module_name in self.problematic:
|
158
|
-
self.
|
158
|
+
self.log.warning("Skip module: {:<25} : Known problematic".format(module_name))
|
159
159
|
return False
|
160
160
|
if module_name in self.excluded:
|
161
|
-
self.
|
161
|
+
self.log.warning("Skip module: {:<25} : Excluded".format(module_name))
|
162
162
|
return False
|
163
163
|
|
164
164
|
file_name = "{}/{}.py".format(self.path, module_name.replace(".", "/"))
|
@@ -193,10 +193,10 @@ class Stubber:
|
|
193
193
|
try:
|
194
194
|
new_module = __import__(module_name, None, None, ("*"))
|
195
195
|
m1 = gc.mem_free() # type: ignore
|
196
|
-
self.
|
196
|
+
self.log.info("Stub module: {:<25} to file: {:<70} mem:{:>5}".format(module_name, fname, m1))
|
197
197
|
|
198
198
|
except ImportError:
|
199
|
-
self.
|
199
|
+
self.log.warning("Skip module: {:<25} {:<79}".format(module_name, "Module not found."))
|
200
200
|
return False
|
201
201
|
|
202
202
|
# Start a new file
|
@@ -216,11 +216,11 @@ class Stubber:
|
|
216
216
|
try:
|
217
217
|
del new_module
|
218
218
|
except (OSError, KeyError): # lgtm [py/unreachable-statement]
|
219
|
-
self.
|
219
|
+
self.log.warning("could not del new_module")
|
220
220
|
try:
|
221
221
|
del sys.modules[module_name]
|
222
222
|
except KeyError:
|
223
|
-
self.
|
223
|
+
self.log.debug("could not del sys.modules[{}]".format(module_name))
|
224
224
|
gc.collect()
|
225
225
|
return True
|
226
226
|
|
@@ -228,14 +228,14 @@ class Stubber:
|
|
228
228
|
"Write a module/object stub to an open file. Can be called recursive."
|
229
229
|
gc.collect()
|
230
230
|
if object_expr in self.problematic:
|
231
|
-
self.
|
231
|
+
self.log.warning("SKIPPING problematic module:{}".format(object_expr))
|
232
232
|
return
|
233
233
|
|
234
|
-
# self.
|
234
|
+
# self.log.debug("DUMP : {}".format(object_expr))
|
235
235
|
items, errors = self.get_obj_attributes(object_expr)
|
236
236
|
|
237
237
|
if errors:
|
238
|
-
self.
|
238
|
+
self.log.error(errors)
|
239
239
|
|
240
240
|
for item_name, item_repr, item_type_txt, item_instance, _ in items:
|
241
241
|
# name_, repr_(value), type as text, item_instance, order
|
@@ -243,11 +243,11 @@ class Stubber:
|
|
243
243
|
# do not create stubs for these primitives
|
244
244
|
continue
|
245
245
|
if item_name[0].isdigit():
|
246
|
-
self.
|
246
|
+
self.log.warning("NameError: invalid name {}".format(item_name))
|
247
247
|
continue
|
248
248
|
# Class expansion only on first 3 levels (bit of a hack)
|
249
249
|
if item_type_txt == "<class 'type'>" and len(indent) <= _MAX_CLASS_LEVEL * 4:
|
250
|
-
self.
|
250
|
+
self.log.debug("{0}class {1}:".format(indent, item_name))
|
251
251
|
superclass = ""
|
252
252
|
is_exception = (
|
253
253
|
item_name.endswith("Exception")
|
@@ -270,7 +270,7 @@ class Stubber:
|
|
270
270
|
# write classdef
|
271
271
|
fp.write(s)
|
272
272
|
# first write the class literals and methods
|
273
|
-
self.
|
273
|
+
self.log.debug("# recursion over class {0}".format(item_name))
|
274
274
|
self.write_object_stub(
|
275
275
|
fp,
|
276
276
|
item_instance,
|
@@ -284,7 +284,7 @@ class Stubber:
|
|
284
284
|
s += indent + " ...\n\n"
|
285
285
|
fp.write(s)
|
286
286
|
elif any(word in item_type_txt for word in ["method", "function", "closure"]):
|
287
|
-
self.
|
287
|
+
self.log.debug("# def {1} function/method/closure, type = '{0}'".format(item_type_txt, item_name))
|
288
288
|
# module Function or class method
|
289
289
|
# will accept any number of params
|
290
290
|
# return type Any/Incomplete
|
@@ -300,7 +300,7 @@ class Stubber:
|
|
300
300
|
s = "{}def {}({}*args, **kwargs) -> {}:\n".format(indent, item_name, first, ret)
|
301
301
|
s += indent + " ...\n\n"
|
302
302
|
fp.write(s)
|
303
|
-
self.
|
303
|
+
self.log.debug("\n" + s)
|
304
304
|
elif item_type_txt == "<class 'module'>":
|
305
305
|
# Skip imported modules
|
306
306
|
# fp.write("# import {}\n".format(item_name))
|
@@ -326,10 +326,10 @@ class Stubber:
|
|
326
326
|
# Requires Python 3.6 syntax, which is OK for the stubs/pyi
|
327
327
|
s = "{0}{1} : {2} ## {3} = {4}\n".format(indent, item_name, t, item_type_txt, item_repr)
|
328
328
|
fp.write(s)
|
329
|
-
self.
|
329
|
+
self.log.debug("\n" + s)
|
330
330
|
else:
|
331
331
|
# keep only the name
|
332
|
-
self.
|
332
|
+
self.log.debug("# all other, type = '{0}'".format(item_type_txt))
|
333
333
|
fp.write("# all other, type = '{0}'\n".format(item_type_txt))
|
334
334
|
|
335
335
|
fp.write(indent + item_name + " # type: Incomplete\n")
|
@@ -355,7 +355,7 @@ class Stubber:
|
|
355
355
|
"Remove all files from the stub folder"
|
356
356
|
if path is None:
|
357
357
|
path = self.path
|
358
|
-
self.
|
358
|
+
self.log.info("Clean/remove files in folder: {}".format(path))
|
359
359
|
try:
|
360
360
|
os.stat(path) # TEMP workaround mpremote listdir bug -
|
361
361
|
items = os.listdir(path)
|
@@ -375,9 +375,9 @@ class Stubber:
|
|
375
375
|
|
376
376
|
def report(self, filename: str = "modules.json"):
|
377
377
|
"create json with list of exported modules"
|
378
|
-
self.
|
378
|
+
self.log.info("Created stubs for {} modules on board {}\nPath: {}".format(len(self._report), self._fwid, self.path))
|
379
379
|
f_name = "{}/{}".format(self.path, filename)
|
380
|
-
self.
|
380
|
+
self.log.info("Report file: {}".format(f_name))
|
381
381
|
gc.collect()
|
382
382
|
try:
|
383
383
|
# write json by node to reduce memory requirements
|
@@ -389,9 +389,9 @@ class Stubber:
|
|
389
389
|
first = False
|
390
390
|
self.write_json_end(f)
|
391
391
|
used = self._start_free - gc.mem_free() # type: ignore
|
392
|
-
self.
|
392
|
+
self.log.info("Memory used: {0} Kb".format(used // 1024))
|
393
393
|
except OSError:
|
394
|
-
self.
|
394
|
+
self.log.error("Failed to create the report.")
|
395
395
|
|
396
396
|
def write_json_header(self, f):
|
397
397
|
f.write("{")
|
@@ -426,7 +426,7 @@ def ensure_folder(path: str):
|
|
426
426
|
try:
|
427
427
|
os.mkdir(p)
|
428
428
|
except OSError as e2:
|
429
|
-
|
429
|
+
log.error("failed to create folder {}".format(p))
|
430
430
|
raise e2
|
431
431
|
# next level deep
|
432
432
|
start = i + 1
|
@@ -726,7 +726,7 @@ def get_modulelist(stubber):
|
|
726
726
|
|
727
727
|
if __name__ == "__main__" or is_micropython():
|
728
728
|
try:
|
729
|
-
|
729
|
+
log = logging.getLogger("stubber")
|
730
730
|
logging.basicConfig(level=logging.INFO)
|
731
731
|
# logging.basicConfig(level=logging.DEBUG)
|
732
732
|
except NameError:
|