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.
- {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.2.dist-info}/LICENSE +30 -30
- {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.2.dist-info}/METADATA +4 -4
- micropython_stubber-1.23.2.dist-info/RECORD +158 -0
- mpflash/README.md +220 -220
- 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 -216
- mpflash/mpflash/cli_group.py +111 -111
- mpflash/mpflash/cli_list.py +87 -87
- mpflash/mpflash/cli_main.py +39 -39
- mpflash/mpflash/common.py +210 -166
- mpflash/mpflash/config.py +44 -44
- mpflash/mpflash/connected.py +96 -77
- 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 -106
- 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 -266
- 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 -437
- 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 -49
- 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 -92
- stubber/commands/get_frozen_cmd.py +117 -117
- stubber/commands/get_mcu_cmd.py +102 -102
- 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 -37
- stubber/freeze/common.py +72 -72
- stubber/freeze/freeze_folder.py +69 -69
- stubber/freeze/freeze_manifest_2.py +126 -126
- stubber/freeze/get_frozen.py +131 -131
- stubber/get_cpython.py +112 -112
- stubber/get_lobo.py +59 -59
- stubber/minify.py +423 -423
- stubber/publish/bump.py +86 -86
- stubber/publish/candidates.py +275 -275
- 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 -132
- stubber/publish/missing_class_methods.py +51 -51
- stubber/publish/package.py +150 -150
- stubber/publish/pathnames.py +51 -51
- stubber/publish/publish.py +120 -120
- stubber/publish/pypi.py +42 -42
- stubber/publish/stubpackage.py +1055 -1051
- stubber/rst/__init__.py +9 -9
- stubber/rst/classsort.py +78 -78
- stubber/rst/lookup.py +533 -531
- stubber/rst/output_dict.py +401 -401
- stubber/rst/reader.py +814 -814
- stubber/rst/report_return.py +77 -77
- stubber/rst/rst_utils.py +541 -541
- 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 -137
- stubber/utils/makeversionhdr.py +54 -54
- stubber/utils/manifest.py +90 -90
- stubber/utils/post.py +80 -80
- stubber/utils/repos.py +156 -156
- stubber/utils/stubmaker.py +139 -139
- stubber/utils/typed_config_toml.py +80 -80
- stubber/variants.py +106 -106
- micropython_stubber-1.23.1.post1.dist-info/RECORD +0 -159
- mpflash/basicgit.py +0 -288
- {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.2.dist-info}/WHEEL +0 -0
- {micropython_stubber-1.23.1.post1.dist-info → micropython_stubber-1.23.2.dist-info}/entry_points.txt +0 -0
@@ -1,332 +1,333 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
R=True
|
32
|
-
Q='family'
|
33
|
-
P=len
|
34
|
-
O=ImportError
|
35
|
-
N=dir
|
36
|
-
M=open
|
37
|
-
K='port'
|
38
|
-
J='.'
|
39
|
-
I=AttributeError
|
40
|
-
H=False
|
41
|
-
G='/'
|
42
|
-
E=None
|
43
|
-
D=OSError
|
44
|
-
C='version'
|
45
|
-
B=''
|
46
|
-
import gc as F,os,sys
|
47
|
-
from time import sleep
|
48
|
-
try:from ujson import dumps
|
49
|
-
except:from json import dumps
|
50
|
-
try:from machine import reset
|
51
|
-
except O:pass
|
52
|
-
try:from collections import OrderedDict as
|
53
|
-
except O:from ucollections import OrderedDict as
|
54
|
-
__version__='v1.23.
|
55
|
-
|
56
|
-
A4=2
|
57
|
-
A5=
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
A
|
71
|
-
L.
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
B.
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
elif E in
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
except
|
105
|
-
|
106
|
-
|
107
|
-
def
|
108
|
-
|
109
|
-
|
110
|
-
B.
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
if B in C.
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
K.
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
if E[
|
142
|
-
if
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
if
|
152
|
-
|
153
|
-
C
|
154
|
-
|
155
|
-
elif I
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
elif G in(
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
if K in H:H=H.split(K)[0]+Z
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
elif A[K]==
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
if A[Q]==
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
A[
|
256
|
-
|
257
|
-
A[
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
return
|
278
|
-
|
279
|
-
|
280
|
-
def
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
if
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
1
|
+
A3='No report file'
|
2
|
+
A2='Failed to create the report.'
|
3
|
+
A1='method'
|
4
|
+
A0='function'
|
5
|
+
z='bool'
|
6
|
+
y='str'
|
7
|
+
x='float'
|
8
|
+
w='int'
|
9
|
+
v='micropython'
|
10
|
+
u='stubber'
|
11
|
+
t=Exception
|
12
|
+
s=KeyError
|
13
|
+
r=sorted
|
14
|
+
q=MemoryError
|
15
|
+
p=NotImplementedError
|
16
|
+
l=',\n'
|
17
|
+
k='modules.json'
|
18
|
+
j='{}/{}'
|
19
|
+
i='w'
|
20
|
+
h='dict'
|
21
|
+
g='list'
|
22
|
+
f='tuple'
|
23
|
+
e=TypeError
|
24
|
+
d=str
|
25
|
+
c=repr
|
26
|
+
X='-preview'
|
27
|
+
W='-'
|
28
|
+
V='board'
|
29
|
+
U=IndexError
|
30
|
+
T=print
|
31
|
+
R=True
|
32
|
+
Q='family'
|
33
|
+
P=len
|
34
|
+
O=ImportError
|
35
|
+
N=dir
|
36
|
+
M=open
|
37
|
+
K='port'
|
38
|
+
J='.'
|
39
|
+
I=AttributeError
|
40
|
+
H=False
|
41
|
+
G='/'
|
42
|
+
E=None
|
43
|
+
D=OSError
|
44
|
+
C='version'
|
45
|
+
B=''
|
46
|
+
import gc as F,os,sys
|
47
|
+
from time import sleep
|
48
|
+
try:from ujson import dumps
|
49
|
+
except:from json import dumps
|
50
|
+
try:from machine import reset
|
51
|
+
except O:pass
|
52
|
+
try:from collections import OrderedDict as m
|
53
|
+
except O:from ucollections import OrderedDict as m
|
54
|
+
__version__='v1.23.2'
|
55
|
+
S=__version__.rsplit(J,1)[0]
|
56
|
+
A4=2
|
57
|
+
A5=2
|
58
|
+
A6=['lib','/lib','/sd/lib','/flash/lib',J]
|
59
|
+
class L:
|
60
|
+
INFO=20;WARNING=30;ERROR=40;level=INFO;prnt=T
|
61
|
+
@staticmethod
|
62
|
+
def getLogger(name):return L()
|
63
|
+
@classmethod
|
64
|
+
def basicConfig(A,level):A.level=level
|
65
|
+
def info(A,msg):
|
66
|
+
if A.level<=L.INFO:A.prnt('INFO :',msg)
|
67
|
+
def warning(A,msg):
|
68
|
+
if A.level<=L.WARNING:A.prnt('WARN :',msg)
|
69
|
+
def error(A,msg):
|
70
|
+
if A.level<=L.ERROR:A.prnt('ERROR :',msg)
|
71
|
+
A=L.getLogger(u)
|
72
|
+
L.basicConfig(level=L.INFO)
|
73
|
+
class Stubber:
|
74
|
+
def __init__(B,path=E,firmware_id=E):
|
75
|
+
C=firmware_id
|
76
|
+
try:
|
77
|
+
if os.uname().release=='1.13.0'and os.uname().version<'v1.13-103':raise p('MicroPython 1.13.0 cannot be stubbed')
|
78
|
+
except I:pass
|
79
|
+
B.info=_info();A.info('Port: {}'.format(B.info[K]));A.info('Board: {}'.format(B.info[V]));F.collect()
|
80
|
+
if C:B._fwid=C.lower()
|
81
|
+
elif B.info[Q]==v:B._fwid='{family}-v{version}-{port}-{board}'.format(**B.info).rstrip(W)
|
82
|
+
else:B._fwid='{family}-v{version}-{port}'.format(**B.info)
|
83
|
+
B._start_free=F.mem_free()
|
84
|
+
if path:
|
85
|
+
if path.endswith(G):path=path[:-1]
|
86
|
+
else:path=get_root()
|
87
|
+
B.path='{}/stubs/{}'.format(path,B.flat_fwid).replace('//',G)
|
88
|
+
try:Y(path+G)
|
89
|
+
except D:A.error('error creating stub folder {}'.format(path))
|
90
|
+
B.problematic=['upip','upysh','webrepl_setup','http_client','http_client_ssl','http_server','http_server_ssl'];B.excluded=['webrepl','_webrepl','port_diag','example_sub_led.py','example_pub_button.py'];B.modules=[];B._json_name=E;B._json_first=H
|
91
|
+
def get_obj_attributes(L,item_instance):
|
92
|
+
H=item_instance;C=[];K=[]
|
93
|
+
for A in N(H):
|
94
|
+
if A.startswith('__')and not A in L.modules:continue
|
95
|
+
try:
|
96
|
+
D=getattr(H,A)
|
97
|
+
try:E=c(type(D)).split("'")[1]
|
98
|
+
except U:E=B
|
99
|
+
if E in{w,x,y,z,f,g,h}:G=1
|
100
|
+
elif E in{A0,A1}:G=2
|
101
|
+
elif E in'class':G=3
|
102
|
+
else:G=4
|
103
|
+
C.append((A,c(D),c(type(D)),D,G))
|
104
|
+
except I as J:K.append("Couldn't get attribute '{}' from object '{}', Err: {}".format(A,H,J))
|
105
|
+
except q as J:T('MemoryError: {}'.format(J));sleep(1);reset()
|
106
|
+
C=r([A for A in C if not A[0].startswith('__')],key=lambda x:x[4]);F.collect();return C,K
|
107
|
+
def add_modules(A,modules):A.modules=r(set(A.modules)|set(modules))
|
108
|
+
def create_all_stubs(B):
|
109
|
+
A.info('Start micropython-stubber {} on {}'.format(__version__,B._fwid));B.report_start();F.collect()
|
110
|
+
for C in B.modules:B.create_one_stub(C)
|
111
|
+
B.report_end();A.info('Finally done')
|
112
|
+
def create_one_stub(C,module_name):
|
113
|
+
B=module_name
|
114
|
+
if B in C.problematic:A.warning('Skip module: {:<25} : Known problematic'.format(B));return H
|
115
|
+
if B in C.excluded:A.warning('Skip module: {:<25} : Excluded'.format(B));return H
|
116
|
+
I='{}/{}.pyi'.format(C.path,B.replace(J,G));F.collect();E=H
|
117
|
+
try:E=C.create_module_stub(B,I)
|
118
|
+
except D:return H
|
119
|
+
F.collect();return E
|
120
|
+
def create_module_stub(K,module_name,file_name=E):
|
121
|
+
I=file_name;C=module_name
|
122
|
+
if I is E:L=C.replace(J,'_')+'.pyi';I=K.path+G+L
|
123
|
+
else:L=I.split(G)[-1]
|
124
|
+
if G in C:C=C.replace(G,J)
|
125
|
+
N=E
|
126
|
+
try:N=__import__(C,E,E,'*');Q=F.mem_free();A.info('Stub module: {:<25} to file: {:<70} mem:{:>5}'.format(C,L,Q))
|
127
|
+
except O:return H
|
128
|
+
Y(I)
|
129
|
+
with M(I,i)as P:T=d(K.info).replace('OrderedDict(',B).replace('})','}');U='"""\nModule: \'{0}\' on {1}\n"""\n# MCU: {2}\n# Stubber: {3}\n'.format(C,K._fwid,T,S);P.write(U);P.write('from __future__ import annotations\nfrom typing import Any, Generator\nfrom _typeshed import Incomplete\n\n');K.write_object_stub(P,N,C,B)
|
130
|
+
K.report_add(C,I)
|
131
|
+
if C not in{'os','sys','logging','gc'}:
|
132
|
+
try:del N
|
133
|
+
except(D,s):A.warning('could not del new_module')
|
134
|
+
F.collect();return R
|
135
|
+
def write_object_stub(L,fp,object_expr,obj_name,indent,in_class=0):
|
136
|
+
Z=' at ...>';Y='generator';X='{0}{1}: {3} = {2}\n';W='bound_method';V='Incomplete';O=in_class;N='Exception';M=object_expr;K=' at ';J=fp;D=indent;F.collect()
|
137
|
+
if M in L.problematic:A.warning('SKIPPING problematic module:{}'.format(M));return
|
138
|
+
a,Q=L.get_obj_attributes(M)
|
139
|
+
if Q:A.error(Q)
|
140
|
+
for(E,H,I,b,d)in a:
|
141
|
+
if E in['classmethod','staticmethod','BaseException',N]:continue
|
142
|
+
if E[0].isdigit():A.warning('NameError: invalid name {}'.format(E));continue
|
143
|
+
if I=="<class 'type'>"and P(D)<=A5*4:
|
144
|
+
R=B;S=E.endswith(N)or E.endswith('Error')or E in['KeyboardInterrupt','StopIteration','SystemExit']
|
145
|
+
if S:R=N
|
146
|
+
C='\n{}class {}({}):\n'.format(D,E,R)
|
147
|
+
if S:C+=D+' ...\n';J.write(C);continue
|
148
|
+
J.write(C);L.write_object_stub(J,b,'{0}.{1}'.format(obj_name,E),D+' ',O+1);C=D+' def __init__(self, *argv, **kwargs) -> None:\n';C+=D+' ...\n\n';J.write(C)
|
149
|
+
elif any(A in I for A in[A1,A0,'closure']):
|
150
|
+
T=V;U=B
|
151
|
+
if O>0:U='self, '
|
152
|
+
if W in I or W in H:C='{}@classmethod\n'.format(D)+'{}def {}(cls, *args, **kwargs) -> {}:\n'.format(D,E,T)
|
153
|
+
else:C='{}def {}({}*args, **kwargs) -> {}:\n'.format(D,E,U,T)
|
154
|
+
C+=D+' ...\n\n';J.write(C)
|
155
|
+
elif I=="<class 'module'>":0
|
156
|
+
elif I.startswith("<class '"):
|
157
|
+
G=I[8:-2];C=B
|
158
|
+
if G in(y,w,x,z,'bytearray','bytes'):C=X.format(D,E,H,G)
|
159
|
+
elif G in(h,g,f):c={h:'{}',g:'[]',f:'()'};C=X.format(D,E,c[G],G)
|
160
|
+
elif G in('object','set','frozenset','Pin',Y):
|
161
|
+
if G==Y:G='Generator'
|
162
|
+
C='{0}{1}: {2} ## = {4}\n'.format(D,E,G,I,H)
|
163
|
+
else:
|
164
|
+
G=V
|
165
|
+
if K in H:H=H.split(K)[0]+Z
|
166
|
+
if K in H:H=H.split(K)[0]+Z
|
167
|
+
C='{0}{1}: {2} ## {3} = {4}\n'.format(D,E,G,I,H)
|
168
|
+
J.write(C)
|
169
|
+
else:J.write("# all other, type = '{0}'\n".format(I));J.write(D+E+' # type: Incomplete\n')
|
170
|
+
@property
|
171
|
+
def flat_fwid(self):
|
172
|
+
A=self._fwid;B=' .()/\\:$'
|
173
|
+
for C in B:A=A.replace(C,'_')
|
174
|
+
return A
|
175
|
+
def clean(C,path=E):
|
176
|
+
if path is E:path=C.path
|
177
|
+
A.info('Clean/remove files in folder: {}'.format(path))
|
178
|
+
try:os.stat(path);F=os.listdir(path)
|
179
|
+
except(D,I):return
|
180
|
+
for G in F:
|
181
|
+
B=j.format(path,G)
|
182
|
+
try:os.remove(B)
|
183
|
+
except D:
|
184
|
+
try:C.clean(B);os.rmdir(B)
|
185
|
+
except D:pass
|
186
|
+
def report_start(B,filename=k):
|
187
|
+
H='firmware';B._json_name=j.format(B.path,filename);B._json_first=R;Y(B._json_name);A.info('Report file: {}'.format(B._json_name));F.collect()
|
188
|
+
try:
|
189
|
+
with M(B._json_name,i)as G:G.write('{');G.write(dumps({H:B.info})[1:-1]);G.write(l);G.write(dumps({u:{C:S},'stubtype':H})[1:-1]);G.write(l);G.write('"modules" :[\n')
|
190
|
+
except D as I:A.error(A2);B._json_name=E;raise I
|
191
|
+
def report_add(B,module_name,stub_file):
|
192
|
+
if not B._json_name:raise t(A3)
|
193
|
+
try:
|
194
|
+
with M(B._json_name,'a')as C:
|
195
|
+
if not B._json_first:C.write(l)
|
196
|
+
else:B._json_first=H
|
197
|
+
E='{{"module": "{}", "file": "{}"}}'.format(module_name,stub_file.replace('\\',G));C.write(E)
|
198
|
+
except D:A.error(A2)
|
199
|
+
def report_end(B):
|
200
|
+
if not B._json_name:raise t(A3)
|
201
|
+
with M(B._json_name,'a')as C:C.write('\n]}')
|
202
|
+
A.info('Path: {}'.format(B.path))
|
203
|
+
def Y(path):
|
204
|
+
B=E=0
|
205
|
+
while B!=-1:
|
206
|
+
B=path.find(G,E)
|
207
|
+
if B!=-1:
|
208
|
+
C=path[0]if B==0 else path[:B]
|
209
|
+
try:I=os.stat(C)
|
210
|
+
except D as F:
|
211
|
+
if F.args[0]==A4:
|
212
|
+
try:os.mkdir(C)
|
213
|
+
except D as H:A.error('failed to create folder {}'.format(C));raise H
|
214
|
+
E=B+1
|
215
|
+
def Z(s):
|
216
|
+
C=' on '
|
217
|
+
if not s:return B
|
218
|
+
s=s.split(C,1)[0]if C in s else s
|
219
|
+
if s.startswith('v'):
|
220
|
+
if not W in s:return B
|
221
|
+
A=s.split(W)[1];return A
|
222
|
+
if not X in s:return B
|
223
|
+
A=s.split(X)[1].split(J)[1];return A
|
224
|
+
def _info():
|
225
|
+
b='ev3-pybricks';a='pycom';Y='pycopy';W='unix';T='win32';R='arch';P='cpu';M='ver';F='mpy';D='build'
|
226
|
+
try:H=sys.implementation[0]
|
227
|
+
except e:H=sys.implementation.name
|
228
|
+
A=m({Q:H,C:B,D:B,M:B,K:sys.platform,V:'UNKNOWN',P:B,F:B,R:B})
|
229
|
+
if A[K].startswith('pyb'):A[K]='stm32'
|
230
|
+
elif A[K]==T:A[K]='windows'
|
231
|
+
elif A[K]=='linux':A[K]=W
|
232
|
+
try:A[C]=S(sys.implementation.version)
|
233
|
+
except I:pass
|
234
|
+
try:J=sys.implementation._machine if'_machine'in N(sys.implementation)else os.uname().machine;A[V]=J;A[P]=J.split('with')[-1].strip();A[F]=sys.implementation._mpy if'_mpy'in N(sys.implementation)else sys.implementation.mpy if F in N(sys.implementation)else B
|
235
|
+
except(I,U):pass
|
236
|
+
A[V]=A7()
|
237
|
+
try:
|
238
|
+
if'uname'in N(os):
|
239
|
+
A[D]=Z(os.uname()[3])
|
240
|
+
if not A[D]:A[D]=Z(os.uname()[2])
|
241
|
+
elif C in N(sys):A[D]=Z(sys.version)
|
242
|
+
except(I,U,e):pass
|
243
|
+
if A[C]==B and sys.platform not in(W,T):
|
244
|
+
try:c=os.uname();A[C]=c.release
|
245
|
+
except(U,I,e):pass
|
246
|
+
for(d,f,g)in[(Y,Y,'const'),(a,a,'FAT'),(b,'pybricks.hubs','EV3Brick')]:
|
247
|
+
try:h=__import__(f,E,E,g);A[Q]=d;del h;break
|
248
|
+
except(O,s):pass
|
249
|
+
if A[Q]==b:A['release']='2.0.0'
|
250
|
+
if A[Q]==v:
|
251
|
+
A[C]
|
252
|
+
if A[C]and A[C].endswith('.0')and A[C]>='1.10.0'and A[C]<='1.19.9':A[C]=A[C][:-2]
|
253
|
+
if F in A and A[F]:
|
254
|
+
G=int(A[F]);L=[E,'x86','x64','armv6','armv6m','armv7m','armv7em','armv7emsp','armv7emdp','xtensa','xtensawin'][G>>10]
|
255
|
+
if L:A[R]=L
|
256
|
+
A[F]='v{}.{}'.format(G&255,G>>8&3)
|
257
|
+
if A[D]and not A[C].endswith(X):A[C]=A[C]+X
|
258
|
+
A[M]=f"{A[C]}-{A[D]}"if A[D]else f"{A[C]}";return A
|
259
|
+
def S(version):
|
260
|
+
A=version;B=J.join([d(A)for A in A[:3]])
|
261
|
+
if P(A)>3 and A[3]:B+=W+A[3]
|
262
|
+
return B
|
263
|
+
def A7():
|
264
|
+
try:from boardname import BOARDNAME as C;A.info('Found BOARDNAME: {}'.format(C))
|
265
|
+
except O:A.warning('BOARDNAME not found');C=B
|
266
|
+
return C
|
267
|
+
def get_root():
|
268
|
+
try:A=os.getcwd()
|
269
|
+
except(D,I):A=J
|
270
|
+
B=A
|
271
|
+
for B in[A,'/sd','/flash',G,J]:
|
272
|
+
try:C=os.stat(B);break
|
273
|
+
except D:continue
|
274
|
+
return B
|
275
|
+
def a(filename):
|
276
|
+
try:
|
277
|
+
if os.stat(filename)[0]>>14:return R
|
278
|
+
return H
|
279
|
+
except D:return H
|
280
|
+
def n():T("-p, --path path to store the stubs in, defaults to '.'");sys.exit(1)
|
281
|
+
def read_path():
|
282
|
+
path=B
|
283
|
+
if P(sys.argv)==3:
|
284
|
+
A=sys.argv[1].lower()
|
285
|
+
if A in('--path','-p'):path=sys.argv[2]
|
286
|
+
else:n()
|
287
|
+
elif P(sys.argv)==2:n()
|
288
|
+
return path
|
289
|
+
def o():
|
290
|
+
try:A=bytes('abc',encoding='utf8');B=o.__module__;return H
|
291
|
+
except(p,I):return R
|
292
|
+
b='modulelist.done'
|
293
|
+
def A8(skip=0):
|
294
|
+
for E in A6:
|
295
|
+
B=E+'/modulelist.txt'
|
296
|
+
if not a(B):continue
|
297
|
+
try:
|
298
|
+
with M(B)as F:
|
299
|
+
C=0
|
300
|
+
while R:
|
301
|
+
A=F.readline().strip()
|
302
|
+
if not A:break
|
303
|
+
if P(A)>0 and A[0]=='#':continue
|
304
|
+
C+=1
|
305
|
+
if C<skip:continue
|
306
|
+
yield A
|
307
|
+
break
|
308
|
+
except D:pass
|
309
|
+
def A9(done):
|
310
|
+
with M(b,i)as A:A.write(d(done)+'\n')
|
311
|
+
def AA():
|
312
|
+
A=0
|
313
|
+
try:
|
314
|
+
with M(b)as B:A=int(B.readline().strip())
|
315
|
+
except D:pass
|
316
|
+
return A
|
317
|
+
def main():
|
318
|
+
import machine as D;C=a(b)
|
319
|
+
if C:A.info('Continue from last run')
|
320
|
+
else:A.info('Starting new run')
|
321
|
+
stubber=Stubber(path=read_path());B=0
|
322
|
+
if not C:stubber.clean();stubber.report_start(k)
|
323
|
+
else:B=AA();stubber._json_name=j.format(stubber.path,k)
|
324
|
+
for E in A8(B):
|
325
|
+
try:stubber.create_one_stub(E)
|
326
|
+
except q:D.reset()
|
327
|
+
F.collect();B+=1;A9(B)
|
328
|
+
T('All modules have been processed, Finalizing report');stubber.report_end()
|
329
|
+
if __name__=='__main__'or o():
|
330
|
+
if not a('no_auto_stubber.txt'):
|
331
|
+
try:F.threshold(4*1024);F.enable()
|
332
|
+
except BaseException:pass
|
332
333
|
main()
|