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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: micropython-stubber
3
- Version: 1.15.0
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,<0.5.0)
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=a0ryal5IScL5B_zAoz8RKoIJgBAG2dwCh3h7Tq2aYRo,51
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=I4nHQ1EenTn7U8zGq-LrC6YnMW6TEboK6XQz4J-iVpc,30841
6
- stubber/board/createstubs_db.py,sha256=CWaH1j40LmbdezSlOq0ZdOdT3TfB40uFKg46I9ORnDU,28351
7
- stubber/board/createstubs_db_min.py,sha256=jDL03wEEwDboTb4TzNl733ATnm5Si6M_k3T-L4J9f9U,10331
8
- stubber/board/createstubs_db_mpy.mpy,sha256=DRm_ssNg4u6-iKA2EBh5b0At_6YiuC_a7vUPygM6YdI,8466
9
- stubber/board/createstubs_info.py,sha256=jxj9sYalBJo5Wb73YGP83J_dqVFYk9KUtxa7p0kfFMo,30313
10
- stubber/board/createstubs_lvgl.py,sha256=gnJI-N_A_HJ_Jzr-F-qX7gN_Y2AEm9MNg46LHsKuaKg,25560
11
- stubber/board/createstubs_lvgl_min.py,sha256=_D-LtGRRPBC9gEwjpqBOgOEpfnoHn63szbh-lydCH74,9685
12
- stubber/board/createstubs_lvgl_mpy.mpy,sha256=mWaMfbBI2UEw4r4Kq7SmynMPOiTC577-gJIPIzgR35Y,8002
13
- stubber/board/createstubs_mem.py,sha256=oMzTg_wkNcONLQSnh3M8AwZvJKvV6oQ2Z0XSbEIsCUU,26219
14
- stubber/board/createstubs_mem_min.py,sha256=8gS6McmVnGJf8fC6Z6J4GFooBIzTfYMNH6kzCjsKznk,9706
15
- stubber/board/createstubs_mem_mpy.mpy,sha256=H71GSmt4LLDbSJ3pxafaDQ-EH6Tz2yzAcY5PJRsmzv4,7950
16
- stubber/board/createstubs_min.py,sha256=otPDxo7zPn5f4TLtAq1RoAqYjpbke5MhFgEPGQXJnZQ,12065
17
- stubber/board/createstubs_mpy.mpy,sha256=R2RsMkQ2LJroSqplaMM24mAGmPvwL13pyYsBlVjznaU,10821
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=MiydqHQmQrvV39oAlV0KQCbTrXmfWccEQFCLFCm7PlY,13482
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=NBRyvu4dK_3CQVoXuqTwUPEvgA5OcO4FTY5XxKXrr-g,36318
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=qgD8B2DP10Y7eAHINzYxIg7G5ktbiwar79Ws0dWlhjk,19866
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.0.dist-info/entry_points.txt,sha256=NQi_M36fgq5k6giSuASas3LrpF6CVdkzfvJC0ja73_g,55
105
- micropython_stubber-1.15.0.dist-info/LICENSE,sha256=2zsOXlYgl9W7_XGXcncAXIYfvSVlyNcVBycC6hhlKhA,1542
106
- micropython_stubber-1.15.0.dist-info/METADATA,sha256=BCsqYJBOKr3KjIISD65IYcepp98egmqYa3SQpbdQqNo,18938
107
- micropython_stubber-1.15.0.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
108
- micropython_stubber-1.15.0.dist-info/RECORD,,
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
@@ -1,4 +1,4 @@
1
1
  """get the version"""
2
2
 
3
3
 
4
- __version__ = "1.15.0"
4
+ __version__ = "1.15.1"
@@ -20,7 +20,7 @@ try:
20
20
  except ImportError:
21
21
  from ucollections import OrderedDict # type: ignore
22
22
 
23
- __version__ = "v1.15.0"
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._log = logging.getLogger("stubber")
39
+ self.log = None
40
+ self.log = logging.getLogger("stubber")
41
41
  self._report = [] # type: list[str]
42
42
  self.info = _info()
43
- self._log.info("Port: {}".format(self.info["port"]))
44
- self._log.info("Board: {}".format(self.info["board"]))
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._log.debug(self.path)
62
+ self.log.debug(self.path)
63
63
  try:
64
64
  ensure_folder(path + "/")
65
65
  except OSError:
66
- self._log.error("error creating stub folder {}".format(path))
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._log.debug("get attributes {} {}".format(repr(item_instance), item_instance))
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._log.debug("get attribute {}".format(name))
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._log.info("Start micropython-stubber v{} on {}".format(__version__, self._fwid))
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._log.info("Finally done")
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._log.warning("Skip module: {:<25} : Known problematic".format(module_name))
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._log.warning("Skip module: {:<25} : Excluded".format(module_name))
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._log.info(
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._log.warning(
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._log.warning("could not del new_module")
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._log.debug("could not del sys.modules[{}]".format(module_name))
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._log.warning("SKIPPING problematic module:{}".format(object_expr))
224
+ self.log.warning("SKIPPING problematic module:{}".format(object_expr))
227
225
  return
228
226
 
229
- # self._log.debug("DUMP : {}".format(object_expr))
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._log.error(errors)
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._log.warning("NameError: invalid name {}".format(item_name))
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._log.debug("{0}class {1}:".format(indent, item_name))
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._log.debug("# recursion over class {0}".format(item_name))
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._log.debug(
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._log.debug("\n" + s)
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._log.debug("\n" + s)
332
+ self.log.debug("\n" + s)
335
333
  else:
336
334
  # keep only the name
337
- self._log.debug("# all other, type = '{0}'".format(item_type_txt))
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._log.info("Clean/remove files in folder: {}".format(path))
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._log.info(
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._log.info("Report file: {}".format(f_name))
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._log.info("Memory used: {0} Kb".format(used // 1024))
399
+ self.log.info("Memory used: {0} Kb".format(used // 1024))
402
400
  except OSError:
403
- self._log.error("Failed to create the report.")
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
- _log.error("failed to create folder {}".format(p))
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
- _log = logging.getLogger("stubber")
913
+ log = logging.getLogger("stubber")
916
914
  logging.basicConfig(level=logging.INFO)
917
915
  # logging.basicConfig(level=logging.DEBUG)
918
916
  except NameError:
@@ -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.0
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.0"
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._log = logging.getLogger("stubber")
58
+ self.log = None
59
+ self.log = logging.getLogger("stubber")
60
60
  self._report = [] # type: list[str]
61
61
  self.info = _info()
62
- self._log.info("Port: {}".format(self.info["port"]))
63
- self._log.info("Board: {}".format(self.info["board"]))
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._log.debug(self.path)
81
+ self.log.debug(self.path)
82
82
  try:
83
83
  ensure_folder(path + "/")
84
84
  except OSError:
85
- self._log.error("error creating stub folder {}".format(path))
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._log.debug("get attributes {} {}".format(repr(item_instance), item_instance))
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._log.debug("get attribute {}".format(name))
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._log.info("Start micropython-stubber v{} on {}".format(__version__, self._fwid))
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._log.info("Finally done")
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._log.warning("Skip module: {:<25} : Known problematic".format(module_name))
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._log.warning("Skip module: {:<25} : Excluded".format(module_name))
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._log.info("Stub module: {:<25} to file: {:<70} mem:{:>5}".format(module_name, fname, m1))
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._log.warning("Skip module: {:<25} {:<79}".format(module_name, "Module not found."))
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._log.warning("could not del new_module")
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._log.debug("could not del sys.modules[{}]".format(module_name))
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._log.warning("SKIPPING problematic module:{}".format(object_expr))
231
+ self.log.warning("SKIPPING problematic module:{}".format(object_expr))
232
232
  return
233
233
 
234
- # self._log.debug("DUMP : {}".format(object_expr))
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._log.error(errors)
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._log.warning("NameError: invalid name {}".format(item_name))
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._log.debug("{0}class {1}:".format(indent, item_name))
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._log.debug("# recursion over class {0}".format(item_name))
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._log.debug("# def {1} function/method/closure, type = '{0}'".format(item_type_txt, item_name))
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._log.debug("\n" + s)
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._log.debug("\n" + s)
329
+ self.log.debug("\n" + s)
330
330
  else:
331
331
  # keep only the name
332
- self._log.debug("# all other, type = '{0}'".format(item_type_txt))
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._log.info("Clean/remove files in folder: {}".format(path))
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._log.info("Created stubs for {} modules on board {}\nPath: {}".format(len(self._report), self._fwid, self.path))
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._log.info("Report file: {}".format(f_name))
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._log.info("Memory used: {0} Kb".format(used // 1024))
392
+ self.log.info("Memory used: {0} Kb".format(used // 1024))
393
393
  except OSError:
394
- self._log.error("Failed to create the report.")
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
- _log.error("failed to create folder {}".format(p))
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
- _log = logging.getLogger("stubber")
729
+ log = logging.getLogger("stubber")
730
730
  logging.basicConfig(level=logging.INFO)
731
731
  # logging.basicConfig(level=logging.DEBUG)
732
732
  except NameError: