diff --git a/.vscode/launch.json b/.vscode/launch.json
index 51d97295..e2a64398 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -46,7 +46,8 @@
"args": [
"-v",
"-v",
- "get-docstubs",
+ "switch",
+ "v1.20.0",
// "build",
// "--version",
// "latest",
@@ -66,10 +67,6 @@
// "--build",
// "switch",
// "v1.20.0"
- // "get-frozen",
- // "--version",
- // "v1.19.1",
- // "--port",
// "--dry-run",
//
// "minify",
diff --git a/.vscode/settings.json b/.vscode/settings.json
index cc78e038..7e47fc1a 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -97,7 +97,7 @@
"markiscodecoverage.searchCriteria": "results/coverage*.lcov",
"debug.allowBreakpointsEverywhere": true,
"debug.terminal.clearBeforeReusing": true,
- "python.analysis.typeCheckingMode": "strict",
+ "python.analysis.typeCheckingMode": "basic",
"python.analysis.diagnosticSeverityOverrides": {
"reportUnusedVariable": "warning",
"reportUnusedImport": "warning",
diff --git a/cspell.json b/cspell.json
index 033e36f5..0ff87666 100644
--- a/cspell.json
+++ b/cspell.json
@@ -20,22 +20,32 @@
"adcx",
"adcy",
"aivar",
+ "Autoflake",
+ "basicgit",
"braden",
"bufs",
"bufx",
"bufy",
"capsys",
"chdir",
+ "codemod",
"cpython",
"createstubs",
"dastultz",
"Decomp",
+ "docstrings",
+ "docstub",
+ "docstubs",
"fname",
"fwid",
"IPPROTO",
"josverl",
+ "jsondb",
+ "libcst",
"loboris",
+ "loguru",
"markdownlint",
+ "micropython",
"mklink",
"mpls",
"mystubs",
@@ -45,6 +55,7 @@
"pylintrc",
"pyright",
"pytest",
+ "pytestmark",
"pytests",
"reqs",
"stubfiles",
@@ -56,11 +67,10 @@
"toctree",
"typeshed",
"updent",
- "writeln",
- "micropython",
- "Verlinde"
+ "Verlinde",
+ "writeln"
],
"enableFiletypes": [
"!plaintext"
]
-}
\ No newline at end of file
+}
diff --git a/scripts/Docstring_view.pbix b/scripts/Docstring_view.pbix
new file mode 100644
index 00000000..08047fce
Binary files /dev/null and b/scripts/Docstring_view.pbix differ
diff --git a/scripts/Docstrings_check.ipynb b/scripts/Docstrings_check.ipynb
new file mode 100644
index 00000000..5468b318
--- /dev/null
+++ b/scripts/Docstrings_check.ipynb
@@ -0,0 +1,953 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Use pydocstyle to check docstrings in the stubs and callect and export the results to a json file.\n",
+ "This json can then be imported in PowerBI to analyze theresults and changes over time.\n",
+ "\n",
+ "1. Run this notebook `(Docstrings_check.ipynb)`\n",
+ "\n",
+ " - this will run pydocstyle on the stubs and export the results to a json file (`docstrings.json`)\n",
+ "\n",
+ "2. Open the PowerBI file `(Docstring_View_.pbix)`\n",
+ " - Refresh the data\n",
+ " - Analyze the results\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# !pydocstyle --match='(?!test_).*\\.py(i)?' .\n",
+ "# !pydocstyle --match='(?!test_).*\\.py(i)?' --add-ignore=D105,D107, ../repos/micropython-stubs/publish/micropython-v1_21_0-esp32-stubs\n",
+ "\n",
+ "# messages = !pydocstyle --match='(?!test_).*\\.py(i)?' --add-ignore=D2,D4 --select=D100,D101,D102,D103,D104 ../repos/micropython-stubs/publish/micropython-v1_21_0-esp32-stubs\n",
+ "# print(messages[1:4])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pathlib import Path\n",
+ "\n",
+ "\n",
+ "def count_def_class(folder_path: Path) -> dict:\n",
+ " folder_path = Path(folder_path)\n",
+ " if not folder_path.is_dir():\n",
+ " raise ValueError(f\"{folder_path} is not a directory\")\n",
+ " counts = {\"def\": 0, \"class\": 0, \"module\": 0}\n",
+ " for file_path in folder_path.rglob(\"*\"):\n",
+ " if file_path.is_file() and file_path.suffix in [\".pyi\", \".py\"]:\n",
+ " counts[\"module\"] += 1\n",
+ " with file_path.open(encoding=\"utf8\") as f:\n",
+ " content = f.read()\n",
+ " counts[\"def\"] += content.count(\"def \")\n",
+ " counts[\"class\"] += content.count(\"class \")\n",
+ " return counts\n",
+ "\n",
+ "\n",
+ "# count_def_class(\"../repos/micropython-stubs/publish/micropython-v1_21_0-esp32-stubs\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pydocstyle\n",
+ "\n",
+ "from functools import lru_cache\n",
+ "\n",
+ "\n",
+ "@lru_cache(maxsize=1000)\n",
+ "def count_missing_docstrings(folder_path: Path) -> dict:\n",
+ " folder_path = Path(folder_path)\n",
+ " if not folder_path.is_dir():\n",
+ " raise ValueError(f\"{folder_path} is not a directory\")\n",
+ " files = []\n",
+ " for file_path in folder_path.rglob(\"*\"):\n",
+ " if (\n",
+ " file_path.is_file()\n",
+ " and file_path.suffix in [\".pyi\", \".py\"]\n",
+ " and not \"stdlib\" in str(file_path)\n",
+ " ):\n",
+ " files.append(str(file_path))\n",
+ "\n",
+ " # parser = pydocstyle.config.ConfigurationParser()\n",
+ "\n",
+ " docstring_checks = \"D100,D101,D102,D103,D104\"\n",
+ " try:\n",
+ " errors = pydocstyle.check(files, select=docstring_checks)\n",
+ " messages = list(\n",
+ " f\"{e.code} {e.definition} in {e.filename}\"\n",
+ " for e in errors\n",
+ " if isinstance(e, pydocstyle.Error)\n",
+ " )\n",
+ " except Exception as e:\n",
+ " messages = []\n",
+ " # print(messages[1:4])\n",
+ " missing = {\n",
+ " \"module\": len([m for m in messages if \"D100\" in m]), # module or package\n",
+ " \"class\": len([m for m in messages if \"D101\" in m]), # class\n",
+ " \"def\": len([m for m in messages if \"D102\" in m or \"D103\" in m]), # method or function\n",
+ " }\n",
+ " return missing\n",
+ "\n",
+ "\n",
+ "# pth = Path(\"../repos/micropython-stubs/publish/micropython-v1_21_0-esp32-stubs\")\n",
+ "# missing = count_missing_docstrings(pth)\n",
+ "# print(missing)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\ARDUINO_NANO_ESP32\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\GENERIC\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\LILYGO_TTGO_LORA32\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\LOLIN_C3_MINI\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\LOLIN_S2_MINI\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\LOLIN_S2_PICO\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\M5STACK_ATOM\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\UM_FEATHERS2\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\UM_FEATHERS2NEO\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\UM_FEATHERS3\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\UM_NANOS3\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\UM_PROS3\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\UM_TINYPICO\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\UM_TINYS2\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen\\esp32\\UM_TINYS3\\aioespnow.py: Cannot parse file.\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_12-frozen\\esp8266\\RELEASE\\uasyncio\\core.py:109: SyntaxWarning: \"is\" with a literal. Did you mean \"==\"?\n",
+ " if args is ():\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\RELEASE\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\RELEASE\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\RELEASE\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\RELEASE\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\TINYPICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\TINYPICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\TINYPICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp32\\TINYPICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp8266\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp8266\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp8266\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\esp8266\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\stm32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\stm32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\stm32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\stm32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\stm32\\PYBD_SF2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\stm32\\PYBD_SF2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\stm32\\PYBD_SF2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen\\stm32\\PYBD_SF2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\RELEASE\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\RELEASE\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\RELEASE\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\RELEASE\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\TINYPICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\TINYPICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\TINYPICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp32\\TINYPICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp8266\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp8266\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp8266\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\esp8266\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\stm32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\stm32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\stm32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\stm32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\stm32\\PYBD_SF2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\stm32\\PYBD_SF2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\stm32\\PYBD_SF2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen\\stm32\\PYBD_SF2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\RELEASE\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\RELEASE\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\RELEASE\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\RELEASE\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\TINYPICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\TINYPICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\TINYPICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp32\\TINYPICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp8266\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp8266\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp8266\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\esp8266\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\stm32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\stm32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\stm32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\stm32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\stm32\\PYBD_SF2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\stm32\\PYBD_SF2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\stm32\\PYBD_SF2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen\\stm32\\PYBD_SF2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\RELEASE\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\RELEASE\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\RELEASE\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\RELEASE\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_TINYPICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_TINYPICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_TINYPICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_TINYPICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_TINYS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_TINYS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_TINYS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp32\\UM_TINYS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp8266\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp8266\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp8266\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\esp8266\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\mimxrt\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\mimxrt\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\mimxrt\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\mimxrt\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\rp2\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\rp2\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\rp2\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\rp2\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\stm32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\stm32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\stm32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\stm32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\stm32\\PYBD_SF2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\stm32\\PYBD_SF2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\stm32\\PYBD_SF2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen\\stm32\\PYBD_SF2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_TINYPICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_TINYPICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_TINYPICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_TINYPICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_TINYS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_TINYS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_TINYS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\esp32\\UM_TINYS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\mimxrt\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\mimxrt\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\mimxrt\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\mimxrt\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\rp2\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\rp2\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\rp2\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\rp2\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\stm32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\stm32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\stm32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\stm32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\stm32\\PYBD_SF2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\stm32\\PYBD_SF2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\stm32\\PYBD_SF2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\stm32\\PYBD_SF2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\unix\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\unix\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\unix\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen\\unix\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_TINYPICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_TINYPICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_TINYPICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_TINYPICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_TINYS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_TINYS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_TINYS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\esp32\\UM_TINYS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\mimxrt\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\mimxrt\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\mimxrt\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\mimxrt\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\rp2\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\rp2\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\rp2\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\rp2\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\PYBD_SF2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\PYBD_SF2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\PYBD_SF2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\stm32\\PYBD_SF2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\unix\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\unix\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\unix\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen\\unix\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LILYGO_TTGO_LORA32\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LILYGO_TTGO_LORA32\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LILYGO_TTGO_LORA32\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LILYGO_TTGO_LORA32\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_C3_MINI\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_C3_MINI\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_C3_MINI\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_C3_MINI\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS3\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS3\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS3\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_FEATHERS3\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_PROS3\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_PROS3\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_PROS3\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_PROS3\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYPICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYPICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYPICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYPICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYS3\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYS3\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYS3\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\esp32\\UM_TINYS3\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\nrf\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\nrf\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\nrf\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\nrf\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\renesas-ra\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\renesas-ra\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\renesas-ra\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\renesas-ra\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\rp2\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\rp2\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\rp2\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\rp2\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\ARDUINO_PORTENTA_H7\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\ARDUINO_PORTENTA_H7\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\ARDUINO_PORTENTA_H7\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\ARDUINO_PORTENTA_H7\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\LEGO_HUB_NO6\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\LEGO_HUB_NO6\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\LEGO_HUB_NO6\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\LEGO_HUB_NO6\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\PYBD_SF2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\PYBD_SF2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\PYBD_SF2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\stm32\\PYBD_SF2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\unix\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\unix\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\unix\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\unix\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\windows\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\windows\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\windows\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen\\windows\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LILYGO_TTGO_LORA32\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LILYGO_TTGO_LORA32\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LILYGO_TTGO_LORA32\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LILYGO_TTGO_LORA32\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_C3_MINI\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_C3_MINI\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_C3_MINI\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_C3_MINI\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS3\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS3\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS3\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_FEATHERS3\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_PROS3\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_PROS3\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_PROS3\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_PROS3\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYPICO\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYPICO\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYPICO\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYPICO\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYS2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYS2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYS2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYS2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYS3\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYS3\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYS3\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\esp32\\UM_TINYS3\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\nrf\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\nrf\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\nrf\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\nrf\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\renesas-ra\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\renesas-ra\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\renesas-ra\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\renesas-ra\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\rp2\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\rp2\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\rp2\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\rp2\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\ARDUINO_PORTENTA_H7\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\ARDUINO_PORTENTA_H7\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\ARDUINO_PORTENTA_H7\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\ARDUINO_PORTENTA_H7\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\GARATRONIC_PYBSTICK26_F411\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\LEGO_HUB_NO6\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\LEGO_HUB_NO6\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\LEGO_HUB_NO6\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\LEGO_HUB_NO6\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\PYBD_SF2\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\PYBD_SF2\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\PYBD_SF2\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\stm32\\PYBD_SF2\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\unix\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\unix\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\unix\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\unix\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\windows\\GENERIC\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\windows\\GENERIC\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\windows\\GENERIC\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen\\windows\\GENERIC\\uasyncio\\stream.py: Cannot parse file.\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\LILYGO_TTGO_LORA32\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\LOLIN_C3_MINI\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\LOLIN_S2_MINI\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\LOLIN_S2_PICO\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\M5STACK_ATOM\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\UM_FEATHERS2\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\UM_FEATHERS2NEO\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\UM_FEATHERS3\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\UM_PROS3\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\UM_TINYPICO\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\UM_TINYS2\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp32\\UM_TINYS3\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\esp8266\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\mimxrt\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\mimxrt\\MIMXRT1020_EVK\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\mimxrt\\MIMXRT1050_EVK\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\mimxrt\\MIMXRT1060_EVK\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\mimxrt\\MIMXRT1064_EVK\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\mimxrt\\MIMXRT1170_EVK\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\mimxrt\\SEEED_ARCH_MIX\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\mimxrt\\TEENSY41\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\nrf\\ARDUINO_NANO_33_BLE_SENSE\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\nrf\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\renesas-ra\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\rp2\\ARDUINO_NANO_RP2040_CONNECT\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\rp2\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\rp2\\NULLBITS_BIT_C_PRO\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\rp2\\PICO_W\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\rp2\\W5100S_EVB_PICO\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\rp2\\W5500_EVB_PICO\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\rp2\\WEACTSTUDIO\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\samd\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\ARDUINO_GIGA\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\ARDUINO_NICLA_VISION\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\ARDUINO_PORTENTA_H7\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\LEGO_HUB_NO6\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\LEGO_HUB_NO7\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\NUCLEO_F429ZI\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\NUCLEO_F439ZI\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\NUCLEO_F746ZG\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\NUCLEO_F756ZG\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\NUCLEO_F767ZI\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\NUCLEO_H723ZG\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\NUCLEO_H743ZI\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\OLIMEX_E407\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\PYBD_SF2\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\PYBV10\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\STM32F769DISC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\STM32F7DISC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\stm32\\VCC_GND_F407ZG\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\unix\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen\\windows\\GENERIC\\uasyncio\\funcs.py:126: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n",
+ " if state is not 0:\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\ARDUINO_NANO_ESP32\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\GENERIC\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\LILYGO_TTGO_LORA32\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\LOLIN_C3_MINI\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\LOLIN_S2_MINI\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\LOLIN_S2_PICO\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\M5STACK_ATOM\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\UM_FEATHERS2\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\UM_FEATHERS2NEO\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\UM_FEATHERS3\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\UM_NANOS3\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\UM_PROS3\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\UM_TINYPICO\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\UM_TINYS2\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen\\esp32\\UM_TINYS3\\aioespnow.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-esp32-s3-stubs\\uasyncio\\event.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-esp32-s3-stubs\\uasyncio\\funcs.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-esp32-s3-stubs\\uasyncio\\lock.py: Cannot parse file.\n",
+ "Error in file ..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-esp32-s3-stubs\\uasyncio\\stream.py: Cannot parse file.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "168\n"
+ ]
+ }
+ ],
+ "source": [
+ "def get_version_port(folder_name: str) -> tuple:\n",
+ " version = \"unknown\"\n",
+ " port = \"unknown\"\n",
+ " try:\n",
+ " version = folder_name.split(\"-\")[1]\n",
+ " port = folder_name.split(\"-\")[2]\n",
+ " except IndexError:\n",
+ " pass\n",
+ " if version == \"stdlib\":\n",
+ " port = \"stdlib\"\n",
+ " version = \"1.0\"\n",
+ " version = version.replace(\"_\", \".\").lstrip(\"v\")\n",
+ " if version == \"latest\":\n",
+ " version = \"99.99.99\"\n",
+ " return version, port\n",
+ "\n",
+ "\n",
+ "def get_docstring_score(folder_path: Path) -> dict:\n",
+ " defs = count_def_class(folder_path)\n",
+ " missing = count_missing_docstrings(folder_path)\n",
+ " docstring_score = {\n",
+ " \"folder\": folder_path.name,\n",
+ " \"path\": str(folder_path),\n",
+ " \"version\": get_version_port(folder_path.name)[0],\n",
+ " \"port\": get_version_port(folder_path.name)[1],\n",
+ " \"module\": round(1 - (missing[\"module\"]) / (defs[\"module\"]), 2) if defs[\"module\"] else 1.0,\n",
+ " \"class\": round(1 - (missing[\"class\"]) / (defs[\"class\"]), 2) if defs[\"class\"] else 1.0,\n",
+ " \"def\": round(1 - (missing[\"def\"]) / (defs[\"def\"]), 2) if defs[\"def\"] else 1.0,\n",
+ " \"counts\": defs,\n",
+ " \"missing\": missing,\n",
+ " }\n",
+ " return docstring_score\n",
+ "\n",
+ "\n",
+ "def get_scores(publish_path: Path, *, match=\"micropython-*\") -> list:\n",
+ " scores = []\n",
+ " for folder_path in publish_path.glob(match):\n",
+ " if not folder_path.is_dir():\n",
+ " continue\n",
+ " docstring_score = get_docstring_score(folder_path)\n",
+ " scores.append(docstring_score)\n",
+ " return scores\n",
+ "\n",
+ "\n",
+ "scores = []\n",
+ "scores += get_scores(Path(\"../repos/micropython-stubs/stubs\", match=\"*-merged\"))\n",
+ "scores += get_scores(Path(\"../repos/micropython-stubs/publish\"))\n",
+ "\n",
+ "print(len(scores))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import json\n",
+ "\n",
+ "with open(\"docstrings.json\", \"w\", encoding=\"utf-8\") as file:\n",
+ " json.dump(scores, file, ensure_ascii=False, indent=4)\n",
+ "\n",
+ "\n",
+ "# write to csv\n",
+ "import csv\n",
+ "\n",
+ "with open(\"docstrings.csv\", \"w\", encoding=\"utf-8\") as file:\n",
+ " writer = csv.DictWriter(file, fieldnames=scores[0].keys())\n",
+ " writer.writeheader()\n",
+ " writer.writerows(scores)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# %pip install chime\n",
+ "\n",
+ "# importing chime package\n",
+ "import chime\n",
+ "\n",
+ "# Successfully running the code sounds\n",
+ "chime.theme(\"big-sur\")\n",
+ "chime.success()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "# import numpy as np\n",
+ "\n",
+ "df = pd.DataFrame(scores)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " folder | \n",
+ " path | \n",
+ " version | \n",
+ " port | \n",
+ " module | \n",
+ " class | \n",
+ " def | \n",
+ " counts | \n",
+ " missing | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " micropython-core | \n",
+ " ..\\repos\\micropython-stubs\\stubs\\micropython-core | \n",
+ " core | \n",
+ " unknown | \n",
+ " 1.00 | \n",
+ " 1.00 | \n",
+ " 1.00 | \n",
+ " {'def': 14, 'class': 1, 'module': 2} | \n",
+ " {'module': 0, 'class': 0, 'def': 0} | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " micropython-latest-docstubs | \n",
+ " ..\\repos\\micropython-stubs\\stubs\\micropython-l... | \n",
+ " 99.99.99 | \n",
+ " docstubs | \n",
+ " 1.00 | \n",
+ " 0.96 | \n",
+ " 0.97 | \n",
+ " {'def': 911, 'class': 116, 'module': 55} | \n",
+ " {'module': 0, 'class': 5, 'def': 24} | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " micropython-latest-esp32--OLD | \n",
+ " ..\\repos\\micropython-stubs\\stubs\\micropython-l... | \n",
+ " 99.99.99 | \n",
+ " esp32 | \n",
+ " 0.52 | \n",
+ " 0.29 | \n",
+ " 0.11 | \n",
+ " {'def': 2100, 'class': 331, 'module': 170} | \n",
+ " {'module': 81, 'class': 234, 'def': 1874} | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " micropython-latest-esp32-merged | \n",
+ " ..\\repos\\micropython-stubs\\stubs\\micropython-l... | \n",
+ " 99.99.99 | \n",
+ " esp32 | \n",
+ " 0.83 | \n",
+ " 0.70 | \n",
+ " 0.58 | \n",
+ " {'def': 2236, 'class': 377, 'module': 174} | \n",
+ " {'module': 30, 'class': 112, 'def': 950} | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " micropython-latest-esp8266-merged | \n",
+ " ..\\repos\\micropython-stubs\\stubs\\micropython-l... | \n",
+ " 99.99.99 | \n",
+ " esp8266 | \n",
+ " 0.89 | \n",
+ " 0.80 | \n",
+ " 0.62 | \n",
+ " {'def': 1322, 'class': 166, 'module': 116} | \n",
+ " {'module': 13, 'class': 34, 'def': 498} | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " folder \\\n",
+ "0 micropython-core \n",
+ "1 micropython-latest-docstubs \n",
+ "2 micropython-latest-esp32--OLD \n",
+ "3 micropython-latest-esp32-merged \n",
+ "4 micropython-latest-esp8266-merged \n",
+ "\n",
+ " path version port \\\n",
+ "0 ..\\repos\\micropython-stubs\\stubs\\micropython-core core unknown \n",
+ "1 ..\\repos\\micropython-stubs\\stubs\\micropython-l... 99.99.99 docstubs \n",
+ "2 ..\\repos\\micropython-stubs\\stubs\\micropython-l... 99.99.99 esp32 \n",
+ "3 ..\\repos\\micropython-stubs\\stubs\\micropython-l... 99.99.99 esp32 \n",
+ "4 ..\\repos\\micropython-stubs\\stubs\\micropython-l... 99.99.99 esp8266 \n",
+ "\n",
+ " module class def counts \\\n",
+ "0 1.00 1.00 1.00 {'def': 14, 'class': 1, 'module': 2} \n",
+ "1 1.00 0.96 0.97 {'def': 911, 'class': 116, 'module': 55} \n",
+ "2 0.52 0.29 0.11 {'def': 2100, 'class': 331, 'module': 170} \n",
+ "3 0.83 0.70 0.58 {'def': 2236, 'class': 377, 'module': 174} \n",
+ "4 0.89 0.80 0.62 {'def': 1322, 'class': 166, 'module': 116} \n",
+ "\n",
+ " missing \n",
+ "0 {'module': 0, 'class': 0, 'def': 0} \n",
+ "1 {'module': 0, 'class': 5, 'def': 24} \n",
+ "2 {'module': 81, 'class': 234, 'def': 1874} \n",
+ "3 {'module': 30, 'class': 112, 'def': 950} \n",
+ "4 {'module': 13, 'class': 34, 'def': 498} "
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/scripts/check_docstrings.ipynb b/scripts/check_docstrings.ipynb
deleted file mode 100644
index 8c7810d6..00000000
--- a/scripts/check_docstrings.ipynb
+++ /dev/null
@@ -1,199 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [],
- "source": [
- "# !pydocstyle --match='(?!test_).*\\.py(i)?' .\n",
- "# !pydocstyle --match='(?!test_).*\\.py(i)?' --add-ignore=D105,D107, /workspaces/micropython-stubber/repos/micropython-stubs/publish/micropython-v1_21_0-esp32-stubs\n",
- "\n",
- "# messages = !pydocstyle --match='(?!test_).*\\.py(i)?' --add-ignore=D2,D4 --select=D100,D101,D102,D103,D104 /workspaces/micropython-stubber/repos/micropython-stubs/publish/micropython-v1_21_0-esp32-stubs\n",
- "# print(messages[1:4])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [],
- "source": [
- "from pathlib import Path\n",
- "\n",
- "\n",
- "def count_def_class(folder_path: Path) -> dict:\n",
- " folder_path = Path(folder_path)\n",
- " if not folder_path.is_dir():\n",
- " raise ValueError(f\"{folder_path} is not a directory\")\n",
- " counts = {\"def\": 0, \"class\": 0, \"module\": 0}\n",
- " for file_path in folder_path.rglob(\"*\"):\n",
- " if file_path.is_file() and file_path.suffix in [\".pyi\", \".py\"]:\n",
- " counts[\"module\"] += 1\n",
- " with file_path.open() as f:\n",
- " content = f.read()\n",
- " counts[\"def\"] += content.count(\"def \")\n",
- " counts[\"class\"] += content.count(\"class \")\n",
- " return counts"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [],
- "source": [
- "import pydocstyle\n",
- "\n",
- "\n",
- "def count_missing_docstrings(folder_path: Path) -> dict:\n",
- " folder_path = Path(folder_path)\n",
- " if not folder_path.is_dir():\n",
- " raise ValueError(f\"{folder_path} is not a directory\")\n",
- " files = []\n",
- " for file_path in folder_path.rglob(\"*\"):\n",
- " if file_path.is_file() and file_path.suffix in [\".pyi\", \".py\"]:\n",
- " files.append(str(file_path))\n",
- "\n",
- " parser = pydocstyle.config.ConfigurationParser()\n",
- "\n",
- " docstring_checks = \"D100,D101,D102,D103,D104\"\n",
- " try:\n",
- " errors = pydocstyle.check(files, select=docstring_checks)\n",
- " messages = list(f\"{e.code} {e.definition} in {e.filename}\" for e in errors)\n",
- " except Exception as e:\n",
- " messages = []\n",
- " # print(messages[1:4])\n",
- " missing = {\n",
- " \"module\": len([m for m in messages if \"D100\" in m]), # module or package\n",
- " \"class\": len([m for m in messages if \"D101\" in m]), # class\n",
- " \"def\": len([m for m in messages if \"D102\" in m or \"D103\" in m]), # method or function\n",
- " }\n",
- " return missing\n",
- "\n",
- "\n",
- "# pth = Path(\"/workspaces/micropython-stubber/repos/micropython-stubs/publish/micropython-v1_21_0-esp32-stubs\")\n",
- "# missing = count_missing_docstrings(pth)\n",
- "# print(missing)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [],
- "source": [
- "def get_docstring_score(folder_path: Path) -> dict:\n",
- " defs = count_def_class(folder_path)\n",
- " missing = count_missing_docstrings(folder_path)\n",
- " docstring_score = {\n",
- " \"module\": round(1 - (missing[\"module\"] + 1) / (defs[\"module\"] + 1), 2),\n",
- " \"class\": round(1 - (missing[\"class\"] + 1) / (defs[\"class\"] + 1), 2),\n",
- " \"def\": round(1 - (missing[\"def\"] + 1) / (defs[\"def\"] + 1), 2),\n",
- " }\n",
- " return docstring_score"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "micropython-latest-stm32-PYBV11-merged {'module': 0.91, 'class': 0.89, 'def': 0.66}\n",
- "micropython-latest-rp2-merged {'module': 0.9, 'class': 0.79, 'def': 0.57}\n",
- "micropython-latest-samd-ADAFRUIT_FEATHER_M4_EXPRESS-merged {'module': 0.87, 'class': 0.84, 'def': 0.56}\n",
- "micropython-latest-esp32-ESP32_GENERIC-merged {'module': 0.0, 'class': 0.0, 'def': 0.0}\n",
- "micropython-latest-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS-merged {'module': 0.87, 'class': 0.83, 'def': 0.56}\n",
- "micropython-latest-stm32-merged {'module': 0.91, 'class': 0.89, 'def': 0.66}\n",
- "micropython-latest-esp8266-merged {'module': 0.88, 'class': 0.79, 'def': 0.62}\n",
- "micropython-latest-rp2-PIMORONI_PICOLIPO_16MB-merged {'module': 0.9, 'class': 0.76, 'def': 0.57}\n",
- "micropython-latest-esp32-merged {'module': 0.82, 'class': 0.7, 'def': 0.57}\n",
- "micropython-latest-samd-MINISAM_M4-merged {'module': 0.87, 'class': 0.82, 'def': 0.56}\n",
- "micropython-latest-samd-SEEED_WIO_TERMINAL-merged {'module': 0.87, 'class': 0.88, 'def': 0.56}\n"
- ]
- }
- ],
- "source": [
- "publish_path = Path(\"/workspaces/micropython-stubber/repos/micropython-stubs/stubs\")\n",
- "\n",
- "for folder_path in publish_path.glob(\"micropython-latest*-merged\"):\n",
- " docstring_score = get_docstring_score(folder_path)\n",
- " print(f\"{folder_path.name} {docstring_score}\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "micropython-v1_21_0-esp32-stubs {'module': 0.6, 'class': 0.59, 'def': 0.59}\n",
- "micropython-v1_21_0-esp32-esp32_generic-stubs {'module': 0.59, 'class': 0.59, 'def': 0.59}\n"
- ]
- }
- ],
- "source": [
- "publish_path = Path(\"/workspaces/micropython-stubber/repos/micropython-stubs/publish\")\n",
- "\n",
- "for folder_path in publish_path.glob(\"micropython-v1_21*\"):\n",
- " docstring_score = get_docstring_score(folder_path)\n",
- " print(f\"{folder_path.name} {docstring_score}\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "micropython-latest-samd-minisam_m4-stubs {'module': 0.67, 'class': 0.57, 'def': 0.54}\n",
- "micropython-latest-stm32-pybv11-stubs {'module': 0.73, 'class': 0.65, 'def': 0.64}\n",
- "micropython-latest-rp2-stubs {'module': 0.69, 'class': 0.55, 'def': 0.55}\n",
- "micropython-latest-rp2-pimoroni_picolipo_16mb-stubs {'module': 0.69, 'class': 0.55, 'def': 0.55}\n",
- "micropython-latest-samd-seeed_wio_terminal-stubs {'module': 0.67, 'class': 0.57, 'def': 0.54}\n",
- "micropython-latest-samd-adafruit_itsybitsy_m4_express-stubs {'module': 0.67, 'class': 0.57, 'def': 0.54}\n",
- "micropython-latest-samd-adafruit_feather_m4_express-stubs {'module': 0.67, 'class': 0.57, 'def': 0.54}\n",
- "micropython-latest-esp32-stubs {'module': 0.6, 'class': 0.59, 'def': 0.59}\n",
- "micropython-latest-stm32-stubs {'module': 0.73, 'class': 0.65, 'def': 0.64}\n"
- ]
- }
- ],
- "source": [
- "for folder_path in publish_path.glob(\"micropython-latest*\"):\n",
- " docstring_score = get_docstring_score(folder_path)\n",
- " print(f\"{folder_path.name} {docstring_score}\")"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": ".venv",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.9.17"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/scripts/docstrings.csv b/scripts/docstrings.csv
new file mode 100644
index 00000000..9de98802
--- /dev/null
+++ b/scripts/docstrings.csv
@@ -0,0 +1,169 @@
+folder,path,version,port,module,class,def,counts,missing
+micropython-core,..\repos\micropython-stubs\stubs\micropython-core,core,unknown,1.0,1.0,1.0,"{'def': 14, 'class': 1, 'module': 2}","{'module': 0, 'class': 0, 'def': 0}"
+micropython-latest-docstubs,..\repos\micropython-stubs\stubs\micropython-latest-docstubs,99.99.99,docstubs,1.0,0.96,0.97,"{'def': 911, 'class': 116, 'module': 55}","{'module': 0, 'class': 5, 'def': 24}"
+micropython-latest-esp32--OLD,..\repos\micropython-stubs\stubs\micropython-latest-esp32--OLD,99.99.99,esp32,0.52,0.29,0.11,"{'def': 2100, 'class': 331, 'module': 170}","{'module': 81, 'class': 234, 'def': 1874}"
+micropython-latest-esp32-merged,..\repos\micropython-stubs\stubs\micropython-latest-esp32-merged,99.99.99,esp32,0.83,0.7,0.58,"{'def': 2236, 'class': 377, 'module': 174}","{'module': 30, 'class': 112, 'def': 950}"
+micropython-latest-esp8266-merged,..\repos\micropython-stubs\stubs\micropython-latest-esp8266-merged,99.99.99,esp8266,0.89,0.8,0.62,"{'def': 1322, 'class': 166, 'module': 116}","{'module': 13, 'class': 34, 'def': 498}"
+micropython-latest-frozen,..\repos\micropython-stubs\stubs\micropython-latest-frozen,99.99.99,frozen,0.14,0.12,0.33,"{'def': 19581, 'class': 2971, 'module': 2327}","{'module': 2004, 'class': 2626, 'def': 13158}"
+micropython-latest-rp2-merged,..\repos\micropython-stubs\stubs\micropython-latest-rp2-merged,99.99.99,rp2,0.91,0.8,0.57,"{'def': 1546, 'class': 359, 'module': 116}","{'module': 11, 'class': 73, 'def': 660}"
+micropython-latest-rp2-PIMORONI_PICOLIPO_16MB-merged,..\repos\micropython-stubs\stubs\micropython-latest-rp2-PIMORONI_PICOLIPO_16MB-merged,99.99.99,rp2,0.91,0.76,0.57,"{'def': 1546, 'class': 305, 'module': 116}","{'module': 11, 'class': 73, 'def': 660}"
+micropython-latest-samd-ADAFRUIT_FEATHER_M4_EXPRESS-merged,..\repos\micropython-stubs\stubs\micropython-latest-samd-ADAFRUIT_FEATHER_M4_EXPRESS-merged,99.99.99,samd,0.88,0.84,0.56,"{'def': 1454, 'class': 397, 'module': 102}","{'module': 12, 'class': 64, 'def': 646}"
+micropython-latest-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS-merged,..\repos\micropython-stubs\stubs\micropython-latest-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS-merged,99.99.99,samd,0.88,0.83,0.56,"{'def': 1454, 'class': 371, 'module': 102}","{'module': 12, 'class': 64, 'def': 646}"
+micropython-latest-samd-MINISAM_M4-merged,..\repos\micropython-stubs\stubs\micropython-latest-samd-MINISAM_M4-merged,99.99.99,samd,0.88,0.82,0.56,"{'def': 1454, 'class': 353, 'module': 102}","{'module': 12, 'class': 64, 'def': 646}"
+micropython-latest-samd-SEEED_WIO_TERMINAL-merged,..\repos\micropython-stubs\stubs\micropython-latest-samd-SEEED_WIO_TERMINAL-merged,99.99.99,samd,0.88,0.88,0.56,"{'def': 1454, 'class': 539, 'module': 102}","{'module': 12, 'class': 64, 'def': 646}"
+micropython-latest-stm32-merged,..\repos\micropython-stubs\stubs\micropython-latest-stm32-merged,99.99.99,stm32,0.92,0.89,0.66,"{'def': 2066, 'class': 559, 'module': 118}","{'module': 10, 'class': 62, 'def': 708}"
+micropython-latest-stm32-PYBV11-merged,..\repos\micropython-stubs\stubs\micropython-latest-stm32-PYBV11-merged,99.99.99,stm32,0.92,0.89,0.66,"{'def': 2066, 'class': 559, 'module': 118}","{'module': 10, 'class': 62, 'def': 708}"
+micropython-pico-go,..\repos\micropython-stubs\stubs\micropython-pico-go,pico,go,0.81,0.95,0.95,"{'def': 1657, 'class': 404, 'module': 58}","{'module': 11, 'class': 20, 'def': 85}"
+micropython-ulab,..\repos\micropython-stubs\stubs\micropython-ulab,ulab,unknown,0.5,0.5,0.63,"{'def': 222, 'class': 2, 'module': 18}","{'module': 9, 'class': 1, 'def': 83}"
+micropython-v1_10-esp32,..\repos\micropython-stubs\stubs\micropython-v1_10-esp32,1.10,esp32,0.52,0.53,0.11,"{'def': 1514, 'class': 229, 'module': 128}","{'module': 62, 'class': 107, 'def': 1350}"
+micropython-v1_10-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_10-esp8266,1.10,esp8266,0.5,0.57,0.01,"{'def': 1402, 'class': 208, 'module': 141}","{'module': 70, 'class': 89, 'def': 1388}"
+micropython-v1_10-frozen,..\repos\micropython-stubs\stubs\micropython-v1_10-frozen,1.10,frozen,0.05,0.0,0.17,"{'def': 571, 'class': 82, 'module': 74}","{'module': 70, 'class': 82, 'def': 474}"
+micropython-v1_10-pyboard,..\repos\micropython-stubs\stubs\micropython-v1_10-pyboard,1.10,pyboard,0.52,0.79,0.1,"{'def': 1996, 'class': 545, 'module': 100}","{'module': 48, 'class': 115, 'def': 1804}"
+micropython-v1_11-esp32,..\repos\micropython-stubs\stubs\micropython-v1_11-esp32,1.11,esp32,0.52,0.53,0.1,"{'def': 1600, 'class': 233, 'module': 128}","{'module': 62, 'class': 109, 'def': 1432}"
+micropython-v1_11-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_11-esp8266,1.11,esp8266,0.5,0.5,0.01,"{'def': 1272, 'class': 160, 'module': 139}","{'module': 69, 'class': 80, 'def': 1258}"
+micropython-v1_11-frozen,..\repos\micropython-stubs\stubs\micropython-v1_11-frozen,1.11,frozen,0.05,0.0,0.17,"{'def': 571, 'class': 82, 'module': 74}","{'module': 70, 'class': 82, 'def': 474}"
+micropython-v1_12-esp32,..\repos\micropython-stubs\stubs\micropython-v1_12-esp32,1.12,esp32,0.52,0.53,0.11,"{'def': 1732, 'class': 249, 'module': 132}","{'module': 64, 'class': 117, 'def': 1550}"
+micropython-v1_12-frozen,..\repos\micropython-stubs\stubs\micropython-v1_12-frozen,1.12,frozen,0.05,0.02,0.19,"{'def': 1489, 'class': 228, 'module': 208}","{'module': 197, 'class': 223, 'def': 1213}"
+micropython-v1_12-pyboard,..\repos\micropython-stubs\stubs\micropython-v1_12-pyboard,1.12,pyboard,0.52,0.78,0.1,"{'def': 2122, 'class': 563, 'module': 102}","{'module': 49, 'class': 124, 'def': 1912}"
+micropython-v1_13-esp32,..\repos\micropython-stubs\stubs\micropython-v1_13-esp32,1.13,esp32,0.51,0.6,0.03,"{'def': 1980, 'class': 378, 'module': 152}","{'module': 75, 'class': 153, 'def': 1912}"
+micropython-v1_13-frozen,..\repos\micropython-stubs\stubs\micropython-v1_13-frozen,1.13,frozen,0.14,0.14,0.29,"{'def': 2240, 'class': 342, 'module': 284}","{'module': 244, 'class': 293, 'def': 1583}"
+micropython-v1_13_266-esp32,..\repos\micropython-stubs\stubs\micropython-v1_13_266-esp32,1.13.266,esp32,0.52,0.6,0.11,"{'def': 2062, 'class': 366, 'module': 150}","{'module': 72, 'class': 147, 'def': 1828}"
+micropython-v1_13_95-pyboard,..\repos\micropython-stubs\stubs\micropython-v1_13_95-pyboard,1.13.95,pyboard,0.5,0.5,0.01,"{'def': 1442, 'class': 163, 'module': 105}","{'module': 52, 'class': 81, 'def': 1430}"
+micropython-v1_14-esp32,..\repos\micropython-stubs\stubs\micropython-v1_14-esp32,1.14,esp32,0.52,0.6,0.11,"{'def': 2062, 'class': 366, 'module': 150}","{'module': 72, 'class': 147, 'def': 1828}"
+micropython-v1_14-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_14-esp8266,1.14,esp8266,0.51,0.6,0.11,"{'def': 1999, 'class': 349, 'module': 149}","{'module': 73, 'class': 139, 'def': 1781}"
+micropython-v1_14-frozen,..\repos\micropython-stubs\stubs\micropython-v1_14-frozen,1.14,frozen,0.16,0.16,0.3,"{'def': 2086, 'class': 316, 'module': 242}","{'module': 204, 'class': 267, 'def': 1459}"
+micropython-v1_15-esp32,..\repos\micropython-stubs\stubs\micropython-v1_15-esp32,1.15,esp32,0.52,0.6,0.12,"{'def': 2030, 'class': 361, 'module': 142}","{'module': 68, 'class': 146, 'def': 1796}"
+micropython-v1_15-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_15-esp8266,1.15,esp8266,0.51,0.6,0.11,"{'def': 2015, 'class': 355, 'module': 149}","{'module': 73, 'class': 141, 'def': 1793}"
+micropython-v1_15-frozen,..\repos\micropython-stubs\stubs\micropython-v1_15-frozen,1.15,frozen,0.16,0.17,0.31,"{'def': 2146, 'class': 328, 'module': 242}","{'module': 204, 'class': 273, 'def': 1489}"
+micropython-v1_15-pyboard,..\repos\micropython-stubs\stubs\micropython-v1_15-pyboard,1.15,pyboard,0.52,0.77,0.11,"{'def': 2448, 'class': 684, 'module': 116}","{'module': 56, 'class': 155, 'def': 2184}"
+micropython-v1_16-docstubs,..\repos\micropython-stubs\stubs\micropython-v1_16-docstubs,1.16,docstubs,1.0,1.0,1.0,"{'def': 0, 'class': 0, 'module': 0}","{'module': 0, 'class': 0, 'def': 0}"
+micropython-v1_16-esp32,..\repos\micropython-stubs\stubs\micropython-v1_16-esp32,1.16,esp32,0.52,0.6,0.11,"{'def': 2094, 'class': 379, 'module': 150}","{'module': 72, 'class': 150, 'def': 1854}"
+micropython-v1_16-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_16-esp8266,1.16,esp8266,0.51,0.61,0.11,"{'def': 2021, 'class': 360, 'module': 149}","{'module': 73, 'class': 141, 'def': 1799}"
+micropython-v1_16-frozen,..\repos\micropython-stubs\stubs\micropython-v1_16-frozen,1.16,frozen,0.17,0.17,0.32,"{'def': 3692, 'class': 580, 'module': 440}","{'module': 365, 'class': 479, 'def': 2502}"
+micropython-v1_16-pyboard,..\repos\micropython-stubs\stubs\micropython-v1_16-pyboard,1.16,pyboard,0.52,0.78,0.11,"{'def': 2450, 'class': 689, 'module': 116}","{'module': 56, 'class': 155, 'def': 2186}"
+micropython-v1_17-docstubs,..\repos\micropython-stubs\stubs\micropython-v1_17-docstubs,1.17,docstubs,1.0,0.95,0.97,"{'def': 771, 'class': 107, 'module': 47}","{'module': 0, 'class': 5, 'def': 25}"
+micropython-v1_17-esp32,..\repos\micropython-stubs\stubs\micropython-v1_17-esp32,1.17,esp32,0.52,0.6,0.11,"{'def': 2108, 'class': 381, 'module': 150}","{'module': 72, 'class': 151, 'def': 1866}"
+micropython-v1_17-esp32-merged,..\repos\micropython-stubs\stubs\micropython-v1_17-esp32-merged,1.17,esp32,0.83,0.83,0.51,"{'def': 1796, 'class': 325, 'module': 148}","{'module': 25, 'class': 54, 'def': 878}"
+micropython-v1_17-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_17-esp8266,1.17,esp8266,0.51,0.61,0.11,"{'def': 2021, 'class': 360, 'module': 149}","{'module': 73, 'class': 141, 'def': 1799}"
+micropython-v1_17-esp8266-merged,..\repos\micropython-stubs\stubs\micropython-v1_17-esp8266-merged,1.17,esp8266,0.8,0.82,0.44,"{'def': 1729, 'class': 297, 'module': 147}","{'module': 29, 'class': 53, 'def': 971}"
+micropython-v1_17-frozen,..\repos\micropython-stubs\stubs\micropython-v1_17-frozen,1.17,frozen,0.29,0.31,0.4,"{'def': 1800, 'class': 294, 'module': 214}","{'module': 153, 'class': 202, 'def': 1072}"
+micropython-v1_17-rp2,..\repos\micropython-stubs\stubs\micropython-v1_17-rp2,1.17,rp2,0.53,0.61,0.03,"{'def': 1522, 'class': 317, 'module': 102}","{'module': 48, 'class': 123, 'def': 1480}"
+micropython-v1_17-rp2-merged,..\repos\micropython-stubs\stubs\micropython-v1_17-rp2-merged,1.17,rp2,0.86,0.84,0.43,"{'def': 1244, 'class': 248, 'module': 100}","{'module': 14, 'class': 39, 'def': 712}"
+micropython-v1_17-stm32,..\repos\micropython-stubs\stubs\micropython-v1_17-stm32,1.17,stm32,0.53,0.77,0.11,"{'def': 2500, 'class': 695, 'module': 118}","{'module': 56, 'class': 158, 'def': 2230}"
+micropython-v1_17-stm32-merged,..\repos\micropython-stubs\stubs\micropython-v1_17-stm32-merged,1.17,stm32,0.88,0.93,0.6,"{'def': 2176, 'class': 629, 'module': 116}","{'module': 14, 'class': 41, 'def': 872}"
+micropython-v1_18-docstubs,..\repos\micropython-stubs\stubs\micropython-v1_18-docstubs,1.18,docstubs,1.0,0.95,0.97,"{'def': 784, 'class': 107, 'module': 49}","{'module': 0, 'class': 5, 'def': 25}"
+micropython-v1_18-esp32,..\repos\micropython-stubs\stubs\micropython-v1_18-esp32,1.18,esp32,0.52,0.6,0.11,"{'def': 2120, 'class': 381, 'module': 152}","{'module': 73, 'class': 151, 'def': 1878}"
+micropython-v1_18-esp32-merged,..\repos\micropython-stubs\stubs\micropython-v1_18-esp32-merged,1.18,esp32,0.84,0.84,0.53,"{'def': 1810, 'class': 329, 'module': 150}","{'module': 24, 'class': 54, 'def': 856}"
+micropython-v1_18-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_18-esp8266,1.18,esp8266,0.51,0.61,0.11,"{'def': 2021, 'class': 360, 'module': 149}","{'module': 73, 'class': 141, 'def': 1799}"
+micropython-v1_18-esp8266-merged,..\repos\micropython-stubs\stubs\micropython-v1_18-esp8266-merged,1.18,esp8266,0.82,0.82,0.44,"{'def': 1731, 'class': 297, 'module': 147}","{'module': 27, 'class': 53, 'def': 963}"
+micropython-v1_18-frozen,..\repos\micropython-stubs\stubs\micropython-v1_18-frozen,1.18,frozen,0.29,0.31,0.43,"{'def': 2692, 'class': 457, 'module': 319}","{'module': 226, 'class': 317, 'def': 1547}"
+micropython-v1_18-rp2,..\repos\micropython-stubs\stubs\micropython-v1_18-rp2,1.18,rp2,0.53,0.6,0.11,"{'def': 1974, 'class': 349, 'module': 120}","{'module': 56, 'class': 139, 'def': 1750}"
+micropython-v1_18-rp2-merged,..\repos\micropython-stubs\stubs\micropython-v1_18-rp2-merged,1.18,rp2,0.9,0.84,0.54,"{'def': 1644, 'class': 288, 'module': 118}","{'module': 12, 'class': 45, 'def': 756}"
+micropython-v1_18-stm32,..\repos\micropython-stubs\stubs\micropython-v1_18-stm32,1.18,stm32,0.53,0.83,0.1,"{'def': 1996, 'class': 571, 'module': 114}","{'module': 54, 'class': 97, 'def': 1800}"
+micropython-v1_18-stm32-merged,..\repos\micropython-stubs\stubs\micropython-v1_18-stm32-merged,1.18,stm32,0.89,0.94,0.65,"{'def': 2028, 'class': 599, 'module': 114}","{'module': 13, 'class': 38, 'def': 712}"
+micropython-v1_19-docstubs,..\repos\micropython-stubs\stubs\micropython-v1_19-docstubs,1.19,docstubs,1.0,0.95,0.97,"{'def': 813, 'class': 109, 'module': 50}","{'module': 0, 'class': 5, 'def': 25}"
+micropython-v1_19-frozen,..\repos\micropython-stubs\stubs\micropython-v1_19-frozen,1.19,frozen,0.31,0.35,0.45,"{'def': 4146, 'class': 721, 'module': 473}","{'module': 325, 'class': 468, 'def': 2299}"
+micropython-v1_19_1-docstubs,..\repos\micropython-stubs\stubs\micropython-v1_19_1-docstubs,1.19.1,docstubs,1.0,0.95,0.97,"{'def': 813, 'class': 109, 'module': 50}","{'module': 0, 'class': 5, 'def': 25}"
+micropython-v1_19_1-esp32,..\repos\micropython-stubs\stubs\micropython-v1_19_1-esp32,1.19.1,esp32,0.51,0.21,0.1,"{'def': 1890, 'class': 260, 'module': 152}","{'module': 74, 'class': 205, 'def': 1694}"
+micropython-v1_19_1-esp32-merged,..\repos\micropython-stubs\stubs\micropython-v1_19_1-esp32-merged,1.19.1,esp32,0.84,0.73,0.58,"{'def': 1934, 'class': 305, 'module': 150}","{'module': 24, 'class': 82, 'def': 806}"
+micropython-v1_19_1-esp32-s3,..\repos\micropython-stubs\stubs\micropython-v1_19_1-esp32-s3,1.19.1,esp32,1.0,0.33,0.11,"{'def': 1027, 'class': 167, 'module': 75}","{'module': 0, 'class': 112, 'def': 919}"
+micropython-v1_19_1-esp32-S3-merged,..\repos\micropython-stubs\stubs\micropython-v1_19_1-esp32-S3-merged,1.19.1,esp32,1.0,0.79,0.59,"{'def': 974, 'class': 178, 'module': 74}","{'module': 0, 'class': 37, 'def': 396}"
+micropython-v1_19_1-esp32-UM_TINYPICO,..\repos\micropython-stubs\stubs\micropython-v1_19_1-esp32-UM_TINYPICO,1.19.1,esp32,0.91,0.87,0.12,"{'def': 1021, 'class': 213, 'module': 79}","{'module': 7, 'class': 28, 'def': 898}"
+micropython-v1_19_1-esp32-UM_TINYPICO-merged,..\repos\micropython-stubs\stubs\micropython-v1_19_1-esp32-UM_TINYPICO-merged,1.19.1,esp32,0.91,0.88,0.56,"{'def': 1049, 'class': 232, 'module': 79}","{'module': 7, 'class': 28, 'def': 464}"
+micropython-v1_19_1-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_19_1-esp8266,1.19.1,esp8266,0.51,0.09,0.1,"{'def': 1368, 'class': 148, 'module': 118}","{'module': 58, 'class': 134, 'def': 1236}"
+micropython-v1_19_1-esp8266-merged,..\repos\micropython-stubs\stubs\micropython-v1_19_1-esp8266-merged,1.19.1,esp8266,0.89,0.78,0.59,"{'def': 1412, 'class': 178, 'module': 118}","{'module': 13, 'class': 40, 'def': 572}"
+micropython-v1_19_1-frozen,..\repos\micropython-stubs\stubs\micropython-v1_19_1-frozen,1.19.1,frozen,0.31,0.35,0.45,"{'def': 4146, 'class': 721, 'module': 473}","{'module': 325, 'class': 468, 'def': 2299}"
+micropython-v1_19_1-rp2,..\repos\micropython-stubs\stubs\micropython-v1_19_1-rp2,1.19.1,rp2,0.52,0.32,0.12,"{'def': 1992, 'class': 373, 'module': 142}","{'module': 68, 'class': 254, 'def': 1758}"
+micropython-v1_19_1-rp2-merged,..\repos\micropython-stubs\stubs\micropython-v1_19_1-rp2-merged,1.19.1,rp2,0.84,0.65,0.54,"{'def': 1974, 'class': 395, 'module': 140}","{'module': 22, 'class': 137, 'def': 902}"
+micropython-v1_19_1-rp2_simple,..\repos\micropython-stubs\stubs\micropython-v1_19_1-rp2_simple,1.19.1,rp2_simple,0.53,0.26,0.1,"{'def': 1357, 'class': 195, 'module': 105}","{'module': 49, 'class': 144, 'def': 1222}"
+micropython-v1_19_1-stm32,..\repos\micropython-stubs\stubs\micropython-v1_19_1-stm32,1.19.1,stm32,0.51,0.65,0.1,"{'def': 2087, 'class': 549, 'module': 115}","{'module': 56, 'class': 194, 'def': 1888}"
+micropython-v1_19_1-stm32-merged,..\repos\micropython-stubs\stubs\micropython-v1_19_1-stm32-merged,1.19.1,stm32,0.89,0.9,0.64,"{'def': 2088, 'class': 573, 'module': 114}","{'module': 12, 'class': 60, 'def': 754}"
+micropython-v1_20_0-docstubs,..\repos\micropython-stubs\stubs\micropython-v1_20_0-docstubs,1.20.0,docstubs,1.0,0.95,0.97,"{'def': 823, 'class': 108, 'module': 50}","{'module': 0, 'class': 5, 'def': 24}"
+micropython-v1_20_0-esp32,..\repos\micropython-stubs\stubs\micropython-v1_20_0-esp32,1.20.0,esp32,0.52,0.21,0.1,"{'def': 1908, 'class': 262, 'module': 158}","{'module': 76, 'class': 206, 'def': 1710}"
+micropython-v1_20_0-esp32-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-esp32-merged,1.20.0,esp32,0.84,0.73,0.61,"{'def': 1966, 'class': 306, 'module': 158}","{'module': 25, 'class': 84, 'def': 764}"
+micropython-v1_20_0-esp32-OTA,..\repos\micropython-stubs\stubs\micropython-v1_20_0-esp32-OTA,1.20.0,esp32,0.52,0.21,0.1,"{'def': 1908, 'class': 262, 'module': 158}","{'module': 76, 'class': 206, 'def': 1710}"
+micropython-v1_20_0-esp32-OTA-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-esp32-OTA-merged,1.20.0,esp32,0.84,0.73,0.61,"{'def': 1966, 'class': 306, 'module': 158}","{'module': 25, 'class': 84, 'def': 764}"
+micropython-v1_20_0-esp32-S3,..\repos\micropython-stubs\stubs\micropython-v1_20_0-esp32-S3,1.20.0,esp32,0.52,0.22,0.1,"{'def': 1896, 'class': 263, 'module': 156}","{'module': 75, 'class': 204, 'def': 1700}"
+micropython-v1_20_0-esp32-S3-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-esp32-S3-merged,1.20.0,esp32,0.85,0.72,0.61,"{'def': 1944, 'class': 303, 'module': 156}","{'module': 24, 'class': 84, 'def': 766}"
+micropython-v1_20_0-frozen,..\repos\micropython-stubs\stubs\micropython-v1_20_0-frozen,1.20.0,frozen,0.15,0.15,0.32,"{'def': 18676, 'class': 2959, 'module': 2019}","{'module': 1711, 'class': 2517, 'def': 12774}"
+micropython-v1_20_0-rp2,..\repos\micropython-stubs\stubs\micropython-v1_20_0-rp2,1.20.0,rp2,0.54,0.52,0.11,"{'def': 1518, 'class': 339, 'module': 116}","{'module': 53, 'class': 164, 'def': 1354}"
+micropython-v1_20_0-rp2-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-rp2-merged,1.20.0,rp2,0.91,0.81,0.57,"{'def': 1546, 'class': 363, 'module': 116}","{'module': 11, 'class': 69, 'def': 660}"
+micropython-v1_20_0-rp2-PICO,..\repos\micropython-stubs\stubs\micropython-v1_20_0-rp2-PICO,1.20.0,rp2,0.54,0.52,0.11,"{'def': 1518, 'class': 339, 'module': 116}","{'module': 53, 'class': 164, 'def': 1354}"
+micropython-v1_20_0-rp2-PICO-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-rp2-PICO-merged,1.20.0,rp2,0.91,0.81,0.57,"{'def': 1546, 'class': 363, 'module': 116}","{'module': 11, 'class': 69, 'def': 660}"
+micropython-v1_20_0-rp2-PICO_W,..\repos\micropython-stubs\stubs\micropython-v1_20_0-rp2-PICO_W,1.20.0,rp2,0.54,0.51,0.1,"{'def': 1748, 'class': 365, 'module': 138}","{'module': 64, 'class': 178, 'def': 1570}"
+micropython-v1_20_0-rp2-PICO_W-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-rp2-PICO_W-merged,1.20.0,rp2,0.88,0.8,0.56,"{'def': 1776, 'class': 389, 'module': 138}","{'module': 17, 'class': 77, 'def': 780}"
+micropython-v1_20_0-rp2-PIMORONI_PICOLIPO_16MB,..\repos\micropython-stubs\stubs\micropython-v1_20_0-rp2-PIMORONI_PICOLIPO_16MB,1.20.0,rp2,0.54,0.42,0.11,"{'def': 1518, 'class': 285, 'module': 116}","{'module': 53, 'class': 164, 'def': 1354}"
+micropython-v1_20_0-rp2-PIMORONI_PICOLIPO_16MB-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-rp2-PIMORONI_PICOLIPO_16MB-merged,1.20.0,rp2,0.91,0.78,0.57,"{'def': 1546, 'class': 309, 'module': 116}","{'module': 11, 'class': 69, 'def': 660}"
+micropython-v1_20_0-samd-ADAFRUIT_FEATHER_M4_EXPRESS,..\repos\micropython-stubs\stubs\micropython-v1_20_0-samd-ADAFRUIT_FEATHER_M4_EXPRESS,1.20.0,samd,0.52,0.61,0.11,"{'def': 1426, 'class': 377, 'module': 102}","{'module': 49, 'class': 148, 'def': 1276}"
+micropython-v1_20_0-samd-ADAFRUIT_FEATHER_M4_EXPRESS-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-samd-ADAFRUIT_FEATHER_M4_EXPRESS-merged,1.20.0,samd,0.88,0.85,0.56,"{'def': 1454, 'class': 401, 'module': 102}","{'module': 12, 'class': 60, 'def': 646}"
+micropython-v1_20_0-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS,..\repos\micropython-stubs\stubs\micropython-v1_20_0-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS,1.20.0,samd,0.52,0.58,0.11,"{'def': 1426, 'class': 351, 'module': 102}","{'module': 49, 'class': 148, 'def': 1276}"
+micropython-v1_20_0-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS-merged,1.20.0,samd,0.88,0.84,0.56,"{'def': 1454, 'class': 375, 'module': 102}","{'module': 12, 'class': 60, 'def': 646}"
+micropython-v1_20_0-samd-MINISAM_M4,..\repos\micropython-stubs\stubs\micropython-v1_20_0-samd-MINISAM_M4,1.20.0,samd,0.52,0.56,0.11,"{'def': 1426, 'class': 333, 'module': 102}","{'module': 49, 'class': 148, 'def': 1276}"
+micropython-v1_20_0-samd-MINISAM_M4-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-samd-MINISAM_M4-merged,1.20.0,samd,0.88,0.83,0.56,"{'def': 1454, 'class': 357, 'module': 102}","{'module': 12, 'class': 60, 'def': 646}"
+micropython-v1_20_0-samd-SEEED_WIO_TERMINAL,..\repos\micropython-stubs\stubs\micropython-v1_20_0-samd-SEEED_WIO_TERMINAL,1.20.0,samd,0.52,0.71,0.11,"{'def': 1426, 'class': 519, 'module': 102}","{'module': 49, 'class': 148, 'def': 1276}"
+micropython-v1_20_0-samd-SEEED_WIO_TERMINAL-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-samd-SEEED_WIO_TERMINAL-merged,1.20.0,samd,0.88,0.89,0.56,"{'def': 1454, 'class': 543, 'module': 102}","{'module': 12, 'class': 60, 'def': 646}"
+micropython-v1_20_0-stm32,..\repos\micropython-stubs\stubs\micropython-v1_20_0-stm32,1.20.0,stm32,0.53,0.66,0.09,"{'def': 2034, 'class': 539, 'module': 118}","{'module': 56, 'class': 184, 'def': 1844}"
+micropython-v1_20_0-stm32-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-stm32-merged,1.20.0,stm32,0.9,0.9,0.65,"{'def': 2066, 'class': 563, 'module': 118}","{'module': 12, 'class': 58, 'def': 720}"
+micropython-v1_20_0-stm32-PYBV11,..\repos\micropython-stubs\stubs\micropython-v1_20_0-stm32-PYBV11,1.20.0,stm32,0.53,0.66,0.09,"{'def': 2034, 'class': 539, 'module': 118}","{'module': 56, 'class': 184, 'def': 1844}"
+micropython-v1_20_0-stm32-PYBV11-merged,..\repos\micropython-stubs\stubs\micropython-v1_20_0-stm32-PYBV11-merged,1.20.0,stm32,0.9,0.9,0.65,"{'def': 2066, 'class': 563, 'module': 118}","{'module': 12, 'class': 58, 'def': 720}"
+micropython-v1_21_0-docstubs,..\repos\micropython-stubs\stubs\micropython-v1_21_0-docstubs,1.21.0,docstubs,1.0,0.96,0.97,"{'def': 915, 'class': 124, 'module': 55}","{'module': 0, 'class': 5, 'def': 24}"
+micropython-v1_21_0-esp32,..\repos\micropython-stubs\stubs\micropython-v1_21_0-esp32,1.21.0,esp32,0.51,0.29,0.1,"{'def': 2220, 'class': 339, 'module': 179}","{'module': 87, 'class': 242, 'def': 1988}"
+micropython-v1_21_0-esp32-ESP32_GENERIC,..\repos\micropython-stubs\stubs\micropython-v1_21_0-esp32-ESP32_GENERIC,1.21.0,esp32,0.51,0.29,0.1,"{'def': 2220, 'class': 339, 'module': 179}","{'module': 87, 'class': 242, 'def': 1988}"
+micropython-v1_21_0-esp32-ESP32_GENERIC-merged,..\repos\micropython-stubs\stubs\micropython-v1_21_0-esp32-ESP32_GENERIC-merged,1.21.0,esp32,0.83,0.7,0.58,"{'def': 2236, 'class': 377, 'module': 174}","{'module': 30, 'class': 112, 'def': 950}"
+micropython-v1_21_0-esp32-merged,..\repos\micropython-stubs\stubs\micropython-v1_21_0-esp32-merged,1.21.0,esp32,0.83,0.7,0.58,"{'def': 2236, 'class': 377, 'module': 174}","{'module': 30, 'class': 112, 'def': 950}"
+micropython-v1_21_0-frozen,..\repos\micropython-stubs\stubs\micropython-v1_21_0-frozen,1.21.0,frozen,0.23,0.15,0.36,"{'def': 19937, 'class': 2989, 'module': 2338}","{'module': 1795, 'class': 2554, 'def': 12856}"
+micropython-v1_21_0-rp2-RPI_PICO,..\repos\micropython-stubs\stubs\micropython-v1_21_0-rp2-RPI_PICO,1.21.0,rp2,0.54,0.53,0.11,"{'def': 1648, 'class': 402, 'module': 128}","{'module': 59, 'class': 188, 'def': 1464}"
+micropython-v1_21_0-rp2-RPI_PICO-merged,..\repos\micropython-stubs\stubs\micropython-v1_21_0-rp2-RPI_PICO-merged,1.21.0,rp2,0.88,0.78,0.55,"{'def': 1676, 'class': 424, 'module': 128}","{'module': 16, 'class': 95, 'def': 754}"
+micropython-v1_21_0-rp2-RPI_PICO_W,..\repos\micropython-stubs\stubs\micropython-v1_21_0-rp2-RPI_PICO_W,1.21.0,rp2,0.53,0.52,0.12,"{'def': 2248, 'class': 602, 'module': 176}","{'module': 83, 'class': 286, 'def': 1978}"
+micropython-v1_21_0-rp2-RPI_PICO_W-merged,..\repos\micropython-stubs\stubs\micropython-v1_21_0-rp2-RPI_PICO_W-merged,1.21.0,rp2,0.82,0.72,0.52,"{'def': 2276, 'class': 628, 'module': 174}","{'module': 32, 'class': 175, 'def': 1088}"
+micropython-v1_21_0-samd-SEEED_WIO_TERMINAL,..\repos\micropython-stubs\stubs\micropython-v1_21_0-samd-SEEED_WIO_TERMINAL,1.21.0,samd,0.52,0.72,0.11,"{'def': 1506, 'class': 594, 'module': 114}","{'module': 55, 'class': 168, 'def': 1340}"
+micropython-v1_21_0-samd-SEEED_WIO_TERMINAL-merged,..\repos\micropython-stubs\stubs\micropython-v1_21_0-samd-SEEED_WIO_TERMINAL-merged,1.21.0,samd,0.85,0.86,0.55,"{'def': 1534, 'class': 616, 'module': 114}","{'module': 17, 'class': 86, 'def': 688}"
+micropython-v1_21_0-stm32-PYBV11,..\repos\micropython-stubs\stubs\micropython-v1_21_0-stm32-PYBV11,1.21.0,stm32,0.52,0.66,0.1,"{'def': 2146, 'class': 600, 'module': 124}","{'module': 60, 'class': 206, 'def': 1938}"
+micropython-v1_21_0-stm32-PYBV11-merged,..\repos\micropython-stubs\stubs\micropython-v1_21_0-stm32-PYBV11-merged,1.21.0,stm32,0.88,0.87,0.63,"{'def': 2178, 'class': 622, 'module': 124}","{'module': 15, 'class': 82, 'def': 806}"
+micropython-v1_9_3-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_9_3-esp8266,1.9.3,esp8266,0.51,0.58,0.01,"{'def': 1112, 'class': 182, 'module': 117}","{'module': 57, 'class': 76, 'def': 1100}"
+micropython-v1_9_3-frozen,..\repos\micropython-stubs\stubs\micropython-v1_9_3-frozen,1.9.3,frozen,0.05,0.0,0.16,"{'def': 363, 'class': 40, 'module': 40}","{'module': 38, 'class': 40, 'def': 306}"
+micropython-v1_9_4-esp8266,..\repos\micropython-stubs\stubs\micropython-v1_9_4-esp8266,1.9.4,esp8266,0.52,0.5,0.02,"{'def': 642, 'class': 104, 'module': 119}","{'module': 57, 'class': 52, 'def': 630}"
+micropython-v1_9_4-frozen,..\repos\micropython-stubs\stubs\micropython-v1_9_4-frozen,1.9.4,frozen,0.05,0.0,0.17,"{'def': 571, 'class': 82, 'module': 74}","{'module': 70, 'class': 82, 'def': 474}"
+micropython-latest-esp32-stubs,..\repos\micropython-stubs\publish\micropython-latest-esp32-stubs,99.99.99,esp32,0.61,0.59,0.59,"{'def': 1148, 'class': 145, 'module': 94}","{'module': 37, 'class': 59, 'def': 475}"
+micropython-latest-rp2-pimoroni_picolipo_16mb-stubs,..\repos\micropython-stubs\publish\micropython-latest-rp2-pimoroni_picolipo_16mb-stubs,99.99.99,rp2,0.7,0.55,0.55,"{'def': 844, 'class': 107, 'module': 66}","{'module': 20, 'class': 48, 'def': 377}"
+micropython-latest-rp2-stubs,..\repos\micropython-stubs\publish\micropython-latest-rp2-stubs,99.99.99,rp2,0.7,0.55,0.55,"{'def': 844, 'class': 107, 'module': 66}","{'module': 20, 'class': 48, 'def': 377}"
+micropython-latest-samd-adafruit_feather_m4_express-stubs,..\repos\micropython-stubs\publish\micropython-latest-samd-adafruit_feather_m4_express-stubs,99.99.99,samd,0.68,0.58,0.54,"{'def': 798, 'class': 99, 'module': 59}","{'module': 19, 'class': 42, 'def': 368}"
+micropython-latest-samd-adafruit_itsybitsy_m4_express-stubs,..\repos\micropython-stubs\publish\micropython-latest-samd-adafruit_itsybitsy_m4_express-stubs,99.99.99,samd,0.68,0.58,0.54,"{'def': 798, 'class': 99, 'module': 59}","{'module': 19, 'class': 42, 'def': 368}"
+micropython-latest-samd-minisam_m4-stubs,..\repos\micropython-stubs\publish\micropython-latest-samd-minisam_m4-stubs,99.99.99,samd,0.68,0.58,0.54,"{'def': 798, 'class': 99, 'module': 59}","{'module': 19, 'class': 42, 'def': 368}"
+micropython-latest-samd-seeed_wio_terminal-stubs,..\repos\micropython-stubs\publish\micropython-latest-samd-seeed_wio_terminal-stubs,99.99.99,samd,0.68,0.58,0.54,"{'def': 798, 'class': 99, 'module': 59}","{'module': 19, 'class': 42, 'def': 368}"
+micropython-latest-stm32-pybv11-stubs,..\repos\micropython-stubs\publish\micropython-latest-stm32-pybv11-stubs,99.99.99,stm32,0.74,0.66,0.64,"{'def': 1104, 'class': 119, 'module': 66}","{'module': 17, 'class': 41, 'def': 400}"
+micropython-latest-stm32-stubs,..\repos\micropython-stubs\publish\micropython-latest-stm32-stubs,99.99.99,stm32,0.74,0.66,0.64,"{'def': 1104, 'class': 119, 'module': 66}","{'module': 17, 'class': 41, 'def': 400}"
+micropython-stdlib-stubs,..\repos\micropython-stubs\publish\micropython-stdlib-stubs,1.0,stdlib,1.0,1.0,1.0,"{'def': 3625, 'class': 658, 'module': 63}","{'module': 0, 'class': 0, 'def': 0}"
+micropython-v1_17-esp32-stubs,..\repos\micropython-stubs\publish\micropython-v1_17-esp32-stubs,1.17,esp32,0.62,0.55,0.5,"{'def': 953, 'class': 132, 'module': 80}","{'module': 30, 'class': 60, 'def': 481}"
+micropython-v1_17-esp8266-stubs,..\repos\micropython-stubs\publish\micropython-v1_17-esp8266-stubs,1.17,esp8266,0.56,0.5,0.43,"{'def': 899, 'class': 113, 'module': 80}","{'module': 35, 'class': 57, 'def': 512}"
+micropython-v1_17-rp2-stubs,..\repos\micropython-stubs\publish\micropython-v1_17-rp2-stubs,1.17,rp2,0.7,0.55,0.42,"{'def': 661, 'class': 95, 'module': 53}","{'module': 16, 'class': 43, 'def': 385}"
+micropython-v1_17-stm32-stubs,..\repos\micropython-stubs\publish\micropython-v1_17-stm32-stubs,1.17,stm32,0.73,0.68,0.59,"{'def': 1111, 'class': 136, 'module': 60}","{'module': 16, 'class': 43, 'def': 451}"
+micropython-v1_18-esp32-stubs,..\repos\micropython-stubs\publish\micropython-v1_18-esp32-stubs,1.18,esp32,0.64,0.55,0.51,"{'def': 960, 'class': 134, 'module': 81}","{'module': 29, 'class': 60, 'def': 470}"
+micropython-v1_18-esp8266-stubs,..\repos\micropython-stubs\publish\micropython-v1_18-esp8266-stubs,1.18,esp8266,0.59,0.5,0.44,"{'def': 900, 'class': 113, 'module': 80}","{'module': 33, 'class': 57, 'def': 508}"
+micropython-v1_18-rp2-stubs,..\repos\micropython-stubs\publish\micropython-v1_18-rp2-stubs,1.18,rp2,0.79,0.58,0.54,"{'def': 839, 'class': 113, 'module': 61}","{'module': 13, 'class': 47, 'def': 388}"
+micropython-v1_18-stm32-stubs,..\repos\micropython-stubs\publish\micropython-v1_18-stm32-stubs,1.18,stm32,0.75,0.67,0.64,"{'def': 1037, 'class': 121, 'module': 59}","{'module': 15, 'class': 40, 'def': 371}"
+micropython-v1_19_1-esp32-s3-stubs,..\repos\micropython-stubs\publish\micropython-v1_19_1-esp32-s3-stubs,1.19.1,esp32,0.81,0.77,0.62,"{'def': 1007, 'class': 142, 'module': 80}","{'module': 15, 'class': 33, 'def': 381}"
+micropython-v1_19_1-esp32-stubs,..\repos\micropython-stubs\publish\micropython-v1_19_1-esp32-stubs,1.19.1,esp32,0.64,0.65,0.57,"{'def': 1020, 'class': 133, 'module': 81}","{'module': 29, 'class': 47, 'def': 443}"
+micropython-v1_19_1-esp32-um_tinypico-stubs,..\repos\micropython-stubs\publish\micropython-v1_19_1-esp32-um_tinypico-stubs,1.19.1,esp32,0.63,0.65,0.57,"{'def': 1038, 'class': 134, 'module': 83}","{'module': 31, 'class': 47, 'def': 443}"
+micropython-v1_19_1-esp8266-stubs,..\repos\micropython-stubs\publish\micropython-v1_19_1-esp8266-stubs,1.19.1,esp8266,0.71,0.72,0.58,"{'def': 739, 'class': 85, 'module': 65}","{'module': 19, 'class': 24, 'def': 311}"
+micropython-v1_19_1-rp2-stubs,..\repos\micropython-stubs\publish\micropython-v1_19_1-rp2-stubs,1.19.1,rp2,0.68,0.5,0.54,"{'def': 1003, 'class': 142, 'module': 73}","{'module': 23, 'class': 71, 'def': 460}"
+micropython-v1_19_1-stm32-stubs,..\repos\micropython-stubs\publish\micropython-v1_19_1-stm32-stubs,1.19.1,stm32,0.76,0.73,0.63,"{'def': 1066, 'class': 119, 'module': 59}","{'module': 14, 'class': 32, 'def': 391}"
+micropython-v1_20_0-esp32-ota-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-esp32-ota-stubs,1.20.0,esp32,0.64,0.64,0.61,"{'def': 1041, 'class': 130, 'module': 85}","{'module': 31, 'class': 47, 'def': 410}"
+micropython-v1_20_0-esp32-s3-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-esp32-s3-stubs,1.20.0,esp32,0.64,0.65,0.61,"{'def': 1011, 'class': 124, 'module': 84}","{'module': 30, 'class': 44, 'def': 395}"
+micropython-v1_20_0-esp32-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-esp32-stubs,1.20.0,esp32,0.64,0.64,0.61,"{'def': 1041, 'class': 130, 'module': 85}","{'module': 31, 'class': 47, 'def': 410}"
+micropython-v1_20_0-rp2-pico-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-rp2-pico-stubs,1.20.0,rp2,0.77,0.65,0.59,"{'def': 782, 'class': 97, 'module': 60}","{'module': 14, 'class': 34, 'def': 324}"
+micropython-v1_20_0-rp2-pico_w-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-rp2-pico_w-stubs,1.20.0,rp2,0.72,0.63,0.57,"{'def': 896, 'class': 104, 'module': 71}","{'module': 20, 'class': 38, 'def': 383}"
+micropython-v1_20_0-rp2-pimoroni_picolipo_16mb-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-rp2-pimoroni_picolipo_16mb-stubs,1.20.0,rp2,0.77,0.65,0.59,"{'def': 782, 'class': 97, 'module': 60}","{'module': 14, 'class': 34, 'def': 324}"
+micropython-v1_20_0-rp2-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-rp2-stubs,1.20.0,rp2,0.77,0.65,0.59,"{'def': 782, 'class': 97, 'module': 60}","{'module': 14, 'class': 34, 'def': 324}"
+micropython-v1_20_0-samd-adafruit_feather_m4_express-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-samd-adafruit_feather_m4_express-stubs,1.20.0,samd,0.75,0.69,0.57,"{'def': 736, 'class': 89, 'module': 53}","{'module': 13, 'class': 28, 'def': 315}"
+micropython-v1_20_0-samd-adafruit_itsybitsy_m4_express-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-samd-adafruit_itsybitsy_m4_express-stubs,1.20.0,samd,0.75,0.69,0.57,"{'def': 736, 'class': 89, 'module': 53}","{'module': 13, 'class': 28, 'def': 315}"
+micropython-v1_20_0-samd-minisam_m4-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-samd-minisam_m4-stubs,1.20.0,samd,0.75,0.69,0.57,"{'def': 736, 'class': 89, 'module': 53}","{'module': 13, 'class': 28, 'def': 315}"
+micropython-v1_20_0-samd-seeed_wio_terminal-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-samd-seeed_wio_terminal-stubs,1.20.0,samd,0.75,0.69,0.57,"{'def': 736, 'class': 89, 'module': 53}","{'module': 13, 'class': 28, 'def': 315}"
+micropython-v1_20_0-stm32-pybv11-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-stm32-pybv11-stubs,1.20.0,stm32,0.77,0.75,0.66,"{'def': 1043, 'class': 109, 'module': 61}","{'module': 14, 'class': 27, 'def': 353}"
+micropython-v1_20_0-stm32-stubs,..\repos\micropython-stubs\publish\micropython-v1_20_0-stm32-stubs,1.20.0,stm32,0.77,0.75,0.66,"{'def': 1043, 'class': 109, 'module': 61}","{'module': 14, 'class': 27, 'def': 353}"
+micropython-v1_21_0-esp32-esp32_generic-stubs,..\repos\micropython-stubs\publish\micropython-v1_21_0-esp32-esp32_generic-stubs,1.21.0,esp32,0.64,0.6,0.59,"{'def': 1150, 'class': 145, 'module': 94}","{'module': 34, 'class': 58, 'def': 471}"
+micropython-v1_21_0-esp32-stubs,..\repos\micropython-stubs\publish\micropython-v1_21_0-esp32-stubs,1.21.0,esp32,0.64,0.6,0.59,"{'def': 1150, 'class': 145, 'module': 94}","{'module': 34, 'class': 58, 'def': 471}"
+micropython-v1_21_0-rp2-rpi_pico-stubs,..\repos\micropython-stubs\publish\micropython-v1_21_0-rp2-rpi_pico-stubs,1.21.0,rp2,0.76,0.58,0.58,"{'def': 838, 'class': 106, 'module': 67}","{'module': 16, 'class': 44, 'def': 356}"
+micropython-v1_21_0-rp2-rpi_pico_w-stubs,..\repos\micropython-stubs\publish\micropython-v1_21_0-rp2-rpi_pico_w-stubs,1.21.0,rp2,0.62,0.51,0.58,"{'def': 1170, 'class': 142, 'module': 93}","{'module': 35, 'class': 69, 'def': 492}"
+micropython-v1_21_0-samd-seeed_wio_terminal-stubs,..\repos\micropython-stubs\publish\micropython-v1_21_0-samd-seeed_wio_terminal-stubs,1.21.0,samd,0.72,0.59,0.58,"{'def': 766, 'class': 96, 'module': 60}","{'module': 17, 'class': 39, 'def': 325}"
+micropython-v1_21_0-stm32-pybv11-stubs,..\repos\micropython-stubs\publish\micropython-v1_21_0-stm32-pybv11-stubs,1.21.0,stm32,0.77,0.68,0.65,"{'def': 1089, 'class': 117, 'module': 64}","{'module': 15, 'class': 37, 'def': 385}"
diff --git a/scripts/docstrings.json b/scripts/docstrings.json
new file mode 100644
index 00000000..3d575660
--- /dev/null
+++ b/scripts/docstrings.json
@@ -0,0 +1,3194 @@
+[
+ {
+ "folder": "micropython-core",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-core",
+ "version": "core",
+ "port": "unknown",
+ "module": 1.0,
+ "class": 1.0,
+ "def": 1.0,
+ "counts": {
+ "def": 14,
+ "class": 1,
+ "module": 2
+ },
+ "missing": {
+ "module": 0,
+ "class": 0,
+ "def": 0
+ }
+ },
+ {
+ "folder": "micropython-latest-docstubs",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-docstubs",
+ "version": "99.99.99",
+ "port": "docstubs",
+ "module": 1.0,
+ "class": 0.96,
+ "def": 0.97,
+ "counts": {
+ "def": 911,
+ "class": 116,
+ "module": 55
+ },
+ "missing": {
+ "module": 0,
+ "class": 5,
+ "def": 24
+ }
+ },
+ {
+ "folder": "micropython-latest-esp32--OLD",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-esp32--OLD",
+ "version": "99.99.99",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.29,
+ "def": 0.11,
+ "counts": {
+ "def": 2100,
+ "class": 331,
+ "module": 170
+ },
+ "missing": {
+ "module": 81,
+ "class": 234,
+ "def": 1874
+ }
+ },
+ {
+ "folder": "micropython-latest-esp32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-esp32-merged",
+ "version": "99.99.99",
+ "port": "esp32",
+ "module": 0.83,
+ "class": 0.7,
+ "def": 0.58,
+ "counts": {
+ "def": 2236,
+ "class": 377,
+ "module": 174
+ },
+ "missing": {
+ "module": 30,
+ "class": 112,
+ "def": 950
+ }
+ },
+ {
+ "folder": "micropython-latest-esp8266-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-esp8266-merged",
+ "version": "99.99.99",
+ "port": "esp8266",
+ "module": 0.89,
+ "class": 0.8,
+ "def": 0.62,
+ "counts": {
+ "def": 1322,
+ "class": 166,
+ "module": 116
+ },
+ "missing": {
+ "module": 13,
+ "class": 34,
+ "def": 498
+ }
+ },
+ {
+ "folder": "micropython-latest-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-frozen",
+ "version": "99.99.99",
+ "port": "frozen",
+ "module": 0.14,
+ "class": 0.12,
+ "def": 0.33,
+ "counts": {
+ "def": 19581,
+ "class": 2971,
+ "module": 2327
+ },
+ "missing": {
+ "module": 2004,
+ "class": 2626,
+ "def": 13158
+ }
+ },
+ {
+ "folder": "micropython-latest-rp2-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-rp2-merged",
+ "version": "99.99.99",
+ "port": "rp2",
+ "module": 0.91,
+ "class": 0.8,
+ "def": 0.57,
+ "counts": {
+ "def": 1546,
+ "class": 359,
+ "module": 116
+ },
+ "missing": {
+ "module": 11,
+ "class": 73,
+ "def": 660
+ }
+ },
+ {
+ "folder": "micropython-latest-rp2-PIMORONI_PICOLIPO_16MB-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-rp2-PIMORONI_PICOLIPO_16MB-merged",
+ "version": "99.99.99",
+ "port": "rp2",
+ "module": 0.91,
+ "class": 0.76,
+ "def": 0.57,
+ "counts": {
+ "def": 1546,
+ "class": 305,
+ "module": 116
+ },
+ "missing": {
+ "module": 11,
+ "class": 73,
+ "def": 660
+ }
+ },
+ {
+ "folder": "micropython-latest-samd-ADAFRUIT_FEATHER_M4_EXPRESS-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-samd-ADAFRUIT_FEATHER_M4_EXPRESS-merged",
+ "version": "99.99.99",
+ "port": "samd",
+ "module": 0.88,
+ "class": 0.84,
+ "def": 0.56,
+ "counts": {
+ "def": 1454,
+ "class": 397,
+ "module": 102
+ },
+ "missing": {
+ "module": 12,
+ "class": 64,
+ "def": 646
+ }
+ },
+ {
+ "folder": "micropython-latest-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS-merged",
+ "version": "99.99.99",
+ "port": "samd",
+ "module": 0.88,
+ "class": 0.83,
+ "def": 0.56,
+ "counts": {
+ "def": 1454,
+ "class": 371,
+ "module": 102
+ },
+ "missing": {
+ "module": 12,
+ "class": 64,
+ "def": 646
+ }
+ },
+ {
+ "folder": "micropython-latest-samd-MINISAM_M4-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-samd-MINISAM_M4-merged",
+ "version": "99.99.99",
+ "port": "samd",
+ "module": 0.88,
+ "class": 0.82,
+ "def": 0.56,
+ "counts": {
+ "def": 1454,
+ "class": 353,
+ "module": 102
+ },
+ "missing": {
+ "module": 12,
+ "class": 64,
+ "def": 646
+ }
+ },
+ {
+ "folder": "micropython-latest-samd-SEEED_WIO_TERMINAL-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-samd-SEEED_WIO_TERMINAL-merged",
+ "version": "99.99.99",
+ "port": "samd",
+ "module": 0.88,
+ "class": 0.88,
+ "def": 0.56,
+ "counts": {
+ "def": 1454,
+ "class": 539,
+ "module": 102
+ },
+ "missing": {
+ "module": 12,
+ "class": 64,
+ "def": 646
+ }
+ },
+ {
+ "folder": "micropython-latest-stm32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-stm32-merged",
+ "version": "99.99.99",
+ "port": "stm32",
+ "module": 0.92,
+ "class": 0.89,
+ "def": 0.66,
+ "counts": {
+ "def": 2066,
+ "class": 559,
+ "module": 118
+ },
+ "missing": {
+ "module": 10,
+ "class": 62,
+ "def": 708
+ }
+ },
+ {
+ "folder": "micropython-latest-stm32-PYBV11-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-latest-stm32-PYBV11-merged",
+ "version": "99.99.99",
+ "port": "stm32",
+ "module": 0.92,
+ "class": 0.89,
+ "def": 0.66,
+ "counts": {
+ "def": 2066,
+ "class": 559,
+ "module": 118
+ },
+ "missing": {
+ "module": 10,
+ "class": 62,
+ "def": 708
+ }
+ },
+ {
+ "folder": "micropython-pico-go",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-pico-go",
+ "version": "pico",
+ "port": "go",
+ "module": 0.81,
+ "class": 0.95,
+ "def": 0.95,
+ "counts": {
+ "def": 1657,
+ "class": 404,
+ "module": 58
+ },
+ "missing": {
+ "module": 11,
+ "class": 20,
+ "def": 85
+ }
+ },
+ {
+ "folder": "micropython-ulab",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-ulab",
+ "version": "ulab",
+ "port": "unknown",
+ "module": 0.5,
+ "class": 0.5,
+ "def": 0.63,
+ "counts": {
+ "def": 222,
+ "class": 2,
+ "module": 18
+ },
+ "missing": {
+ "module": 9,
+ "class": 1,
+ "def": 83
+ }
+ },
+ {
+ "folder": "micropython-v1_10-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_10-esp32",
+ "version": "1.10",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.53,
+ "def": 0.11,
+ "counts": {
+ "def": 1514,
+ "class": 229,
+ "module": 128
+ },
+ "missing": {
+ "module": 62,
+ "class": 107,
+ "def": 1350
+ }
+ },
+ {
+ "folder": "micropython-v1_10-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_10-esp8266",
+ "version": "1.10",
+ "port": "esp8266",
+ "module": 0.5,
+ "class": 0.57,
+ "def": 0.01,
+ "counts": {
+ "def": 1402,
+ "class": 208,
+ "module": 141
+ },
+ "missing": {
+ "module": 70,
+ "class": 89,
+ "def": 1388
+ }
+ },
+ {
+ "folder": "micropython-v1_10-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_10-frozen",
+ "version": "1.10",
+ "port": "frozen",
+ "module": 0.05,
+ "class": 0.0,
+ "def": 0.17,
+ "counts": {
+ "def": 571,
+ "class": 82,
+ "module": 74
+ },
+ "missing": {
+ "module": 70,
+ "class": 82,
+ "def": 474
+ }
+ },
+ {
+ "folder": "micropython-v1_10-pyboard",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_10-pyboard",
+ "version": "1.10",
+ "port": "pyboard",
+ "module": 0.52,
+ "class": 0.79,
+ "def": 0.1,
+ "counts": {
+ "def": 1996,
+ "class": 545,
+ "module": 100
+ },
+ "missing": {
+ "module": 48,
+ "class": 115,
+ "def": 1804
+ }
+ },
+ {
+ "folder": "micropython-v1_11-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_11-esp32",
+ "version": "1.11",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.53,
+ "def": 0.1,
+ "counts": {
+ "def": 1600,
+ "class": 233,
+ "module": 128
+ },
+ "missing": {
+ "module": 62,
+ "class": 109,
+ "def": 1432
+ }
+ },
+ {
+ "folder": "micropython-v1_11-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_11-esp8266",
+ "version": "1.11",
+ "port": "esp8266",
+ "module": 0.5,
+ "class": 0.5,
+ "def": 0.01,
+ "counts": {
+ "def": 1272,
+ "class": 160,
+ "module": 139
+ },
+ "missing": {
+ "module": 69,
+ "class": 80,
+ "def": 1258
+ }
+ },
+ {
+ "folder": "micropython-v1_11-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_11-frozen",
+ "version": "1.11",
+ "port": "frozen",
+ "module": 0.05,
+ "class": 0.0,
+ "def": 0.17,
+ "counts": {
+ "def": 571,
+ "class": 82,
+ "module": 74
+ },
+ "missing": {
+ "module": 70,
+ "class": 82,
+ "def": 474
+ }
+ },
+ {
+ "folder": "micropython-v1_12-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_12-esp32",
+ "version": "1.12",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.53,
+ "def": 0.11,
+ "counts": {
+ "def": 1732,
+ "class": 249,
+ "module": 132
+ },
+ "missing": {
+ "module": 64,
+ "class": 117,
+ "def": 1550
+ }
+ },
+ {
+ "folder": "micropython-v1_12-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_12-frozen",
+ "version": "1.12",
+ "port": "frozen",
+ "module": 0.05,
+ "class": 0.02,
+ "def": 0.19,
+ "counts": {
+ "def": 1489,
+ "class": 228,
+ "module": 208
+ },
+ "missing": {
+ "module": 197,
+ "class": 223,
+ "def": 1213
+ }
+ },
+ {
+ "folder": "micropython-v1_12-pyboard",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_12-pyboard",
+ "version": "1.12",
+ "port": "pyboard",
+ "module": 0.52,
+ "class": 0.78,
+ "def": 0.1,
+ "counts": {
+ "def": 2122,
+ "class": 563,
+ "module": 102
+ },
+ "missing": {
+ "module": 49,
+ "class": 124,
+ "def": 1912
+ }
+ },
+ {
+ "folder": "micropython-v1_13-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-esp32",
+ "version": "1.13",
+ "port": "esp32",
+ "module": 0.51,
+ "class": 0.6,
+ "def": 0.03,
+ "counts": {
+ "def": 1980,
+ "class": 378,
+ "module": 152
+ },
+ "missing": {
+ "module": 75,
+ "class": 153,
+ "def": 1912
+ }
+ },
+ {
+ "folder": "micropython-v1_13-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_13-frozen",
+ "version": "1.13",
+ "port": "frozen",
+ "module": 0.14,
+ "class": 0.14,
+ "def": 0.29,
+ "counts": {
+ "def": 2240,
+ "class": 342,
+ "module": 284
+ },
+ "missing": {
+ "module": 244,
+ "class": 293,
+ "def": 1583
+ }
+ },
+ {
+ "folder": "micropython-v1_13_266-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_13_266-esp32",
+ "version": "1.13.266",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.6,
+ "def": 0.11,
+ "counts": {
+ "def": 2062,
+ "class": 366,
+ "module": 150
+ },
+ "missing": {
+ "module": 72,
+ "class": 147,
+ "def": 1828
+ }
+ },
+ {
+ "folder": "micropython-v1_13_95-pyboard",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_13_95-pyboard",
+ "version": "1.13.95",
+ "port": "pyboard",
+ "module": 0.5,
+ "class": 0.5,
+ "def": 0.01,
+ "counts": {
+ "def": 1442,
+ "class": 163,
+ "module": 105
+ },
+ "missing": {
+ "module": 52,
+ "class": 81,
+ "def": 1430
+ }
+ },
+ {
+ "folder": "micropython-v1_14-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-esp32",
+ "version": "1.14",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.6,
+ "def": 0.11,
+ "counts": {
+ "def": 2062,
+ "class": 366,
+ "module": 150
+ },
+ "missing": {
+ "module": 72,
+ "class": 147,
+ "def": 1828
+ }
+ },
+ {
+ "folder": "micropython-v1_14-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-esp8266",
+ "version": "1.14",
+ "port": "esp8266",
+ "module": 0.51,
+ "class": 0.6,
+ "def": 0.11,
+ "counts": {
+ "def": 1999,
+ "class": 349,
+ "module": 149
+ },
+ "missing": {
+ "module": 73,
+ "class": 139,
+ "def": 1781
+ }
+ },
+ {
+ "folder": "micropython-v1_14-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_14-frozen",
+ "version": "1.14",
+ "port": "frozen",
+ "module": 0.16,
+ "class": 0.16,
+ "def": 0.3,
+ "counts": {
+ "def": 2086,
+ "class": 316,
+ "module": 242
+ },
+ "missing": {
+ "module": 204,
+ "class": 267,
+ "def": 1459
+ }
+ },
+ {
+ "folder": "micropython-v1_15-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-esp32",
+ "version": "1.15",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.6,
+ "def": 0.12,
+ "counts": {
+ "def": 2030,
+ "class": 361,
+ "module": 142
+ },
+ "missing": {
+ "module": 68,
+ "class": 146,
+ "def": 1796
+ }
+ },
+ {
+ "folder": "micropython-v1_15-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-esp8266",
+ "version": "1.15",
+ "port": "esp8266",
+ "module": 0.51,
+ "class": 0.6,
+ "def": 0.11,
+ "counts": {
+ "def": 2015,
+ "class": 355,
+ "module": 149
+ },
+ "missing": {
+ "module": 73,
+ "class": 141,
+ "def": 1793
+ }
+ },
+ {
+ "folder": "micropython-v1_15-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-frozen",
+ "version": "1.15",
+ "port": "frozen",
+ "module": 0.16,
+ "class": 0.17,
+ "def": 0.31,
+ "counts": {
+ "def": 2146,
+ "class": 328,
+ "module": 242
+ },
+ "missing": {
+ "module": 204,
+ "class": 273,
+ "def": 1489
+ }
+ },
+ {
+ "folder": "micropython-v1_15-pyboard",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_15-pyboard",
+ "version": "1.15",
+ "port": "pyboard",
+ "module": 0.52,
+ "class": 0.77,
+ "def": 0.11,
+ "counts": {
+ "def": 2448,
+ "class": 684,
+ "module": 116
+ },
+ "missing": {
+ "module": 56,
+ "class": 155,
+ "def": 2184
+ }
+ },
+ {
+ "folder": "micropython-v1_16-docstubs",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-docstubs",
+ "version": "1.16",
+ "port": "docstubs",
+ "module": 1.0,
+ "class": 1.0,
+ "def": 1.0,
+ "counts": {
+ "def": 0,
+ "class": 0,
+ "module": 0
+ },
+ "missing": {
+ "module": 0,
+ "class": 0,
+ "def": 0
+ }
+ },
+ {
+ "folder": "micropython-v1_16-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-esp32",
+ "version": "1.16",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.6,
+ "def": 0.11,
+ "counts": {
+ "def": 2094,
+ "class": 379,
+ "module": 150
+ },
+ "missing": {
+ "module": 72,
+ "class": 150,
+ "def": 1854
+ }
+ },
+ {
+ "folder": "micropython-v1_16-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-esp8266",
+ "version": "1.16",
+ "port": "esp8266",
+ "module": 0.51,
+ "class": 0.61,
+ "def": 0.11,
+ "counts": {
+ "def": 2021,
+ "class": 360,
+ "module": 149
+ },
+ "missing": {
+ "module": 73,
+ "class": 141,
+ "def": 1799
+ }
+ },
+ {
+ "folder": "micropython-v1_16-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-frozen",
+ "version": "1.16",
+ "port": "frozen",
+ "module": 0.17,
+ "class": 0.17,
+ "def": 0.32,
+ "counts": {
+ "def": 3692,
+ "class": 580,
+ "module": 440
+ },
+ "missing": {
+ "module": 365,
+ "class": 479,
+ "def": 2502
+ }
+ },
+ {
+ "folder": "micropython-v1_16-pyboard",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_16-pyboard",
+ "version": "1.16",
+ "port": "pyboard",
+ "module": 0.52,
+ "class": 0.78,
+ "def": 0.11,
+ "counts": {
+ "def": 2450,
+ "class": 689,
+ "module": 116
+ },
+ "missing": {
+ "module": 56,
+ "class": 155,
+ "def": 2186
+ }
+ },
+ {
+ "folder": "micropython-v1_17-docstubs",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-docstubs",
+ "version": "1.17",
+ "port": "docstubs",
+ "module": 1.0,
+ "class": 0.95,
+ "def": 0.97,
+ "counts": {
+ "def": 771,
+ "class": 107,
+ "module": 47
+ },
+ "missing": {
+ "module": 0,
+ "class": 5,
+ "def": 25
+ }
+ },
+ {
+ "folder": "micropython-v1_17-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-esp32",
+ "version": "1.17",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.6,
+ "def": 0.11,
+ "counts": {
+ "def": 2108,
+ "class": 381,
+ "module": 150
+ },
+ "missing": {
+ "module": 72,
+ "class": 151,
+ "def": 1866
+ }
+ },
+ {
+ "folder": "micropython-v1_17-esp32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-esp32-merged",
+ "version": "1.17",
+ "port": "esp32",
+ "module": 0.83,
+ "class": 0.83,
+ "def": 0.51,
+ "counts": {
+ "def": 1796,
+ "class": 325,
+ "module": 148
+ },
+ "missing": {
+ "module": 25,
+ "class": 54,
+ "def": 878
+ }
+ },
+ {
+ "folder": "micropython-v1_17-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-esp8266",
+ "version": "1.17",
+ "port": "esp8266",
+ "module": 0.51,
+ "class": 0.61,
+ "def": 0.11,
+ "counts": {
+ "def": 2021,
+ "class": 360,
+ "module": 149
+ },
+ "missing": {
+ "module": 73,
+ "class": 141,
+ "def": 1799
+ }
+ },
+ {
+ "folder": "micropython-v1_17-esp8266-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-esp8266-merged",
+ "version": "1.17",
+ "port": "esp8266",
+ "module": 0.8,
+ "class": 0.82,
+ "def": 0.44,
+ "counts": {
+ "def": 1729,
+ "class": 297,
+ "module": 147
+ },
+ "missing": {
+ "module": 29,
+ "class": 53,
+ "def": 971
+ }
+ },
+ {
+ "folder": "micropython-v1_17-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-frozen",
+ "version": "1.17",
+ "port": "frozen",
+ "module": 0.29,
+ "class": 0.31,
+ "def": 0.4,
+ "counts": {
+ "def": 1800,
+ "class": 294,
+ "module": 214
+ },
+ "missing": {
+ "module": 153,
+ "class": 202,
+ "def": 1072
+ }
+ },
+ {
+ "folder": "micropython-v1_17-rp2",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-rp2",
+ "version": "1.17",
+ "port": "rp2",
+ "module": 0.53,
+ "class": 0.61,
+ "def": 0.03,
+ "counts": {
+ "def": 1522,
+ "class": 317,
+ "module": 102
+ },
+ "missing": {
+ "module": 48,
+ "class": 123,
+ "def": 1480
+ }
+ },
+ {
+ "folder": "micropython-v1_17-rp2-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-rp2-merged",
+ "version": "1.17",
+ "port": "rp2",
+ "module": 0.86,
+ "class": 0.84,
+ "def": 0.43,
+ "counts": {
+ "def": 1244,
+ "class": 248,
+ "module": 100
+ },
+ "missing": {
+ "module": 14,
+ "class": 39,
+ "def": 712
+ }
+ },
+ {
+ "folder": "micropython-v1_17-stm32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-stm32",
+ "version": "1.17",
+ "port": "stm32",
+ "module": 0.53,
+ "class": 0.77,
+ "def": 0.11,
+ "counts": {
+ "def": 2500,
+ "class": 695,
+ "module": 118
+ },
+ "missing": {
+ "module": 56,
+ "class": 158,
+ "def": 2230
+ }
+ },
+ {
+ "folder": "micropython-v1_17-stm32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_17-stm32-merged",
+ "version": "1.17",
+ "port": "stm32",
+ "module": 0.88,
+ "class": 0.93,
+ "def": 0.6,
+ "counts": {
+ "def": 2176,
+ "class": 629,
+ "module": 116
+ },
+ "missing": {
+ "module": 14,
+ "class": 41,
+ "def": 872
+ }
+ },
+ {
+ "folder": "micropython-v1_18-docstubs",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-docstubs",
+ "version": "1.18",
+ "port": "docstubs",
+ "module": 1.0,
+ "class": 0.95,
+ "def": 0.97,
+ "counts": {
+ "def": 784,
+ "class": 107,
+ "module": 49
+ },
+ "missing": {
+ "module": 0,
+ "class": 5,
+ "def": 25
+ }
+ },
+ {
+ "folder": "micropython-v1_18-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-esp32",
+ "version": "1.18",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.6,
+ "def": 0.11,
+ "counts": {
+ "def": 2120,
+ "class": 381,
+ "module": 152
+ },
+ "missing": {
+ "module": 73,
+ "class": 151,
+ "def": 1878
+ }
+ },
+ {
+ "folder": "micropython-v1_18-esp32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-esp32-merged",
+ "version": "1.18",
+ "port": "esp32",
+ "module": 0.84,
+ "class": 0.84,
+ "def": 0.53,
+ "counts": {
+ "def": 1810,
+ "class": 329,
+ "module": 150
+ },
+ "missing": {
+ "module": 24,
+ "class": 54,
+ "def": 856
+ }
+ },
+ {
+ "folder": "micropython-v1_18-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-esp8266",
+ "version": "1.18",
+ "port": "esp8266",
+ "module": 0.51,
+ "class": 0.61,
+ "def": 0.11,
+ "counts": {
+ "def": 2021,
+ "class": 360,
+ "module": 149
+ },
+ "missing": {
+ "module": 73,
+ "class": 141,
+ "def": 1799
+ }
+ },
+ {
+ "folder": "micropython-v1_18-esp8266-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-esp8266-merged",
+ "version": "1.18",
+ "port": "esp8266",
+ "module": 0.82,
+ "class": 0.82,
+ "def": 0.44,
+ "counts": {
+ "def": 1731,
+ "class": 297,
+ "module": 147
+ },
+ "missing": {
+ "module": 27,
+ "class": 53,
+ "def": 963
+ }
+ },
+ {
+ "folder": "micropython-v1_18-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-frozen",
+ "version": "1.18",
+ "port": "frozen",
+ "module": 0.29,
+ "class": 0.31,
+ "def": 0.43,
+ "counts": {
+ "def": 2692,
+ "class": 457,
+ "module": 319
+ },
+ "missing": {
+ "module": 226,
+ "class": 317,
+ "def": 1547
+ }
+ },
+ {
+ "folder": "micropython-v1_18-rp2",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-rp2",
+ "version": "1.18",
+ "port": "rp2",
+ "module": 0.53,
+ "class": 0.6,
+ "def": 0.11,
+ "counts": {
+ "def": 1974,
+ "class": 349,
+ "module": 120
+ },
+ "missing": {
+ "module": 56,
+ "class": 139,
+ "def": 1750
+ }
+ },
+ {
+ "folder": "micropython-v1_18-rp2-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-rp2-merged",
+ "version": "1.18",
+ "port": "rp2",
+ "module": 0.9,
+ "class": 0.84,
+ "def": 0.54,
+ "counts": {
+ "def": 1644,
+ "class": 288,
+ "module": 118
+ },
+ "missing": {
+ "module": 12,
+ "class": 45,
+ "def": 756
+ }
+ },
+ {
+ "folder": "micropython-v1_18-stm32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-stm32",
+ "version": "1.18",
+ "port": "stm32",
+ "module": 0.53,
+ "class": 0.83,
+ "def": 0.1,
+ "counts": {
+ "def": 1996,
+ "class": 571,
+ "module": 114
+ },
+ "missing": {
+ "module": 54,
+ "class": 97,
+ "def": 1800
+ }
+ },
+ {
+ "folder": "micropython-v1_18-stm32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_18-stm32-merged",
+ "version": "1.18",
+ "port": "stm32",
+ "module": 0.89,
+ "class": 0.94,
+ "def": 0.65,
+ "counts": {
+ "def": 2028,
+ "class": 599,
+ "module": 114
+ },
+ "missing": {
+ "module": 13,
+ "class": 38,
+ "def": 712
+ }
+ },
+ {
+ "folder": "micropython-v1_19-docstubs",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-docstubs",
+ "version": "1.19",
+ "port": "docstubs",
+ "module": 1.0,
+ "class": 0.95,
+ "def": 0.97,
+ "counts": {
+ "def": 813,
+ "class": 109,
+ "module": 50
+ },
+ "missing": {
+ "module": 0,
+ "class": 5,
+ "def": 25
+ }
+ },
+ {
+ "folder": "micropython-v1_19-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19-frozen",
+ "version": "1.19",
+ "port": "frozen",
+ "module": 0.31,
+ "class": 0.35,
+ "def": 0.45,
+ "counts": {
+ "def": 4146,
+ "class": 721,
+ "module": 473
+ },
+ "missing": {
+ "module": 325,
+ "class": 468,
+ "def": 2299
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-docstubs",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-docstubs",
+ "version": "1.19.1",
+ "port": "docstubs",
+ "module": 1.0,
+ "class": 0.95,
+ "def": 0.97,
+ "counts": {
+ "def": 813,
+ "class": 109,
+ "module": 50
+ },
+ "missing": {
+ "module": 0,
+ "class": 5,
+ "def": 25
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-esp32",
+ "version": "1.19.1",
+ "port": "esp32",
+ "module": 0.51,
+ "class": 0.21,
+ "def": 0.1,
+ "counts": {
+ "def": 1890,
+ "class": 260,
+ "module": 152
+ },
+ "missing": {
+ "module": 74,
+ "class": 205,
+ "def": 1694
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-esp32-merged",
+ "version": "1.19.1",
+ "port": "esp32",
+ "module": 0.84,
+ "class": 0.73,
+ "def": 0.58,
+ "counts": {
+ "def": 1934,
+ "class": 305,
+ "module": 150
+ },
+ "missing": {
+ "module": 24,
+ "class": 82,
+ "def": 806
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp32-s3",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-esp32-s3",
+ "version": "1.19.1",
+ "port": "esp32",
+ "module": 1.0,
+ "class": 0.33,
+ "def": 0.11,
+ "counts": {
+ "def": 1027,
+ "class": 167,
+ "module": 75
+ },
+ "missing": {
+ "module": 0,
+ "class": 112,
+ "def": 919
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp32-S3-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-esp32-S3-merged",
+ "version": "1.19.1",
+ "port": "esp32",
+ "module": 1.0,
+ "class": 0.79,
+ "def": 0.59,
+ "counts": {
+ "def": 974,
+ "class": 178,
+ "module": 74
+ },
+ "missing": {
+ "module": 0,
+ "class": 37,
+ "def": 396
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp32-UM_TINYPICO",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-esp32-UM_TINYPICO",
+ "version": "1.19.1",
+ "port": "esp32",
+ "module": 0.91,
+ "class": 0.87,
+ "def": 0.12,
+ "counts": {
+ "def": 1021,
+ "class": 213,
+ "module": 79
+ },
+ "missing": {
+ "module": 7,
+ "class": 28,
+ "def": 898
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp32-UM_TINYPICO-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-esp32-UM_TINYPICO-merged",
+ "version": "1.19.1",
+ "port": "esp32",
+ "module": 0.91,
+ "class": 0.88,
+ "def": 0.56,
+ "counts": {
+ "def": 1049,
+ "class": 232,
+ "module": 79
+ },
+ "missing": {
+ "module": 7,
+ "class": 28,
+ "def": 464
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-esp8266",
+ "version": "1.19.1",
+ "port": "esp8266",
+ "module": 0.51,
+ "class": 0.09,
+ "def": 0.1,
+ "counts": {
+ "def": 1368,
+ "class": 148,
+ "module": 118
+ },
+ "missing": {
+ "module": 58,
+ "class": 134,
+ "def": 1236
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp8266-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-esp8266-merged",
+ "version": "1.19.1",
+ "port": "esp8266",
+ "module": 0.89,
+ "class": 0.78,
+ "def": 0.59,
+ "counts": {
+ "def": 1412,
+ "class": 178,
+ "module": 118
+ },
+ "missing": {
+ "module": 13,
+ "class": 40,
+ "def": 572
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-frozen",
+ "version": "1.19.1",
+ "port": "frozen",
+ "module": 0.31,
+ "class": 0.35,
+ "def": 0.45,
+ "counts": {
+ "def": 4146,
+ "class": 721,
+ "module": 473
+ },
+ "missing": {
+ "module": 325,
+ "class": 468,
+ "def": 2299
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-rp2",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-rp2",
+ "version": "1.19.1",
+ "port": "rp2",
+ "module": 0.52,
+ "class": 0.32,
+ "def": 0.12,
+ "counts": {
+ "def": 1992,
+ "class": 373,
+ "module": 142
+ },
+ "missing": {
+ "module": 68,
+ "class": 254,
+ "def": 1758
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-rp2-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-rp2-merged",
+ "version": "1.19.1",
+ "port": "rp2",
+ "module": 0.84,
+ "class": 0.65,
+ "def": 0.54,
+ "counts": {
+ "def": 1974,
+ "class": 395,
+ "module": 140
+ },
+ "missing": {
+ "module": 22,
+ "class": 137,
+ "def": 902
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-rp2_simple",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-rp2_simple",
+ "version": "1.19.1",
+ "port": "rp2_simple",
+ "module": 0.53,
+ "class": 0.26,
+ "def": 0.1,
+ "counts": {
+ "def": 1357,
+ "class": 195,
+ "module": 105
+ },
+ "missing": {
+ "module": 49,
+ "class": 144,
+ "def": 1222
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-stm32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-stm32",
+ "version": "1.19.1",
+ "port": "stm32",
+ "module": 0.51,
+ "class": 0.65,
+ "def": 0.1,
+ "counts": {
+ "def": 2087,
+ "class": 549,
+ "module": 115
+ },
+ "missing": {
+ "module": 56,
+ "class": 194,
+ "def": 1888
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-stm32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_19_1-stm32-merged",
+ "version": "1.19.1",
+ "port": "stm32",
+ "module": 0.89,
+ "class": 0.9,
+ "def": 0.64,
+ "counts": {
+ "def": 2088,
+ "class": 573,
+ "module": 114
+ },
+ "missing": {
+ "module": 12,
+ "class": 60,
+ "def": 754
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-docstubs",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-docstubs",
+ "version": "1.20.0",
+ "port": "docstubs",
+ "module": 1.0,
+ "class": 0.95,
+ "def": 0.97,
+ "counts": {
+ "def": 823,
+ "class": 108,
+ "module": 50
+ },
+ "missing": {
+ "module": 0,
+ "class": 5,
+ "def": 24
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-esp32",
+ "version": "1.20.0",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.21,
+ "def": 0.1,
+ "counts": {
+ "def": 1908,
+ "class": 262,
+ "module": 158
+ },
+ "missing": {
+ "module": 76,
+ "class": 206,
+ "def": 1710
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-esp32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-esp32-merged",
+ "version": "1.20.0",
+ "port": "esp32",
+ "module": 0.84,
+ "class": 0.73,
+ "def": 0.61,
+ "counts": {
+ "def": 1966,
+ "class": 306,
+ "module": 158
+ },
+ "missing": {
+ "module": 25,
+ "class": 84,
+ "def": 764
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-esp32-OTA",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-esp32-OTA",
+ "version": "1.20.0",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.21,
+ "def": 0.1,
+ "counts": {
+ "def": 1908,
+ "class": 262,
+ "module": 158
+ },
+ "missing": {
+ "module": 76,
+ "class": 206,
+ "def": 1710
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-esp32-OTA-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-esp32-OTA-merged",
+ "version": "1.20.0",
+ "port": "esp32",
+ "module": 0.84,
+ "class": 0.73,
+ "def": 0.61,
+ "counts": {
+ "def": 1966,
+ "class": 306,
+ "module": 158
+ },
+ "missing": {
+ "module": 25,
+ "class": 84,
+ "def": 764
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-esp32-S3",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-esp32-S3",
+ "version": "1.20.0",
+ "port": "esp32",
+ "module": 0.52,
+ "class": 0.22,
+ "def": 0.1,
+ "counts": {
+ "def": 1896,
+ "class": 263,
+ "module": 156
+ },
+ "missing": {
+ "module": 75,
+ "class": 204,
+ "def": 1700
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-esp32-S3-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-esp32-S3-merged",
+ "version": "1.20.0",
+ "port": "esp32",
+ "module": 0.85,
+ "class": 0.72,
+ "def": 0.61,
+ "counts": {
+ "def": 1944,
+ "class": 303,
+ "module": 156
+ },
+ "missing": {
+ "module": 24,
+ "class": 84,
+ "def": 766
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-frozen",
+ "version": "1.20.0",
+ "port": "frozen",
+ "module": 0.15,
+ "class": 0.15,
+ "def": 0.32,
+ "counts": {
+ "def": 18676,
+ "class": 2959,
+ "module": 2019
+ },
+ "missing": {
+ "module": 1711,
+ "class": 2517,
+ "def": 12774
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-rp2",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.54,
+ "class": 0.52,
+ "def": 0.11,
+ "counts": {
+ "def": 1518,
+ "class": 339,
+ "module": 116
+ },
+ "missing": {
+ "module": 53,
+ "class": 164,
+ "def": 1354
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-rp2-merged",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.91,
+ "class": 0.81,
+ "def": 0.57,
+ "counts": {
+ "def": 1546,
+ "class": 363,
+ "module": 116
+ },
+ "missing": {
+ "module": 11,
+ "class": 69,
+ "def": 660
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-PICO",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-rp2-PICO",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.54,
+ "class": 0.52,
+ "def": 0.11,
+ "counts": {
+ "def": 1518,
+ "class": 339,
+ "module": 116
+ },
+ "missing": {
+ "module": 53,
+ "class": 164,
+ "def": 1354
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-PICO-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-rp2-PICO-merged",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.91,
+ "class": 0.81,
+ "def": 0.57,
+ "counts": {
+ "def": 1546,
+ "class": 363,
+ "module": 116
+ },
+ "missing": {
+ "module": 11,
+ "class": 69,
+ "def": 660
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-PICO_W",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-rp2-PICO_W",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.54,
+ "class": 0.51,
+ "def": 0.1,
+ "counts": {
+ "def": 1748,
+ "class": 365,
+ "module": 138
+ },
+ "missing": {
+ "module": 64,
+ "class": 178,
+ "def": 1570
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-PICO_W-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-rp2-PICO_W-merged",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.88,
+ "class": 0.8,
+ "def": 0.56,
+ "counts": {
+ "def": 1776,
+ "class": 389,
+ "module": 138
+ },
+ "missing": {
+ "module": 17,
+ "class": 77,
+ "def": 780
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-PIMORONI_PICOLIPO_16MB",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-rp2-PIMORONI_PICOLIPO_16MB",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.54,
+ "class": 0.42,
+ "def": 0.11,
+ "counts": {
+ "def": 1518,
+ "class": 285,
+ "module": 116
+ },
+ "missing": {
+ "module": 53,
+ "class": 164,
+ "def": 1354
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-PIMORONI_PICOLIPO_16MB-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-rp2-PIMORONI_PICOLIPO_16MB-merged",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.91,
+ "class": 0.78,
+ "def": 0.57,
+ "counts": {
+ "def": 1546,
+ "class": 309,
+ "module": 116
+ },
+ "missing": {
+ "module": 11,
+ "class": 69,
+ "def": 660
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-ADAFRUIT_FEATHER_M4_EXPRESS",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-samd-ADAFRUIT_FEATHER_M4_EXPRESS",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.52,
+ "class": 0.61,
+ "def": 0.11,
+ "counts": {
+ "def": 1426,
+ "class": 377,
+ "module": 102
+ },
+ "missing": {
+ "module": 49,
+ "class": 148,
+ "def": 1276
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-ADAFRUIT_FEATHER_M4_EXPRESS-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-samd-ADAFRUIT_FEATHER_M4_EXPRESS-merged",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.88,
+ "class": 0.85,
+ "def": 0.56,
+ "counts": {
+ "def": 1454,
+ "class": 401,
+ "module": 102
+ },
+ "missing": {
+ "module": 12,
+ "class": 60,
+ "def": 646
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.52,
+ "class": 0.58,
+ "def": 0.11,
+ "counts": {
+ "def": 1426,
+ "class": 351,
+ "module": 102
+ },
+ "missing": {
+ "module": 49,
+ "class": 148,
+ "def": 1276
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-samd-ADAFRUIT_ITSYBITSY_M4_EXPRESS-merged",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.88,
+ "class": 0.84,
+ "def": 0.56,
+ "counts": {
+ "def": 1454,
+ "class": 375,
+ "module": 102
+ },
+ "missing": {
+ "module": 12,
+ "class": 60,
+ "def": 646
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-MINISAM_M4",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-samd-MINISAM_M4",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.52,
+ "class": 0.56,
+ "def": 0.11,
+ "counts": {
+ "def": 1426,
+ "class": 333,
+ "module": 102
+ },
+ "missing": {
+ "module": 49,
+ "class": 148,
+ "def": 1276
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-MINISAM_M4-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-samd-MINISAM_M4-merged",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.88,
+ "class": 0.83,
+ "def": 0.56,
+ "counts": {
+ "def": 1454,
+ "class": 357,
+ "module": 102
+ },
+ "missing": {
+ "module": 12,
+ "class": 60,
+ "def": 646
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-SEEED_WIO_TERMINAL",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-samd-SEEED_WIO_TERMINAL",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.52,
+ "class": 0.71,
+ "def": 0.11,
+ "counts": {
+ "def": 1426,
+ "class": 519,
+ "module": 102
+ },
+ "missing": {
+ "module": 49,
+ "class": 148,
+ "def": 1276
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-SEEED_WIO_TERMINAL-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-samd-SEEED_WIO_TERMINAL-merged",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.88,
+ "class": 0.89,
+ "def": 0.56,
+ "counts": {
+ "def": 1454,
+ "class": 543,
+ "module": 102
+ },
+ "missing": {
+ "module": 12,
+ "class": 60,
+ "def": 646
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-stm32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-stm32",
+ "version": "1.20.0",
+ "port": "stm32",
+ "module": 0.53,
+ "class": 0.66,
+ "def": 0.09,
+ "counts": {
+ "def": 2034,
+ "class": 539,
+ "module": 118
+ },
+ "missing": {
+ "module": 56,
+ "class": 184,
+ "def": 1844
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-stm32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-stm32-merged",
+ "version": "1.20.0",
+ "port": "stm32",
+ "module": 0.9,
+ "class": 0.9,
+ "def": 0.65,
+ "counts": {
+ "def": 2066,
+ "class": 563,
+ "module": 118
+ },
+ "missing": {
+ "module": 12,
+ "class": 58,
+ "def": 720
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-stm32-PYBV11",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-stm32-PYBV11",
+ "version": "1.20.0",
+ "port": "stm32",
+ "module": 0.53,
+ "class": 0.66,
+ "def": 0.09,
+ "counts": {
+ "def": 2034,
+ "class": 539,
+ "module": 118
+ },
+ "missing": {
+ "module": 56,
+ "class": 184,
+ "def": 1844
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-stm32-PYBV11-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_20_0-stm32-PYBV11-merged",
+ "version": "1.20.0",
+ "port": "stm32",
+ "module": 0.9,
+ "class": 0.9,
+ "def": 0.65,
+ "counts": {
+ "def": 2066,
+ "class": 563,
+ "module": 118
+ },
+ "missing": {
+ "module": 12,
+ "class": 58,
+ "def": 720
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-docstubs",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-docstubs",
+ "version": "1.21.0",
+ "port": "docstubs",
+ "module": 1.0,
+ "class": 0.96,
+ "def": 0.97,
+ "counts": {
+ "def": 915,
+ "class": 124,
+ "module": 55
+ },
+ "missing": {
+ "module": 0,
+ "class": 5,
+ "def": 24
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-esp32",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-esp32",
+ "version": "1.21.0",
+ "port": "esp32",
+ "module": 0.51,
+ "class": 0.29,
+ "def": 0.1,
+ "counts": {
+ "def": 2220,
+ "class": 339,
+ "module": 179
+ },
+ "missing": {
+ "module": 87,
+ "class": 242,
+ "def": 1988
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-esp32-ESP32_GENERIC",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-esp32-ESP32_GENERIC",
+ "version": "1.21.0",
+ "port": "esp32",
+ "module": 0.51,
+ "class": 0.29,
+ "def": 0.1,
+ "counts": {
+ "def": 2220,
+ "class": 339,
+ "module": 179
+ },
+ "missing": {
+ "module": 87,
+ "class": 242,
+ "def": 1988
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-esp32-ESP32_GENERIC-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-esp32-ESP32_GENERIC-merged",
+ "version": "1.21.0",
+ "port": "esp32",
+ "module": 0.83,
+ "class": 0.7,
+ "def": 0.58,
+ "counts": {
+ "def": 2236,
+ "class": 377,
+ "module": 174
+ },
+ "missing": {
+ "module": 30,
+ "class": 112,
+ "def": 950
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-esp32-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-esp32-merged",
+ "version": "1.21.0",
+ "port": "esp32",
+ "module": 0.83,
+ "class": 0.7,
+ "def": 0.58,
+ "counts": {
+ "def": 2236,
+ "class": 377,
+ "module": 174
+ },
+ "missing": {
+ "module": 30,
+ "class": 112,
+ "def": 950
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-frozen",
+ "version": "1.21.0",
+ "port": "frozen",
+ "module": 0.23,
+ "class": 0.15,
+ "def": 0.36,
+ "counts": {
+ "def": 19937,
+ "class": 2989,
+ "module": 2338
+ },
+ "missing": {
+ "module": 1795,
+ "class": 2554,
+ "def": 12856
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-rp2-RPI_PICO",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-rp2-RPI_PICO",
+ "version": "1.21.0",
+ "port": "rp2",
+ "module": 0.54,
+ "class": 0.53,
+ "def": 0.11,
+ "counts": {
+ "def": 1648,
+ "class": 402,
+ "module": 128
+ },
+ "missing": {
+ "module": 59,
+ "class": 188,
+ "def": 1464
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-rp2-RPI_PICO-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-rp2-RPI_PICO-merged",
+ "version": "1.21.0",
+ "port": "rp2",
+ "module": 0.88,
+ "class": 0.78,
+ "def": 0.55,
+ "counts": {
+ "def": 1676,
+ "class": 424,
+ "module": 128
+ },
+ "missing": {
+ "module": 16,
+ "class": 95,
+ "def": 754
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-rp2-RPI_PICO_W",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-rp2-RPI_PICO_W",
+ "version": "1.21.0",
+ "port": "rp2",
+ "module": 0.53,
+ "class": 0.52,
+ "def": 0.12,
+ "counts": {
+ "def": 2248,
+ "class": 602,
+ "module": 176
+ },
+ "missing": {
+ "module": 83,
+ "class": 286,
+ "def": 1978
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-rp2-RPI_PICO_W-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-rp2-RPI_PICO_W-merged",
+ "version": "1.21.0",
+ "port": "rp2",
+ "module": 0.82,
+ "class": 0.72,
+ "def": 0.52,
+ "counts": {
+ "def": 2276,
+ "class": 628,
+ "module": 174
+ },
+ "missing": {
+ "module": 32,
+ "class": 175,
+ "def": 1088
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-samd-SEEED_WIO_TERMINAL",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-samd-SEEED_WIO_TERMINAL",
+ "version": "1.21.0",
+ "port": "samd",
+ "module": 0.52,
+ "class": 0.72,
+ "def": 0.11,
+ "counts": {
+ "def": 1506,
+ "class": 594,
+ "module": 114
+ },
+ "missing": {
+ "module": 55,
+ "class": 168,
+ "def": 1340
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-samd-SEEED_WIO_TERMINAL-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-samd-SEEED_WIO_TERMINAL-merged",
+ "version": "1.21.0",
+ "port": "samd",
+ "module": 0.85,
+ "class": 0.86,
+ "def": 0.55,
+ "counts": {
+ "def": 1534,
+ "class": 616,
+ "module": 114
+ },
+ "missing": {
+ "module": 17,
+ "class": 86,
+ "def": 688
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-stm32-PYBV11",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-stm32-PYBV11",
+ "version": "1.21.0",
+ "port": "stm32",
+ "module": 0.52,
+ "class": 0.66,
+ "def": 0.1,
+ "counts": {
+ "def": 2146,
+ "class": 600,
+ "module": 124
+ },
+ "missing": {
+ "module": 60,
+ "class": 206,
+ "def": 1938
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-stm32-PYBV11-merged",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_21_0-stm32-PYBV11-merged",
+ "version": "1.21.0",
+ "port": "stm32",
+ "module": 0.88,
+ "class": 0.87,
+ "def": 0.63,
+ "counts": {
+ "def": 2178,
+ "class": 622,
+ "module": 124
+ },
+ "missing": {
+ "module": 15,
+ "class": 82,
+ "def": 806
+ }
+ },
+ {
+ "folder": "micropython-v1_9_3-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_9_3-esp8266",
+ "version": "1.9.3",
+ "port": "esp8266",
+ "module": 0.51,
+ "class": 0.58,
+ "def": 0.01,
+ "counts": {
+ "def": 1112,
+ "class": 182,
+ "module": 117
+ },
+ "missing": {
+ "module": 57,
+ "class": 76,
+ "def": 1100
+ }
+ },
+ {
+ "folder": "micropython-v1_9_3-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_9_3-frozen",
+ "version": "1.9.3",
+ "port": "frozen",
+ "module": 0.05,
+ "class": 0.0,
+ "def": 0.16,
+ "counts": {
+ "def": 363,
+ "class": 40,
+ "module": 40
+ },
+ "missing": {
+ "module": 38,
+ "class": 40,
+ "def": 306
+ }
+ },
+ {
+ "folder": "micropython-v1_9_4-esp8266",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_9_4-esp8266",
+ "version": "1.9.4",
+ "port": "esp8266",
+ "module": 0.52,
+ "class": 0.5,
+ "def": 0.02,
+ "counts": {
+ "def": 642,
+ "class": 104,
+ "module": 119
+ },
+ "missing": {
+ "module": 57,
+ "class": 52,
+ "def": 630
+ }
+ },
+ {
+ "folder": "micropython-v1_9_4-frozen",
+ "path": "..\\repos\\micropython-stubs\\stubs\\micropython-v1_9_4-frozen",
+ "version": "1.9.4",
+ "port": "frozen",
+ "module": 0.05,
+ "class": 0.0,
+ "def": 0.17,
+ "counts": {
+ "def": 571,
+ "class": 82,
+ "module": 74
+ },
+ "missing": {
+ "module": 70,
+ "class": 82,
+ "def": 474
+ }
+ },
+ {
+ "folder": "micropython-latest-esp32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-latest-esp32-stubs",
+ "version": "99.99.99",
+ "port": "esp32",
+ "module": 0.61,
+ "class": 0.59,
+ "def": 0.59,
+ "counts": {
+ "def": 1148,
+ "class": 145,
+ "module": 94
+ },
+ "missing": {
+ "module": 37,
+ "class": 59,
+ "def": 475
+ }
+ },
+ {
+ "folder": "micropython-latest-rp2-pimoroni_picolipo_16mb-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-latest-rp2-pimoroni_picolipo_16mb-stubs",
+ "version": "99.99.99",
+ "port": "rp2",
+ "module": 0.7,
+ "class": 0.55,
+ "def": 0.55,
+ "counts": {
+ "def": 844,
+ "class": 107,
+ "module": 66
+ },
+ "missing": {
+ "module": 20,
+ "class": 48,
+ "def": 377
+ }
+ },
+ {
+ "folder": "micropython-latest-rp2-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-latest-rp2-stubs",
+ "version": "99.99.99",
+ "port": "rp2",
+ "module": 0.7,
+ "class": 0.55,
+ "def": 0.55,
+ "counts": {
+ "def": 844,
+ "class": 107,
+ "module": 66
+ },
+ "missing": {
+ "module": 20,
+ "class": 48,
+ "def": 377
+ }
+ },
+ {
+ "folder": "micropython-latest-samd-adafruit_feather_m4_express-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-latest-samd-adafruit_feather_m4_express-stubs",
+ "version": "99.99.99",
+ "port": "samd",
+ "module": 0.68,
+ "class": 0.58,
+ "def": 0.54,
+ "counts": {
+ "def": 798,
+ "class": 99,
+ "module": 59
+ },
+ "missing": {
+ "module": 19,
+ "class": 42,
+ "def": 368
+ }
+ },
+ {
+ "folder": "micropython-latest-samd-adafruit_itsybitsy_m4_express-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-latest-samd-adafruit_itsybitsy_m4_express-stubs",
+ "version": "99.99.99",
+ "port": "samd",
+ "module": 0.68,
+ "class": 0.58,
+ "def": 0.54,
+ "counts": {
+ "def": 798,
+ "class": 99,
+ "module": 59
+ },
+ "missing": {
+ "module": 19,
+ "class": 42,
+ "def": 368
+ }
+ },
+ {
+ "folder": "micropython-latest-samd-minisam_m4-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-latest-samd-minisam_m4-stubs",
+ "version": "99.99.99",
+ "port": "samd",
+ "module": 0.68,
+ "class": 0.58,
+ "def": 0.54,
+ "counts": {
+ "def": 798,
+ "class": 99,
+ "module": 59
+ },
+ "missing": {
+ "module": 19,
+ "class": 42,
+ "def": 368
+ }
+ },
+ {
+ "folder": "micropython-latest-samd-seeed_wio_terminal-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-latest-samd-seeed_wio_terminal-stubs",
+ "version": "99.99.99",
+ "port": "samd",
+ "module": 0.68,
+ "class": 0.58,
+ "def": 0.54,
+ "counts": {
+ "def": 798,
+ "class": 99,
+ "module": 59
+ },
+ "missing": {
+ "module": 19,
+ "class": 42,
+ "def": 368
+ }
+ },
+ {
+ "folder": "micropython-latest-stm32-pybv11-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-latest-stm32-pybv11-stubs",
+ "version": "99.99.99",
+ "port": "stm32",
+ "module": 0.74,
+ "class": 0.66,
+ "def": 0.64,
+ "counts": {
+ "def": 1104,
+ "class": 119,
+ "module": 66
+ },
+ "missing": {
+ "module": 17,
+ "class": 41,
+ "def": 400
+ }
+ },
+ {
+ "folder": "micropython-latest-stm32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-latest-stm32-stubs",
+ "version": "99.99.99",
+ "port": "stm32",
+ "module": 0.74,
+ "class": 0.66,
+ "def": 0.64,
+ "counts": {
+ "def": 1104,
+ "class": 119,
+ "module": 66
+ },
+ "missing": {
+ "module": 17,
+ "class": 41,
+ "def": 400
+ }
+ },
+ {
+ "folder": "micropython-stdlib-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-stdlib-stubs",
+ "version": "1.0",
+ "port": "stdlib",
+ "module": 1.0,
+ "class": 1.0,
+ "def": 1.0,
+ "counts": {
+ "def": 3625,
+ "class": 658,
+ "module": 63
+ },
+ "missing": {
+ "module": 0,
+ "class": 0,
+ "def": 0
+ }
+ },
+ {
+ "folder": "micropython-v1_17-esp32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_17-esp32-stubs",
+ "version": "1.17",
+ "port": "esp32",
+ "module": 0.62,
+ "class": 0.55,
+ "def": 0.5,
+ "counts": {
+ "def": 953,
+ "class": 132,
+ "module": 80
+ },
+ "missing": {
+ "module": 30,
+ "class": 60,
+ "def": 481
+ }
+ },
+ {
+ "folder": "micropython-v1_17-esp8266-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_17-esp8266-stubs",
+ "version": "1.17",
+ "port": "esp8266",
+ "module": 0.56,
+ "class": 0.5,
+ "def": 0.43,
+ "counts": {
+ "def": 899,
+ "class": 113,
+ "module": 80
+ },
+ "missing": {
+ "module": 35,
+ "class": 57,
+ "def": 512
+ }
+ },
+ {
+ "folder": "micropython-v1_17-rp2-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_17-rp2-stubs",
+ "version": "1.17",
+ "port": "rp2",
+ "module": 0.7,
+ "class": 0.55,
+ "def": 0.42,
+ "counts": {
+ "def": 661,
+ "class": 95,
+ "module": 53
+ },
+ "missing": {
+ "module": 16,
+ "class": 43,
+ "def": 385
+ }
+ },
+ {
+ "folder": "micropython-v1_17-stm32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_17-stm32-stubs",
+ "version": "1.17",
+ "port": "stm32",
+ "module": 0.73,
+ "class": 0.68,
+ "def": 0.59,
+ "counts": {
+ "def": 1111,
+ "class": 136,
+ "module": 60
+ },
+ "missing": {
+ "module": 16,
+ "class": 43,
+ "def": 451
+ }
+ },
+ {
+ "folder": "micropython-v1_18-esp32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_18-esp32-stubs",
+ "version": "1.18",
+ "port": "esp32",
+ "module": 0.64,
+ "class": 0.55,
+ "def": 0.51,
+ "counts": {
+ "def": 960,
+ "class": 134,
+ "module": 81
+ },
+ "missing": {
+ "module": 29,
+ "class": 60,
+ "def": 470
+ }
+ },
+ {
+ "folder": "micropython-v1_18-esp8266-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_18-esp8266-stubs",
+ "version": "1.18",
+ "port": "esp8266",
+ "module": 0.59,
+ "class": 0.5,
+ "def": 0.44,
+ "counts": {
+ "def": 900,
+ "class": 113,
+ "module": 80
+ },
+ "missing": {
+ "module": 33,
+ "class": 57,
+ "def": 508
+ }
+ },
+ {
+ "folder": "micropython-v1_18-rp2-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_18-rp2-stubs",
+ "version": "1.18",
+ "port": "rp2",
+ "module": 0.79,
+ "class": 0.58,
+ "def": 0.54,
+ "counts": {
+ "def": 839,
+ "class": 113,
+ "module": 61
+ },
+ "missing": {
+ "module": 13,
+ "class": 47,
+ "def": 388
+ }
+ },
+ {
+ "folder": "micropython-v1_18-stm32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_18-stm32-stubs",
+ "version": "1.18",
+ "port": "stm32",
+ "module": 0.75,
+ "class": 0.67,
+ "def": 0.64,
+ "counts": {
+ "def": 1037,
+ "class": 121,
+ "module": 59
+ },
+ "missing": {
+ "module": 15,
+ "class": 40,
+ "def": 371
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp32-s3-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-esp32-s3-stubs",
+ "version": "1.19.1",
+ "port": "esp32",
+ "module": 0.81,
+ "class": 0.77,
+ "def": 0.62,
+ "counts": {
+ "def": 1007,
+ "class": 142,
+ "module": 80
+ },
+ "missing": {
+ "module": 15,
+ "class": 33,
+ "def": 381
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-esp32-stubs",
+ "version": "1.19.1",
+ "port": "esp32",
+ "module": 0.64,
+ "class": 0.65,
+ "def": 0.57,
+ "counts": {
+ "def": 1020,
+ "class": 133,
+ "module": 81
+ },
+ "missing": {
+ "module": 29,
+ "class": 47,
+ "def": 443
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp32-um_tinypico-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-esp32-um_tinypico-stubs",
+ "version": "1.19.1",
+ "port": "esp32",
+ "module": 0.63,
+ "class": 0.65,
+ "def": 0.57,
+ "counts": {
+ "def": 1038,
+ "class": 134,
+ "module": 83
+ },
+ "missing": {
+ "module": 31,
+ "class": 47,
+ "def": 443
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-esp8266-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-esp8266-stubs",
+ "version": "1.19.1",
+ "port": "esp8266",
+ "module": 0.71,
+ "class": 0.72,
+ "def": 0.58,
+ "counts": {
+ "def": 739,
+ "class": 85,
+ "module": 65
+ },
+ "missing": {
+ "module": 19,
+ "class": 24,
+ "def": 311
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-rp2-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-rp2-stubs",
+ "version": "1.19.1",
+ "port": "rp2",
+ "module": 0.68,
+ "class": 0.5,
+ "def": 0.54,
+ "counts": {
+ "def": 1003,
+ "class": 142,
+ "module": 73
+ },
+ "missing": {
+ "module": 23,
+ "class": 71,
+ "def": 460
+ }
+ },
+ {
+ "folder": "micropython-v1_19_1-stm32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_19_1-stm32-stubs",
+ "version": "1.19.1",
+ "port": "stm32",
+ "module": 0.76,
+ "class": 0.73,
+ "def": 0.63,
+ "counts": {
+ "def": 1066,
+ "class": 119,
+ "module": 59
+ },
+ "missing": {
+ "module": 14,
+ "class": 32,
+ "def": 391
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-esp32-ota-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-esp32-ota-stubs",
+ "version": "1.20.0",
+ "port": "esp32",
+ "module": 0.64,
+ "class": 0.64,
+ "def": 0.61,
+ "counts": {
+ "def": 1041,
+ "class": 130,
+ "module": 85
+ },
+ "missing": {
+ "module": 31,
+ "class": 47,
+ "def": 410
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-esp32-s3-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-esp32-s3-stubs",
+ "version": "1.20.0",
+ "port": "esp32",
+ "module": 0.64,
+ "class": 0.65,
+ "def": 0.61,
+ "counts": {
+ "def": 1011,
+ "class": 124,
+ "module": 84
+ },
+ "missing": {
+ "module": 30,
+ "class": 44,
+ "def": 395
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-esp32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-esp32-stubs",
+ "version": "1.20.0",
+ "port": "esp32",
+ "module": 0.64,
+ "class": 0.64,
+ "def": 0.61,
+ "counts": {
+ "def": 1041,
+ "class": 130,
+ "module": 85
+ },
+ "missing": {
+ "module": 31,
+ "class": 47,
+ "def": 410
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-pico-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-rp2-pico-stubs",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.77,
+ "class": 0.65,
+ "def": 0.59,
+ "counts": {
+ "def": 782,
+ "class": 97,
+ "module": 60
+ },
+ "missing": {
+ "module": 14,
+ "class": 34,
+ "def": 324
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-pico_w-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-rp2-pico_w-stubs",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.72,
+ "class": 0.63,
+ "def": 0.57,
+ "counts": {
+ "def": 896,
+ "class": 104,
+ "module": 71
+ },
+ "missing": {
+ "module": 20,
+ "class": 38,
+ "def": 383
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-pimoroni_picolipo_16mb-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-rp2-pimoroni_picolipo_16mb-stubs",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.77,
+ "class": 0.65,
+ "def": 0.59,
+ "counts": {
+ "def": 782,
+ "class": 97,
+ "module": 60
+ },
+ "missing": {
+ "module": 14,
+ "class": 34,
+ "def": 324
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-rp2-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-rp2-stubs",
+ "version": "1.20.0",
+ "port": "rp2",
+ "module": 0.77,
+ "class": 0.65,
+ "def": 0.59,
+ "counts": {
+ "def": 782,
+ "class": 97,
+ "module": 60
+ },
+ "missing": {
+ "module": 14,
+ "class": 34,
+ "def": 324
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-adafruit_feather_m4_express-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-samd-adafruit_feather_m4_express-stubs",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.75,
+ "class": 0.69,
+ "def": 0.57,
+ "counts": {
+ "def": 736,
+ "class": 89,
+ "module": 53
+ },
+ "missing": {
+ "module": 13,
+ "class": 28,
+ "def": 315
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-adafruit_itsybitsy_m4_express-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-samd-adafruit_itsybitsy_m4_express-stubs",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.75,
+ "class": 0.69,
+ "def": 0.57,
+ "counts": {
+ "def": 736,
+ "class": 89,
+ "module": 53
+ },
+ "missing": {
+ "module": 13,
+ "class": 28,
+ "def": 315
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-minisam_m4-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-samd-minisam_m4-stubs",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.75,
+ "class": 0.69,
+ "def": 0.57,
+ "counts": {
+ "def": 736,
+ "class": 89,
+ "module": 53
+ },
+ "missing": {
+ "module": 13,
+ "class": 28,
+ "def": 315
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-samd-seeed_wio_terminal-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-samd-seeed_wio_terminal-stubs",
+ "version": "1.20.0",
+ "port": "samd",
+ "module": 0.75,
+ "class": 0.69,
+ "def": 0.57,
+ "counts": {
+ "def": 736,
+ "class": 89,
+ "module": 53
+ },
+ "missing": {
+ "module": 13,
+ "class": 28,
+ "def": 315
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-stm32-pybv11-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-stm32-pybv11-stubs",
+ "version": "1.20.0",
+ "port": "stm32",
+ "module": 0.77,
+ "class": 0.75,
+ "def": 0.66,
+ "counts": {
+ "def": 1043,
+ "class": 109,
+ "module": 61
+ },
+ "missing": {
+ "module": 14,
+ "class": 27,
+ "def": 353
+ }
+ },
+ {
+ "folder": "micropython-v1_20_0-stm32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_20_0-stm32-stubs",
+ "version": "1.20.0",
+ "port": "stm32",
+ "module": 0.77,
+ "class": 0.75,
+ "def": 0.66,
+ "counts": {
+ "def": 1043,
+ "class": 109,
+ "module": 61
+ },
+ "missing": {
+ "module": 14,
+ "class": 27,
+ "def": 353
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-esp32-esp32_generic-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_21_0-esp32-esp32_generic-stubs",
+ "version": "1.21.0",
+ "port": "esp32",
+ "module": 0.64,
+ "class": 0.6,
+ "def": 0.59,
+ "counts": {
+ "def": 1150,
+ "class": 145,
+ "module": 94
+ },
+ "missing": {
+ "module": 34,
+ "class": 58,
+ "def": 471
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-esp32-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_21_0-esp32-stubs",
+ "version": "1.21.0",
+ "port": "esp32",
+ "module": 0.64,
+ "class": 0.6,
+ "def": 0.59,
+ "counts": {
+ "def": 1150,
+ "class": 145,
+ "module": 94
+ },
+ "missing": {
+ "module": 34,
+ "class": 58,
+ "def": 471
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-rp2-rpi_pico-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_21_0-rp2-rpi_pico-stubs",
+ "version": "1.21.0",
+ "port": "rp2",
+ "module": 0.76,
+ "class": 0.58,
+ "def": 0.58,
+ "counts": {
+ "def": 838,
+ "class": 106,
+ "module": 67
+ },
+ "missing": {
+ "module": 16,
+ "class": 44,
+ "def": 356
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-rp2-rpi_pico_w-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_21_0-rp2-rpi_pico_w-stubs",
+ "version": "1.21.0",
+ "port": "rp2",
+ "module": 0.62,
+ "class": 0.51,
+ "def": 0.58,
+ "counts": {
+ "def": 1170,
+ "class": 142,
+ "module": 93
+ },
+ "missing": {
+ "module": 35,
+ "class": 69,
+ "def": 492
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-samd-seeed_wio_terminal-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_21_0-samd-seeed_wio_terminal-stubs",
+ "version": "1.21.0",
+ "port": "samd",
+ "module": 0.72,
+ "class": 0.59,
+ "def": 0.58,
+ "counts": {
+ "def": 766,
+ "class": 96,
+ "module": 60
+ },
+ "missing": {
+ "module": 17,
+ "class": 39,
+ "def": 325
+ }
+ },
+ {
+ "folder": "micropython-v1_21_0-stm32-pybv11-stubs",
+ "path": "..\\repos\\micropython-stubs\\publish\\micropython-v1_21_0-stm32-pybv11-stubs",
+ "version": "1.21.0",
+ "port": "stm32",
+ "module": 0.77,
+ "class": 0.68,
+ "def": 0.65,
+ "counts": {
+ "def": 1089,
+ "class": 117,
+ "module": 64
+ },
+ "missing": {
+ "module": 15,
+ "class": 37,
+ "def": 385
+ }
+ }
+]
\ No newline at end of file
diff --git a/snippets/check_rp2/check_rp2/check_country.py b/snippets/check_rp2/check_rp2/check_country.py
new file mode 100644
index 00000000..c06ecb98
--- /dev/null
+++ b/snippets/check_rp2/check_rp2/check_country.py
@@ -0,0 +1,8 @@
+import rp2
+
+#todo: https://github.com/Josverl/micropython-stubber/issues/335
+rp2.country('NL') # stubs-ignore: board not in ["pico_w"]
+
+
+
+
diff --git a/snippets/feat_micropython/check_bare_const.py b/snippets/feat_micropython/check_bare_const.py
index 37714e3d..05f16e97 100644
--- a/snippets/feat_micropython/check_bare_const.py
+++ b/snippets/feat_micropython/check_bare_const.py
@@ -1,6 +1,6 @@
-# below is valid micropython, but not OK for static type checking
+"""Check const() without importing it from micropython."""
# # ref https://github.dev/microsoft/pyright/blob/3cc4e6ccdde06315f5682d9cf61c51ce6fac2753/docs/builtins.md#L7
+# OK: pyright 1.1.218 can handle this
-# OK: pyright 1.1.218 should be able to handle this
-
-FOO = const(11) # type: ignore # TODO #PYRIGHT: - const without import - Pylance should be able to handle this
+FOO = const(11) # type: ignore
+# false test outcome : https://github.com/Josverl/micropython-stubber/issues/429
diff --git a/snippets/feat_micropython/check_machine/check_UART.py b/snippets/feat_micropython/check_machine/check_UART.py
new file mode 100644
index 00000000..ac39f7af
--- /dev/null
+++ b/snippets/feat_micropython/check_machine/check_UART.py
@@ -0,0 +1,17 @@
+from typing import Union
+
+from machine import UART, Pin
+from typing_extensions import assert_type
+
+uart = UART(0, 115200)
+uart = UART(0, baudrate=115200, timeout=10, tx=Pin(0), rx=Pin(1))
+
+buffer = bytearray(10)
+
+u = UART(0, 115200)
+
+assert_type(u.readline(), Union[str,None]) # stubs-ignore : skip version < 1.21.0
+
+assert_type(u.readinto(buffer), Union[int,None]) # stubs-ignore : skip version < 1.21.0
+assert_type(u.write(buffer), Union[int,None]) # stubs-ignore : skip version < 1.21.0
+
diff --git a/snippets/feat_micropython/check_micropython/check_asm_thumb.py b/snippets/feat_micropython/check_micropython/check_asm_thumb.py
index 4c1bc35d..3741b69b 100644
--- a/snippets/feat_micropython/check_micropython/check_asm_thumb.py
+++ b/snippets/feat_micropython/check_micropython/check_asm_thumb.py
@@ -1,5 +1,5 @@
# type: ignore
-# todo: micropython.asm_thumb - document thatthe opcodes are note recorgnised
+# todo: micropython.asm_thumb - document that the opcodes are not recognized
# this is similar to the rp2.PIO_asm() method
# flash LED #1 using inline assembler
diff --git a/snippets/feat_stdlib/check_collections/check_ordereddict.py b/snippets/feat_stdlib/check_collections/check_ordereddict.py
index d92e2039..83423e31 100644
--- a/snippets/feat_stdlib/check_collections/check_ordereddict.py
+++ b/snippets/feat_stdlib/check_collections/check_ordereddict.py
@@ -5,7 +5,7 @@
d = OrderedDict([("z", 1), ("a", 2)])
# More items can be added as usual
-d["w"] = 5 # type: ignore
+d["w"] = 5 # type: ignore #TODO: https://github.com/Josverl/micropython-stubber/issues/333
d["b"] = 3 # type: ignore
for k, v in d.items():
print(k, v)
\ No newline at end of file
diff --git a/snippets/readme.md b/snippets/readme.md
index a6fd271f..a863aaec 100644
--- a/snippets/readme.md
+++ b/snippets/readme.md
@@ -1,8 +1,10 @@
# Validation Snippets
This folder contains a collection of code snippets to help validate the quality of the stubs by providing some code to validate.
+Think of this as 'End to End' tests or integration tests for the stubs.
-please read : https://typing.readthedocs.io/en/latest/source/quality.html#testing-using-assert-type-and-warn-unused-ignores
+
+Please read : https://typing.readthedocs.io/en/latest/source/quality.html#testing-using-assert-type-and-warn-unused-ignores
## Usage
@@ -14,9 +16,9 @@ You can update / install the type-stubs in the various typings folders by runnin
```powershell
# Update the type stubs
# , "v1.18.0", "v1.17.0"
-foreach ($version in @( "latest", "v1.20.0", "v1.19.1" )) {
- stubber switch $version
- stubber get-docstubs
+foreach ($version in @( "latest","v1.21.0", "v1.20.0", "v1.19.1" )) {
+ stubber get-docstubs --version $version
+ stubber get-frozen --version $version
stubber merge --version $version --port auto --board auto
stubber build --version $version --port auto --board auto
}
diff --git a/snippets/test-stubs.ps1 b/snippets/test-stubs.ps1
index 99c21b36..8d7e9bda 100644
--- a/snippets/test-stubs.ps1
+++ b/snippets/test-stubs.ps1
@@ -1,157 +1,14 @@
-param(
- $version = "latest",
- [string[]]$ports = @("esp32", "esp8266", "stm32", "rp2", "samd"),
- [switch]$do_docstubs = $False,
- [switch]$do_merge = $False,
- [switch]$do_build = $False
-)
+# Activate the venv
-$flatversion = $version.replace(".", "_")
-#Cascade the build steps
-if ($do_docstubs) {
- $do_merge = $True
-}
-if ($do_merge) {
- $do_build = $True
-}
-
-$snippetsroot = Split-Path -Parent $MyInvocation.MyCommand.Path
-$workplaceroot = Split-Path -Parent ($snippetsroot)
-$stubs_repo = join-path $workplaceroot "repos\micropython-stubs"
-
-$prior_cwd = Get-Location
-cd $workplaceroot
-
-echo "--------------------------------------------------------"
-echo "version: $version"
-echo "flatversion: $flatversion"
-echo "ports: $ports"
-
-if ($do_docstubs) {
- echo "--------------------------------------------------------"
- echo "get-docstubs $version"
- echo "--------------------------------------------------------"
- stubber switch $version
- stubber get-docstubs
- # update micropython-core from recent docstubs
- stubber enrich -s $stubs_repo\stubs\micropython-core -ds $stubs_repo\stubs\micropython-$flatversion-docstubs
-}
+./.venv/bin/activate.ps1
-if ($do_merge ) {
- echo "--------------------------------------------------------"
- echo "merge $version"
- echo "--------------------------------------------------------"
- foreach ($port in $ports) {
- stubber merge --version $version --port $port
- }
+#first update the stubs (local ) do not push updates
+foreach ($version in @( "latest","v1.21.0", "v1.20.0", "v1.19.1" )) {
+ stubber get-docstubs --version $version
+ stubber get-frozen --version $version
+ stubber merge --version $version --port auto --board auto
+ stubber build --version $version --port auto --board auto
}
-
-if ($do_build) {
- echo "--------------------------------------------------------"
- echo "build"
- echo "--------------------------------------------------------"
-
- foreach ($port in $ports) {
- stubber build --version $version --port $port
- }
- # stubber build --version $version --port rp2 --board pico_w
- # stubber publish --test-pypi --version $version --port auto --board um_tinypico --dry-run
-}
-
-
-# first install the typestubs to a local folder so they can be copied from there to save time
-
-foreach ($port in $ports) {
-
- $stub_source = "$stubs_repo\publish\micropython-$flatversion-$port-stubs"
- $typings_cache_dir = "$workplaceroot\snippets\typings_$port"
- echo "--------------------------------------------------------"
- echo "port: $port"
- echo "type cache : $typings_cache_dir"
- echo "--------------------------------------------------------"
-
- rd $typings_cache_dir -r -ea silentlycontinue
- # pip install including pre-releases to get the latest stdlib version
- pip install -I $stub_source --target $typings_cache_dir --no-user --pre
-}
-
-# create a hashtable with feates as a key, and the orts that support it as a lisy
-$features = @{
- "networking" = @("esp32", "esp8266", "rp2-pico-w")
- "bluetooth" = @("esp32")
-}
-
-$results = @()
-foreach ($port in $ports) {
- $stub_source = "$workplaceroot\repos\micropython-stubs\publish\micropython-$flatversion-$port-stubs"
- $typings_cache_dir = "$workplaceroot\snippets\typings_$port"
-
- if (-not (Test-Path $typings_cache_dir)) {
- Write-Warning "The directory '$typings_cache_dir' does not exist."
- continue
- }
-
- foreach ($folder in @($port, "stdlib", "micropython", "networking", "bluetooth")) {
- if ($features.Contains($folder)) {
- if ($port -notin $features[$folder]) {
- # do not check features on ports that do not support it
- # TODO: add boards such as the rp2 pico-W that do support it
- continue
- }
- }
- if ($folder.startswith($port)) {
- $snippets_dir = "$workplaceroot\snippets\check_$folder"
- }
- else {
- $snippets_dir = "$workplaceroot\snippets\feat_$folder"
- }
- $typings_dir = "$snippets_dir\typings"
- echo "--------------------------------------------------------"
- echo "port: $port "
- echo "folder: $folder"
- echo "snippets_dir: $snippets_dir"
- echo "--------------------------------------------------------"
- if (-not (test-path $snippets_dir)) {
- Write-Warning "The directory '$snippets_dir' does not exist."
- continue
- }
-
-
- rd $typings_dir -r -ea silentlycontinue
- # copy typings from the cache to the snippets folder
- Copy-Item $typings_cache_dir $typings_dir -Recurse -Force
-
- # run pyright
- $result = pyright --project $snippets_dir --outputjson | convertfrom-json
- # add $port attribute to result
- Add-Member -InputObject $result.summary -MemberType NoteProperty -Name port -Value $port
- Add-Member -InputObject $result.summary -MemberType NoteProperty -Name folder -Value $folder
-
- foreach ($diag in $result.generalDiagnostics) {
- add-member -InputObject $diag -MemberType NoteProperty -Name port -Value $port
- add-member -InputObject $diag -MemberType NoteProperty -Name folder -Value $folder
- }
- $results += $result
- $result.generalDiagnostics | select port, folder, severity, rule, file, message | ft -Wrap | out-host
- }
-}
-# resore working directory
-cd $prior_cwd
-
-$problems = $results | select -expand generalDiagnostics | ? { $_.severity -eq "error" }
-# Write results to file
-$problems | Export-Csv -Path $snippetsroot\results.csv -NoTypeInformation
-# And to .json
-$results | ConvertTo-Json -Depth 10 | Out-File $snippetsroot\results.json -Force
-
-echo "========================================================"
-if ( $problems.length -eq 0) {
- echo "SUCCESS - No errors found"
-}
-else {
- $problems | select port, folder, severity, rule, file, message | ft -Wrap | out-host
- exit(1)
-}
-echo "========================================================"
-
+#then run the test
+pytest -m 'snippets'
\ No newline at end of file
diff --git a/snippets/test_snippets.py b/snippets/test_snippets.py
index 29402cc4..da945e65 100644
--- a/snippets/test_snippets.py
+++ b/snippets/test_snippets.py
@@ -46,7 +46,7 @@
# "rp2-pimoroni_picolipo_16mb": CORE,
}
-SOURCES = ["local", "pypi"]
+SOURCES = ["local"] # , "pypi"] # do not pull from PyPI all the time
VERSIONS = [
"latest",
"v1.21.0",
@@ -140,6 +140,7 @@ def stub_ignore(line, version, port, board, linter="pyright", is_source=True) ->
id, condition = comment.split(":")
if id.strip() != "stubs-ignore":
return False
+ condition = condition.strip()
else:
condition = line.strip()
if condition.lower().startswith("skip"):
diff --git a/src/OneOff/overview-packets.py b/src/OneOff/overview-packets.py
index d7479822..452eb46f 100644
--- a/src/OneOff/overview-packets.py
+++ b/src/OneOff/overview-packets.py
@@ -2,16 +2,15 @@
# sourcery skip: no-wildcard-imports
from stubber.publish.candidates import *
-
from stubber.publish.package import package_name
# # latest
-# for c in frozen_candidates(boards=GENERIC, versions="auto"):
+# for c in frozen_candidates(boards=GENERIC, versions="all"):
# print(f"{package_name( **c) :50} | {c['port']:10}{c['board']:30} == {c['version']}")
matrix = {}
-# for c in (frozen_candidates(boards=GENERIC, versions="auto")):
-for c in frozen_candidates(boards="auto", versions="auto"):
+# for c in (frozen_candidates(boards=GENERIC, versions="all")):
+for c in frozen_candidates(boards="all", versions="all"):
name = package_name(**c)
if name in matrix:
matrix[name].append(c["version"])
diff --git a/src/stubber/basicgit.py b/src/stubber/basicgit.py
index 1369ddde..50fac729 100644
--- a/src/stubber/basicgit.py
+++ b/src/stubber/basicgit.py
@@ -14,7 +14,11 @@
from packaging.version import parse
# Token with no permissions
-PAT_NO_ACCESS = "github_pat" + "_11AAHPVFQ0IwtAmfc3cD5Z" + "_xOVII22ErRzzZ7xwwxRcNotUu4krMMbjinQcsMxjnWkYFBIDRWFlZMaHSqq"
+PAT_NO_ACCESS = (
+ "github_pat"
+ + "_11AAHPVFQ0IwtAmfc3cD5Z"
+ + "_xOVII22ErRzzZ7xwwxRcNotUu4krMMbjinQcsMxjnWkYFBIDRWFlZMaHSqq"
+)
PAT = os.environ.get("GITHUB_TOKEN") or PAT_NO_ACCESS
GH_CLIENT = Github(PAT)
@@ -31,7 +35,9 @@ def _run_local_git(
if repo:
if isinstance(repo, str):
repo = Path(repo)
- result = subprocess.run(cmd, capture_output=capture_output, check=True, cwd=repo.absolute().as_posix())
+ result = subprocess.run(
+ cmd, capture_output=capture_output, check=True, cwd=repo.absolute().as_posix()
+ )
else:
result = subprocess.run(cmd, capture_output=capture_output, check=True)
except (NotADirectoryError, FileNotFoundError) as e: # pragma: no cover
@@ -42,11 +48,14 @@ def _run_local_git(
return None
if result.stderr and result.stderr != b"":
stderr = result.stderr.decode("utf-8")
+ if "cloning into" in stderr.lower():
+ # log.info(stderr)
+ expect_stderr = True
if "warning" in stderr.lower():
log.warning(stderr)
expect_stderr = True
elif capture_output and echo_output: # pragma: no cover
- log.error(stderr)
+ log.info(stderr)
if not expect_stderr:
raise ChildProcessError(stderr)
@@ -69,7 +78,9 @@ def clone(remote_repo: str, path: Path, shallow: bool = False, tag: Optional[str
return False
-def get_local_tag(repo: Optional[Union[str, Path]] = None, abbreviate: bool = True) -> Union[str, None]:
+def get_local_tag(
+ repo: Optional[Union[str, Path]] = None, abbreviate: bool = True
+) -> Union[str, None]:
"""
get the most recent git version tag of a local repo
repo Path should be in the form of : repo = "./repo/micropython"
@@ -81,7 +92,11 @@ def get_local_tag(repo: Optional[Union[str, Path]] = None, abbreviate: bool = Tr
elif isinstance(repo, str):
repo = Path(repo)
- result = _run_local_git(["git", "describe"], repo=repo.as_posix(), expect_stderr=True)
+ result = _run_local_git(
+ ["git", "describe", "--tags"],
+ repo=repo.as_posix(),
+ expect_stderr=True,
+ )
if not result:
return None
tag: str = result.stdout.decode("utf-8")
@@ -149,13 +164,14 @@ def checkout_tag(tag: str, repo: Optional[Union[str, Path]] = None) -> bool:
return True
-def synch_submodules(repo: Optional[Union[Path, str]] = None) -> bool:
+def sync_submodules(repo: Optional[Union[Path, str]] = None) -> bool:
"""
- make sure any submodules are in syncj
+ make sure any submodules are in sync
"""
cmds = [
["git", "submodule", "sync", "--quiet"],
- ["git", "submodule", "update", "--quiet"],
+ # ["git", "submodule", "update", "--quiet"],
+ ["git", "submodule", "update", "--init", "lib/micropython-lib"],
]
for cmd in cmds:
if result := _run_local_git(cmd, repo=repo, expect_stderr=True):
@@ -176,7 +192,6 @@ def checkout_commit(commit_hash: str, repo: Optional[Union[Path, str]] = None) -
return False
# actually a good result
log.debug(result.stderr.decode("utf-8"))
- synch_submodules(repo)
return True
@@ -194,7 +209,6 @@ def switch_tag(tag: str, repo: Optional[Union[Path, str]] = None) -> bool:
return False
# actually a good result
log.debug(result.stderr.decode("utf-8"))
- synch_submodules(repo)
return True
@@ -211,7 +225,6 @@ def switch_branch(branch: str, repo: Optional[Union[Path, str]] = None) -> bool:
return False
# actually a good result
log.debug(result.stderr.decode("utf-8"))
- synch_submodules(repo)
return True
diff --git a/src/stubber/codemod/enrich.py b/src/stubber/codemod/enrich.py
index 63a7c58f..ceb72939 100644
--- a/src/stubber/codemod/enrich.py
+++ b/src/stubber/codemod/enrich.py
@@ -1,5 +1,5 @@
"""
-Enrich firmware stubs by copying docstrings and parameter infromation from doc-stubs or python source code.
+Enrich firmware stubs by copying docstrings and parameter information from doc-stubs or python source code.
Both (.py or .pyi) files are supported.
"""
@@ -10,7 +10,6 @@
from libcst.tool import _default_config # type: ignore
from loguru import logger as log
-# from stubber.codemod.merge_docstub import MergeCommand
import stubber.codemod.merge_docstub as merge_docstub
from stubber.utils.post import run_black
@@ -20,14 +19,16 @@
#########################################################################################
-def enrich_file(target_path: Path, docstub_path: Path, diff: bool = False, write_back: bool = False) -> Optional[str]:
+def enrich_file(
+ target_path: Path, docstub_path: Path, diff: bool = False, write_back: bool = False
+) -> Optional[str]:
"""
Enrich a firmware stubs using the doc-stubs in another folder.
Both (.py or .pyi) files are supported.
Parameters:
source_path: the path to the firmware stub to enrich
- docstub_path: the path to the folder containg the doc-stubs
+ docstub_path: the path to the folder containing the doc-stubs
diff: if True, return the diff between the original and the enriched source file
write_back: if True, write the enriched source file back to the source_path
@@ -54,18 +55,18 @@ def enrich_file(target_path: Path, docstub_path: Path, diff: bool = False, write
break
else:
docstub_file = None
- if docstub_file is None:
+ if not docstub_file:
raise FileNotFoundError(f"No doc-stub file found for {target_path}")
log.debug(f"Merge {target_path} from {docstub_file}")
# read source file
- oldcode = target_path.read_text()
+ old_code = target_path.read_text()
codemod_instance = merge_docstub.MergeCommand(context, stub_file=docstub_file)
if not (
- newcode := exec_transform_with_prettyprint(
+ new_code := exec_transform_with_prettyprint(
codemod_instance,
- oldcode,
+ old_code,
# include_generated=False,
generated_code_marker=config["generated_code_marker"],
# format_code=not args.no_format,
@@ -77,21 +78,29 @@ def enrich_file(target_path: Path, docstub_path: Path, diff: bool = False, write
if write_back:
log.trace(f"Write back enriched file {target_path}")
# write updated code to file
- target_path.write_text(newcode, encoding="utf-8")
- return diff_code(oldcode, newcode, 5, filename=target_path.name) if diff else newcode
+ target_path.write_text(new_code, encoding="utf-8")
+ return diff_code(old_code, new_code, 5, filename=target_path.name) if diff else new_code
def enrich_folder(
- source_folder: Path, docstub_path: Path, show_diff: bool = False, write_back: bool = False, require_docstub: bool = False
+ source_path: Path,
+ docstub_path: Path,
+ show_diff: bool = False,
+ write_back: bool = False,
+ require_docstub: bool = False,
) -> int:
"""\
Enrich a folder with containing firmware stubs using the doc-stubs in another folder.
Returns the number of files enriched.
"""
+ if not source_path.exists():
+ raise FileNotFoundError(f"Source folder {source_path} does not exist")
+ if not docstub_path.exists():
+ raise FileNotFoundError(f"Docstub folder {docstub_path} does not exist")
count = 0
# list all the .py and .pyi files in the source folder
- source_files = sorted(list(source_folder.rglob("**/*.py")) + list(source_folder.rglob("**/*.pyi")))
+ source_files = sorted(list(source_path.rglob("**/*.py")) + list(source_path.rglob("**/*.pyi")))
for source_file in source_files:
try:
diff = enrich_file(source_file, docstub_path, diff=True, write_back=write_back)
@@ -104,7 +113,7 @@ def enrich_folder(
if require_docstub:
raise (FileNotFoundError(f"No doc-stub file found for {source_file}")) from e
# run black on the destination folder
- # no Autoflake as this removes some relevan (unused) imports
- run_black(source_folder)
+ run_black(source_path)
+ # DO NOT run Autoflake as this removes some relevant (unused) imports
return count
diff --git a/src/stubber/commands/build_cmd.py b/src/stubber/commands/build_cmd.py
index ac94ebde..c0d1d9ce 100644
--- a/src/stubber/commands/build_cmd.py
+++ b/src/stubber/commands/build_cmd.py
@@ -7,7 +7,7 @@
from tabulate import tabulate
from stubber.commands.cli import stubber_cli
-from stubber.publish.package import GENERIC_U
+from stubber.publish.defaults import GENERIC_U
from stubber.publish.publish import build_multiple
from stubber.utils.config import CONFIG
@@ -29,7 +29,7 @@
"-p",
"ports",
multiple=True,
- default=["auto"],
+ default=["all"],
show_default=True,
help="multiple: ",
)
@@ -38,7 +38,7 @@
"-b",
"boards",
multiple=True,
- default=[GENERIC_U], # or "auto" ?
+ default=[GENERIC_U], # or "all" ?
show_default=True,
help="multiple: ",
)
diff --git a/src/stubber/commands/get_docstubs_cmd.py b/src/stubber/commands/get_docstubs_cmd.py
index 352d55b5..dc40d6c7 100644
--- a/src/stubber/commands/get_docstubs_cmd.py
+++ b/src/stubber/commands/get_docstubs_cmd.py
@@ -6,11 +6,13 @@
from pathlib import Path
import click
+from loguru import logger as log
+
import stubber.basicgit as git
import stubber.utils as utils
-from loguru import logger as log
from stubber.stubs_from_docs import generate_from_rst
from stubber.utils.config import CONFIG
+from stubber.utils.repos import fetch_repos
from .cli import stubber_cli
@@ -20,7 +22,13 @@
@stubber_cli.command(name="get-docstubs")
-@click.option("--path", "-p", default=CONFIG.repo_path.as_posix(), type=click.Path(file_okay=False, dir_okay=True), show_default=True)
+@click.option(
+ "--path",
+ "-p",
+ default=CONFIG.repo_path.as_posix(),
+ type=click.Path(file_okay=False, dir_okay=True),
+ show_default=True,
+)
@click.option(
"--stub-path",
"--stub-folder",
@@ -30,7 +38,10 @@
help="Destination of the files to be generated.",
show_default=True,
)
-@click.option("--family", "-f", "basename", default="micropython", help="Micropython family.", show_default=True)
+# @click.option("--family", "-f", "basename", default="micropython", help="Micropython family.", show_default=True)
+@click.option(
+ "--version", "--tag", default="", type=str, help="Version number to use. [default: Git tag]"
+)
@click.option("--black/--no-black", "-b/-nb", default=True, help="Run black", show_default=True)
@click.pass_context
def cli_docstubs(
@@ -39,6 +50,7 @@ def cli_docstubs(
target: str = CONFIG.stub_path.as_posix(),
black: bool = True,
basename: str = "micropython",
+ version: str = "",
):
"""
Build stubs from documentation.
@@ -54,6 +66,13 @@ def cli_docstubs(
rst_path = Path(path) / "docs" / "library"
else:
rst_path = Path(path) # or specify full path
+
+ if version:
+ version = utils.clean_version(version, drop_v=False)
+ result = fetch_repos(version, CONFIG.mpy_path, CONFIG.mpy_lib_path)
+ if not result:
+ return -1
+
v_tag = git.get_local_tag(rst_path.as_posix())
if not v_tag:
# if we can't find a tag , bail
diff --git a/src/stubber/commands/get_frozen_cmd.py b/src/stubber/commands/get_frozen_cmd.py
index e7405611..e94f9650 100644
--- a/src/stubber/commands/get_frozen_cmd.py
+++ b/src/stubber/commands/get_frozen_cmd.py
@@ -6,10 +6,12 @@
from typing import List
import click
+from loguru import logger as log
+
import stubber.basicgit as git
-from stubber.freeze.get_frozen import freeze_any
import stubber.utils as utils
-from loguru import logger as log
+from stubber.codemod.enrich import enrich_folder
+from stubber.freeze.get_frozen import freeze_any
from stubber.utils.config import CONFIG
from stubber.utils.repos import fetch_repos
@@ -26,9 +28,27 @@
type=click.Path(exists=True, file_okay=False, dir_okay=True),
show_default=True,
)
-@click.option("--version", "--tag", default="", type=str, help="Version number to use. [default: Git tag]")
-@click.option("--pyi/--no-pyi", default=True, help="Create .pyi files for the (new) frozen modules", show_default=True)
-@click.option("--black/--no-black", default=True, help="Run black on the (new) frozen modules", show_default=True)
+@click.option(
+ "--version",
+ "--Version",
+ "-V",
+ "version",
+ default="",
+ # default=[CONFIG.stable_version],
+ show_default=True,
+)
+@click.option(
+ "--pyi/--no-pyi",
+ default=True,
+ help="Create .pyi files for the (new) frozen modules",
+ show_default=True,
+)
+@click.option(
+ "--black/--no-black",
+ default=True,
+ help="Run black on the (new) frozen modules",
+ show_default=True,
+)
def cli_get_frozen(
stub_folder: str = CONFIG.stub_path.as_posix(),
# path: str = config.repo_path.as_posix(),
@@ -45,6 +65,7 @@ def cli_get_frozen(
stub_paths: List[Path] = []
if version:
+ version = utils.clean_version(version, drop_v=False)
result = fetch_repos(version, CONFIG.mpy_path, CONFIG.mpy_lib_path)
if not result:
log.error("Failed to fetch repos for version: {} for micropython folder: {} and micropython-lib folder: {}".format(version, CONFIG.mpy_path.as_posix(), CONFIG.mpy_lib_path.as_posix()))
@@ -52,14 +73,40 @@ def cli_get_frozen(
else:
version = utils.clean_version(git.get_local_tag(CONFIG.mpy_path.as_posix()) or "0.0")
if not version:
- log.warning("Unable to find the micropython repo in folder : {}".format(CONFIG.mpy_path.as_posix()))
+ log.warning(
+ "Unable to find the micropython repo in folder : {}".format(CONFIG.mpy_path.as_posix())
+ )
log.info("MicroPython version : {}".format(version))
# folder/{family}-{version}-frozen
family = "micropython"
stub_path = Path(stub_folder) / f"{family}-{utils.clean_version(version, flat=True)}-frozen"
stub_paths.append(stub_path)
- freeze_any(stub_path, version=version, mpy_path=CONFIG.mpy_path, mpy_lib_path=CONFIG.mpy_lib_path)
+ freeze_any(
+ stub_path, version=version, mpy_path=CONFIG.mpy_path, mpy_lib_path=CONFIG.mpy_lib_path
+ )
+ # Also enrich the frozen modules from the doc stubs if available
+
+ # first create .pyi files so they can be enriched
+ utils.do_post_processing(stub_paths, pyi, False)
+ family = "micropython"
+ docstubs_path = (
+ Path(CONFIG.stub_path)
+ / f"{family}-{utils.clean_version(version, drop_v=False, flat=True)}-docstubs"
+ )
+ if docstubs_path.exists():
+ log.info(f"Enriching {str(stub_path)} with {docstubs_path}")
+ if merged := enrich_folder(
+ stub_path,
+ docstubs_path,
+ show_diff=False,
+ write_back=True,
+ require_docstub=False,
+ ):
+ log.info(f"Enriched {merged} frozen modules from docstubs")
+ else:
+ log.info(f"No docstubs found at {docstubs_path}")
+
log.info("::group:: start post processing of retrieved stubs")
- utils.do_post_processing(stub_paths, pyi, black)
+ utils.do_post_processing(stub_paths, False, black)
log.info("::group:: Done")
diff --git a/src/stubber/commands/merge_cmd.py b/src/stubber/commands/merge_cmd.py
index 012d2edb..3186e64d 100644
--- a/src/stubber/commands/merge_cmd.py
+++ b/src/stubber/commands/merge_cmd.py
@@ -5,6 +5,7 @@
import click
from loguru import logger as log
+
from stubber.publish.merge_docstubs import merge_all_docstubs
from stubber.publish.package import GENERIC_L
from stubber.utils.config import CONFIG
@@ -20,7 +21,7 @@
"-V",
"versions",
multiple=True,
- default=["auto"],
+ default=["all"],
# type=click.Choice(ALL_VERSIONS),
show_default=True,
help="'latest', 'auto', or one or more versions",
@@ -30,7 +31,7 @@
"-p",
"ports",
multiple=True,
- default=["auto"],
+ default=["all"],
show_default=True,
help="multiple: ",
)
@@ -39,7 +40,7 @@
"-b",
"boards",
multiple=True,
- default=[GENERIC_L], # or "auto" ?
+ default=[GENERIC_L], # or "all" ?
show_default=True,
help="multiple: ",
)
@@ -60,4 +61,6 @@ def cli_merge_docstubs(
versions = list(versions)
# single version should be a string
log.info(f"Merge docstubs for {family} {versions}")
- _ = merge_all_docstubs(versions=versions, family=family, boards=boards, ports=ports, mpy_path=CONFIG.mpy_path)
+ _ = merge_all_docstubs(
+ versions=versions, family=family, boards=boards, ports=ports, mpy_path=CONFIG.mpy_path
+ )
diff --git a/src/stubber/commands/publish_cmd.py b/src/stubber/commands/publish_cmd.py
index 83f9bff9..58b8ce29 100644
--- a/src/stubber/commands/publish_cmd.py
+++ b/src/stubber/commands/publish_cmd.py
@@ -6,10 +6,11 @@
import click
from loguru import logger as log
+from tabulate import tabulate
+
from stubber.commands.cli import stubber_cli
-from stubber.publish.package import GENERIC_U
+from stubber.publish.defaults import GENERIC_U
from stubber.publish.publish import publish_multiple
-from tabulate import tabulate
from stubber.utils.config import CONFIG
@@ -30,7 +31,7 @@
"-p",
"ports",
multiple=True,
- default=["auto"],
+ default=["all"],
show_default=True,
help="multiple: ",
)
@@ -39,7 +40,7 @@
"-b",
"boards",
multiple=True,
- default=[GENERIC_U], # or "auto" ?
+ default=[GENERIC_U], # or "all" ?
show_default=True,
help="multiple: ",
)
diff --git a/src/stubber/commands/variants_cmd.py b/src/stubber/commands/variants_cmd.py
index ea6c620e..9830be2d 100644
--- a/src/stubber/commands/variants_cmd.py
+++ b/src/stubber/commands/variants_cmd.py
@@ -1,6 +1,5 @@
"""Create all variant of createstubs*.py."""
from pathlib import Path
-from typing import Optional
import click
from loguru import logger as log
diff --git a/src/stubber/freeze/common.py b/src/stubber/freeze/common.py
index c596db8b..d1e2f27d 100644
--- a/src/stubber/freeze/common.py
+++ b/src/stubber/freeze/common.py
@@ -1,4 +1,4 @@
-"""common functions for freeze stub generation"""
+"""common functions for frozen stub generation"""
import re
import shutil
@@ -7,7 +7,7 @@
from loguru import logger as log
-from stubber.publish.package import GENERIC_U
+from stubber.publish.defaults import GENERIC_U
def get_portboard(manifest_path: Path):
diff --git a/src/stubber/freeze/freeze_folder.py b/src/stubber/freeze/freeze_folder.py
index d91dbbfa..cca404cd 100644
--- a/src/stubber/freeze/freeze_folder.py
+++ b/src/stubber/freeze/freeze_folder.py
@@ -25,7 +25,7 @@ def freeze_folders(stub_folder: str, mpy_folder: str, lib_folder: str, version:
- 'ports//modules/*.py'
- 'ports//boards//modules/*.py'
"""
- match_lib_with_mpy(version_tag=version, lib_path=Path(lib_folder))
+ match_lib_with_mpy(version_tag=version, mpy_path=Path(mpy_folder),lib_path=Path(lib_folder))
targets = []
scripts = glob.glob(mpy_folder + "/ports/**/modules/*.py", recursive=True)
diff --git a/src/stubber/freeze/get_frozen.py b/src/stubber/freeze/get_frozen.py
index dac14fef..3120aa89 100644
--- a/src/stubber/freeze/get_frozen.py
+++ b/src/stubber/freeze/get_frozen.py
@@ -54,7 +54,7 @@ def add_comment_to_path(path: Path, comment: str) -> None:
Add a comment to the top of each file in the path
using a codemod
"""
- # todo: #305 add comment line to each file with the micropython version it was generated from
+ #TODO: #305 add comment line to each file with the micropython version it was generated from
# frozen_stub_path
# python -m libcst.tool codemod --include-stubs --no-format add_comment.AddComment .\repos\micropython-stubs\stubs\micropython-v1_19_1-frozen\ --comment "# Micropython 1.19.1 frozen stubs"
pass
diff --git a/src/stubber/publish/candidates.py b/src/stubber/publish/candidates.py
index d3240d1d..0bba10c8 100644
--- a/src/stubber/publish/candidates.py
+++ b/src/stubber/publish/candidates.py
@@ -19,7 +19,7 @@
import stubber.basicgit as git
from stubber.publish.enums import COMBO_STUBS, DOC_STUBS, FIRMWARE_STUBS
-from stubber.publish.package import GENERIC, GENERIC_L, GENERIC_U
+from stubber.publish.defaults import GENERIC, GENERIC_L, GENERIC_U
from stubber.utils.config import CONFIG
from stubber.utils.versions import clean_version, micropython_versions
@@ -38,7 +38,11 @@ def subfolder_names(path: Path):
def version_candidates(
- suffix: str, prefix: str = r".*", *, path: Path = CONFIG.stub_path, oldest: str = OLDEST_VERSION
+ suffix: str,
+ prefix: str = r".*",
+ *,
+ path: Path = CONFIG.stub_path,
+ oldest: str = OLDEST_VERSION,
) -> Generator[str, None, None]:
"get a list of versions for the given family and suffix"
if path.exists():
@@ -91,8 +95,8 @@ def list_micropython_port_boards(
def frozen_candidates(
family: str = "micropython",
versions: Union[str, List[str]] = V_LATEST,
- ports: Union[str, List[str]] = "auto",
- boards: Union[str, List[str]] = "auto",
+ ports: Union[str, List[str]] = "all",
+ boards: Union[str, List[str]] = "all",
*,
path: Path = CONFIG.stub_path,
) -> Generator[Dict[str, Any], None, None]:
@@ -125,7 +129,9 @@ def frozen_candidates(
# lookup the (frozen) micropython ports
ports = list_frozen_ports(family, version, path=path)
else:
- raise NotImplementedError(f"auto ports not implemented for family {family}") # pragma: no cover
+ raise NotImplementedError(
+ f"auto ports not implemented for family {family}"
+ ) # pragma: no cover
# elif family == "pycom":
# ports = ["esp32"]
# elif family == "lobo":
@@ -134,7 +140,13 @@ def frozen_candidates(
for port in ports:
port_path = path / f"{family}-{version}-frozen" / port
if port_path.exists():
- yield {"family": family, "version": version, "port": port, "board": GENERIC_L, "pkg_type": COMBO_STUBS}
+ yield {
+ "family": family,
+ "version": version,
+ "port": port,
+ "board": GENERIC_L,
+ "pkg_type": COMBO_STUBS,
+ }
# if not auto_board:
# for board in boards:
# port_path = board_path/ "board" / board
@@ -152,7 +164,9 @@ def frozen_candidates(
else:
# raise NotImplementedError(f"auto boards not implemented for family {family}") # pragma: no cover
- raise NotImplementedError(f"auto boards not implemented for family {family}") # pragma: no cover
+ raise NotImplementedError(
+ f"auto boards not implemented for family {family}"
+ ) # pragma: no cover
# elif family == "pycom":
# boards = ["wipy", "lopy", "gpy", "fipy"]
# ---------------------------------------------------------------------------
@@ -166,12 +180,21 @@ def frozen_candidates(
"RELEASE",
"GENERIC_512K",
]:
- yield {"family": family, "version": version, "port": port, "board": board, "pkg_type": COMBO_STUBS}
+ yield {
+ "family": family,
+ "version": version,
+ "port": port,
+ "board": board,
+ "pkg_type": COMBO_STUBS,
+ }
def is_auto(thing: Union[None, str, List[str]]):
"Is this version/port/board specified as 'auto' ?"
- return isinstance(thing, str) and thing == "auto" or isinstance(thing, list) and "auto" in thing
+ if isinstance(thing, str):
+ return thing in ["auto", "all"]
+ if isinstance(thing, list):
+ return any(i in ["auto", "all"] for i in thing)
def docstub_candidates(
@@ -182,10 +205,10 @@ def docstub_candidates(
"""
Generate a list of possible documentation stub candidates for the given family and version.
- Note that the folders do not need to exist, with the exeption of auto which will scan the stubs folder for versions of docstubs
+ Note that the folders do not need to exist, with the exception of auto which will scan the stubs folder for versions of docstubs
"""
if isinstance(versions, str):
- if versions == "auto": # auto with vprefix ...
+ if is_auto(versions): # auto with vprefix ...
versions = list(version_candidates(suffix="docstubs", prefix=family, path=path))
else:
versions = [versions]
@@ -196,7 +219,11 @@ def docstub_candidates(
def board_candidates(
- family: str = "micropython", versions: Union[str, List[str]] = V_LATEST, *, mpy_path: Path = CONFIG.mpy_path, pt: str = FIRMWARE_STUBS
+ family: str = "micropython",
+ versions: Union[str, List[str]] = V_LATEST,
+ *,
+ mpy_path: Path = CONFIG.mpy_path,
+ pt: str = FIRMWARE_STUBS,
):
"""
generate a list of possible board stub candidates for the given family and version.
@@ -209,7 +236,7 @@ def board_candidates(
versions = [clean_version(v, flat=False) for v in versions]
for version in versions:
- # check out the micropthon repo for this version
+ # check out the micropython repo for this version
if version in ["latest", "master"]:
r = git.switch_branch(repo=mpy_path, branch="master")
else:
@@ -219,10 +246,22 @@ def board_candidates(
ports = list_micropython_ports(family=family, mpy_path=mpy_path)
for port in ports:
# Yield the generic port exactly one time
- yield {"family": family, "version": version, "port": port, "board": GENERIC_U, "pkg_type": pt}
+ yield {
+ "family": family,
+ "version": version,
+ "port": port,
+ "board": GENERIC_U,
+ "pkg_type": pt,
+ }
for board in list_micropython_port_boards(family=family, mpy_path=mpy_path, port=port):
if board not in GENERIC:
- yield {"family": family, "version": version, "port": port, "board": board, "pkg_type": pt}
+ yield {
+ "family": family,
+ "version": version,
+ "port": port,
+ "board": board,
+ "pkg_type": pt,
+ }
def filter_list(
@@ -241,5 +280,10 @@ def filter_list(
worklist = [i for i in worklist if i["port"].lower() in ports_]
if boards and not is_auto(boards):
boards_ = [i.lower() for i in boards]
- worklist = [i for i in worklist if i["board"].lower() in boards_ or i["board"].lower().replace("generic_", "") in boards_]
+ worklist = [
+ i
+ for i in worklist
+ if i["board"].lower() in boards_
+ or i["board"].lower().replace("generic_", "") in boards_
+ ]
return worklist
diff --git a/src/stubber/publish/defaults.py b/src/stubber/publish/defaults.py
new file mode 100644
index 00000000..dd614fb3
--- /dev/null
+++ b/src/stubber/publish/defaults.py
@@ -0,0 +1,27 @@
+"""Build and packaging defaults for stubber"""
+from typing import Dict
+
+# The default board for the ports modules documented with base name only
+# ESP32-GENERIC is currently hardcoded
+DEFAULT_BOARDS: Dict[str, str] = {
+ "stm32": "PYBV11",
+ "esp32": "GENERIC",
+ "esp8266": "GENERIC",
+ "rp2": "PICO",
+ "samd": "SEEED_WIO_TERMINAL",
+}
+
+GENERIC_L = "generic"
+"generic lowercase"
+GENERIC_U = "GENERIC"
+"GENERIC uppercase"
+GENERIC = {GENERIC_L, GENERIC_U}
+"GENERIC eithercase"
+
+
+def default_board(port: str) -> str: # sourcery skip: assign-if-exp
+ """Return the default board for the given port"""
+ if port in DEFAULT_BOARDS:
+ return DEFAULT_BOARDS[port]
+ else:
+ return GENERIC_U
diff --git a/src/stubber/publish/merge_docstubs.py b/src/stubber/publish/merge_docstubs.py
index 1492ccd7..237368a8 100644
--- a/src/stubber/publish/merge_docstubs.py
+++ b/src/stubber/publish/merge_docstubs.py
@@ -4,45 +4,16 @@
import shutil
from pathlib import Path
-from typing import Dict, List, Optional, Union
+from typing import List, Optional, Union
from loguru import logger as log
from stubber.codemod.enrich import enrich_folder
from stubber.publish.candidates import board_candidates, filter_list
+from stubber.publish.defaults import GENERIC, GENERIC_L, default_board
from stubber.publish.missing_class_methods import add_machine_pin_call
-from stubber.publish.package import GENERIC, GENERIC_L
+from stubber.publish.pathnames import get_base, get_board_path, get_merged_path
from stubber.utils.config import CONFIG
-from stubber.utils.versions import clean_version
-
-## Helper function
-
-
-def get_base(candidate: Dict[str, str], version: Optional[str] = None):
- if not version:
- version = clean_version(candidate["version"], flat=True)
- base = f"{candidate['family']}-{version}"
- return base.lower()
-
-
-def board_folder_name(fw: Dict, *, version: Optional[str] = None):
- """Return the name of the firmware folder. Can be in AnyCase."""
- base = get_base(fw, version=version)
- folder_name = (
- f"{base}-{fw['port']}" if fw["board"] in GENERIC else f"{base}-{fw['port']}-{fw['board']}"
- )
- # do NOT force name to lowercase
- # remove GENERIC Prefix
- folder_name = folder_name.replace("-generic_", "-").replace("-GENERIC_", "-")
- return folder_name
-
-
-def get_board_path(fw: Dict):
- return CONFIG.stub_path / board_folder_name(fw)
-
-
-def get_merged_path(fw: Dict):
- return CONFIG.stub_path / (board_folder_name(fw) + "-merged")
def merge_all_docstubs(
@@ -57,7 +28,7 @@ def merge_all_docstubs(
if versions is None:
versions = [CONFIG.stable_version]
if ports is None:
- ports = ["auto"]
+ ports = ["all"]
if boards is None:
boards = [GENERIC_L]
if isinstance(versions, str):
@@ -76,32 +47,22 @@ def merge_all_docstubs(
log.error("No candidates found")
return
for candidate in candidates:
+ # use the default board for the port
+ if candidate["board"] in GENERIC:
+ candidate["board"] = default_board(candidate["port"])
# check if we have board stubs of this version and port
doc_path = CONFIG.stub_path / f"{get_base(candidate)}-docstubs"
- if not doc_path.exists():
- log.warning(f"No docstubs found for {candidate['version']}")
- continue
# src and dest paths
board_path = get_board_path(candidate)
merged_path = get_merged_path(candidate)
+ # only continue if both folders exist
+ if not doc_path.exists():
+ log.warning(f"No docstubs found for {candidate['version']}")
+ continue
if not board_path.exists():
- log.info(f"no firmware stubs found in {board_path}")
- if candidate["version"] == "latest":
- # for the latest we do a bit more effort to get something 'good enough'
- # try to get the board_path from the last released version as the basis
- board_path = CONFIG.stub_path / board_folder_name(candidate, version="latest")
- # check again
- if board_path.exists():
- log.info(f"using {board_path.name} as the basis for {merged_path.name}")
- else:
- # only continue if both folders exist
- log.debug(f"skipping {merged_path.name}, no firmware stubs found")
- continue
- else:
- # only continue if both folders exist
- log.debug(f"skipping {merged_path.name}, no firmware stubs found")
- continue
+ log.debug(f"skipping {merged_path.name}, no firmware stubs found")
+ continue
log.info(f"Merge docstubs for {merged_path.name} {candidate['version']}")
result = copy_and_merge_docstubs(board_path, merged_path, doc_path)
# Add methods from docstubs to the firmware stubs that do not exist in the firmware stubs
diff --git a/src/stubber/publish/package.py b/src/stubber/publish/package.py
index 07f4a9fc..26865f10 100644
--- a/src/stubber/publish/package.py
+++ b/src/stubber/publish/package.py
@@ -10,24 +10,20 @@
from packaging.version import parse
from pysondb import PysonDB
+from stubber.publish.defaults import GENERIC, GENERIC_L, default_board
from stubber.publish.enums import COMBO_STUBS, CORE_STUBS, DOC_STUBS, StubSource
from stubber.publish.stubpacker import StubPackage, StubSources
from stubber.utils.config import CONFIG
from stubber.utils.versions import clean_version
-GENERIC_L = "generic"
-"generic lowercase"
-GENERIC_U = "GENERIC"
-"GENERIC uppercase"
-GENERIC = {GENERIC_L, GENERIC_U}
-"GENERIC eithercase"
-
# replace std log handler with a custom one capped on INFO level
log.remove()
log.add(sys.stderr, level="INFO", backtrace=True, diagnose=True)
-def package_name(pkg_type: str, *, port: str = "", board: str = "", family: str = "micropython", **kwargs) -> str:
+def package_name(
+ pkg_type: str, *, port: str = "", board: str = "", family: str = "micropython", **kwargs
+) -> str:
"generate a package name for the given package type"
if pkg_type == COMBO_STUBS:
# # {family}-{port}-{board}-stubs
@@ -80,7 +76,9 @@ def get_package(
)
-def get_package_info(db: PysonDB, pub_path: Path, *, pkg_name: str, mpy_version: str) -> Union[Dict, None]:
+def get_package_info(
+ db: PysonDB, pub_path: Path, *, pkg_name: str, mpy_version: str
+) -> Union[Dict, None]:
"""
get a package's record from the json db if it can be found
matches om the package name and version
@@ -88,7 +86,9 @@ def get_package_info(db: PysonDB, pub_path: Path, *, pkg_name: str, mpy_version:
mpy_version: micropython/firmware version (1.18)
"""
# find in the database
- recs = db.get_by_query(query=lambda x: x["mpy_version"] == mpy_version and x["name"] == pkg_name)
+ recs = db.get_by_query(
+ query=lambda x: x["mpy_version"] == mpy_version and x["name"] == pkg_name
+ )
# dict to list
recs = [{"id": key, "data": recs[key]} for key in recs]
# sort
@@ -120,7 +120,7 @@ def create_package(
assert port != "", "port must be specified for combo stubs"
stubs = combo_sources(family, port, board, ver_flat)
elif pkg_type == DOC_STUBS:
- stubs: StubSources = [
+ stubs = [
(
StubSource.DOC,
Path(f"{family}-{ver_flat}-docstubs"),
@@ -138,8 +138,6 @@ def create_package(
def combo_sources(family: str, port: str, board: str, ver_flat: str) -> StubSources:
"""
Build a source set for combo stubs
- -
-
"""
# Use lower case for paths to avoid case sensitive issues
port = port.lower()
@@ -149,22 +147,27 @@ def combo_sources(family: str, port: str, board: str, ver_flat: str) -> StubSour
board_u = board_l.upper()
board_l = board_l.replace("generic_", "") # @GENERIC Prefix
+ # StubSource.FIRMWARE,
+ # Path(f"{family}-{ver_flat}-{port}"),
+ # TODO: look for the most specific firmware stub folder that is available ?
+ # is it possible to prefer micropython-nrf-microbit-stubs over micropython-nrf-stubs
+ # that would also require the port - board - variant to be discoverable runtime
+
+ if board_l in GENERIC:
+ merged_path = Path(f"{family}-{ver_flat}-{port}-merged")
+ if not merged_path.exists():
+ board_l = default_board(port)
+ merged_path = Path(f"{family}-{ver_flat}-{port}-{board_l}-merged")
+ else:
+ merged_path = Path(f"{family}-{ver_flat}-{port}-{board_l}-merged")
+
+ # BOARD in source frozen path needs to be UPPERCASE
+ frozen_path = Path(f"{family}-{ver_flat}-frozen") / port / board_u.upper()
+ # TODO : Add version to core stubs
+ core_path = Path(f"{family}-core")
+
return [
- (
- # StubSource.FIRMWARE,
- # Path(f"{family}-{ver_flat}-{port}"),
- # TODO: look for the most specific firmware stub folder that is available ?
- # is it possible to prefer micropython-nrf-microbit-stubs over micropython-nrf-stubs
- # that would also require the port - board - variant to be discoverable runtime
- StubSource.MERGED,
- Path(f"{family}-{ver_flat}-{port}-merged") if board_l in GENERIC else Path(f"{family}-{ver_flat}-{port}-{board_l}-merged"),
- ),
- (
- StubSource.FROZEN,
- Path(f"{family}-{ver_flat}-frozen") / port / board_u.upper(), # BOARD in source frozen path needs to be UPPERCASE
- ),
- (
- StubSource.CORE,
- Path(f"{family}-core"), # TODO : Add version to core stubs
- ),
+ (StubSource.MERGED, merged_path),
+ (StubSource.FROZEN, frozen_path),
+ (StubSource.CORE, core_path),
]
diff --git a/src/stubber/publish/pathnames.py b/src/stubber/publish/pathnames.py
new file mode 100644
index 00000000..f5953ac7
--- /dev/null
+++ b/src/stubber/publish/pathnames.py
@@ -0,0 +1,50 @@
+"""
+Helper functions to deal with path names and filenames for the folders in the stubs repo
+
+"""
+
+from pathlib import Path
+from typing import Dict, List, Optional
+
+from loguru import logger as log
+
+from stubber.publish.package import GENERIC
+from stubber.utils.config import CONFIG
+from stubber.utils.versions import clean_version
+
+
+
+## Helper functions
+def get_base(candidate: Dict[str, str], version: Optional[str] = None):
+ if version:
+ version = clean_version(version, flat=True)
+ else:
+ version = clean_version(candidate["version"], flat=True)
+ base = f"{candidate['family']}-{version}"
+ return base.lower()
+
+
+def board_folder_name(fw: Dict, *, version: Optional[str] = None) -> str:
+ """Return the name of the firmware folder. Can be in AnyCase."""
+ base = get_base(fw, version=version)
+ if fw["board"] in GENERIC:
+ folder_name = f"{base}-{fw['port']}"
+ else:
+ folder_name = f"{base}-{fw['port']}-{fw['board']}"
+ # do NOT force name to lowercase
+ # remove GENERIC Prefix
+ folder_name = folder_name.replace("-generic_", "-").replace("-GENERIC_", "-")
+ return folder_name
+
+
+def get_board_path(candidate: Dict) -> Path:
+ board_path = CONFIG.stub_path / board_folder_name(candidate)
+ if candidate["version"] == "latest" and not board_path.exists():
+ log.debug(f"no board stubs found for {candidate['version']}, trying stable")
+ board_path = CONFIG.stub_path / board_folder_name(candidate, version=CONFIG.stable_version)
+
+ return board_path
+
+
+def get_merged_path(fw: Dict) -> Path:
+ return CONFIG.stub_path / (board_folder_name(fw) + "-merged")
diff --git a/src/stubber/publish/publish.py b/src/stubber/publish/publish.py
index cd63bfca..0b52d006 100644
--- a/src/stubber/publish/publish.py
+++ b/src/stubber/publish/publish.py
@@ -9,15 +9,16 @@
from stubber.publish.candidates import board_candidates, filter_list
from stubber.publish.database import get_database
+from stubber.publish.defaults import GENERIC_U
from stubber.publish.enums import COMBO_STUBS
-from stubber.publish.package import GENERIC_U, get_package
+from stubber.publish.package import get_package
from stubber.utils.config import CONFIG
def build_multiple(
family: str = "micropython",
versions: List[str] = ["v1.19.1"],
- ports: List[str] = ["auto"],
+ ports: List[str] = ["all"],
boards: List[str] = [GENERIC_U],
production: bool = False,
clean: bool = False,
@@ -46,7 +47,7 @@ def build_multiple(
def publish_multiple(
family: str = "micropython",
versions: List[str] = ["v1.19.1"],
- ports: List[str] = ["auto"],
+ ports: List[str] = ["all"],
boards: List[str] = [GENERIC_U],
production: bool = False,
clean: bool = False,
diff --git a/src/stubber/publish/stubpacker.py b/src/stubber/publish/stubpacker.py
index bfea2a38..66e43766 100644
--- a/src/stubber/publish/stubpacker.py
+++ b/src/stubber/publish/stubpacker.py
@@ -36,7 +36,6 @@
StubSource.FIRMWARE: ["builtins"],
StubSource.DOC: [],
StubSource.CORE: [],
-
}
@@ -49,6 +48,7 @@ class StubPackage:
- package_path - the path to the folder where the package info will be stored ('./publish').
- pkg_version - the version of the package as used on PyPi (semver). Is stored directly in the `pyproject.toml` file
- pyproject - the contents of the `pyproject.toml` file
+
methods:
- from_json - load the package from json
- to_json - return the package as json
@@ -175,7 +175,7 @@ def get_prerelease_package_version(self, production: bool = False) -> str:
"""Get the next prerelease version for the package."""
rc = 1
if describe := get_git_describe(CONFIG.mpy_path.as_posix()):
- # use versiontag and the nummer of commits since the last tag
+ # use versiontag and the number of commits since the last tag
# "v1.19.1-841-g3446"
# 'v1.22.0-preview-19-g8eb7721b4'
parts = describe.split("-", 3)
@@ -233,7 +233,7 @@ def pyproject(self, pyproject: Dict) -> None:
def to_dict(self) -> dict:
"""return the package as a dict to store in the jsondb
- need to simplify some of the Objects to allow serialisation to json
+ need to simplify some of the Objects to allow serialization to json
- the paths to posix paths
- the version (semver) to a string
- toml file to list of lines
@@ -297,7 +297,7 @@ def update_sources(stub_sources: StubSources) -> StubSources:
"""
updated_sources = []
for stub_type, fw_path in stub_sources:
- # prefer -merged stubs over bare firmwre stubs
+ # prefer -merged stubs over bare firmware stubs
if stub_type == StubSource.FIRMWARE:
# Check if -merged folder exists and use that instead
if fw_path.name.endswith("-merged"):
diff --git a/src/stubber/rst/lookup.py b/src/stubber/rst/lookup.py
index b86f9d6d..c60303f4 100644
--- a/src/stubber/rst/lookup.py
+++ b/src/stubber/rst/lookup.py
@@ -16,8 +16,6 @@
"RST_DOC_FIXES",
"DOCSTUB_SKIP",
"U_MODULES",
- "DEFAULT_BOARDS",
- # "FORCE_NON_DETECED",
]
# all possible Types needed for the stubs - exxess types should be removed later , and otherwise won't do much harm
@@ -27,18 +25,6 @@
]
-# The default board for the ports modules documented with base name only
-# TODO: these are not yest used in the stubber logic
-# ESP32-GENERIC is curently hardcoded
-DEFAULT_BOARDS: Dict[str, List[str]] = {
- "stm32": ["stm32-PYBV11"],
- "esp32": ["esp32-GENERIC", "esp32"],
- "esp8266": ["esp8266-GENERIC", "esp8266"],
- "rp2": ["rp2-PICO", "rp2-PICO_W"],
- "samd": ["samd-SEEED_WIO_TERMINAL"],
-}
-
-
@dataclass
class Fix:
"""A fix for a parameter or return type in the documentation that is needed to render it to a valid type annotation
@@ -142,6 +128,9 @@ class Fix:
"machine.Signal.value": ("int", 0.95),
"machine.soft_reset": ("NoReturn", 0.95), # never returns
"machine.UART.irq": ("Incomplete", 0.95), # no IRQ type defined
+ "machine.UART.write": ("Union[int,None]", 0.95),
+ "machine.UART.readinto": ("Union[int,None]", 0.95),
+ "machine.UART.readline": ("Union[str,None]", 0.95),
"math.isnan": ("bool", 0.95),
"micropython.opt_level": ("Incomplete", 0.95), # Not clear in docstring
# since 1.19 const can also be string , bytes or tuple
@@ -180,7 +169,7 @@ class Fix:
"_onewire.writebit": ("None", 0.95),
"_onewire.crc8": ("int", 0.95),
# espnow
- "espnow.ESPNow.recv": ("List", 0.95), # list / ? tuple of bytestrings
+ "espnow.ESPNow.recv": ("Union[List, Tuple[None,None]]", 0.95), # list / ? tuple of bytestrings
}
diff --git a/src/stubber/utils/post.py b/src/stubber/utils/post.py
index ad91752d..55e2433b 100644
--- a/src/stubber/utils/post.py
+++ b/src/stubber/utils/post.py
@@ -43,7 +43,7 @@ def run_autoflake(path: Path, capture_output: bool = False, process_pyi: bool =
note: is run file-by-file to include processing .pyi files
"""
ret = 0
- cmd = [
+ autoflake_cmd = [
"autoflake",
"-r",
"--in-place",
@@ -55,14 +55,14 @@ def run_autoflake(path: Path, capture_output: bool = False, process_pyi: bool =
]
log.debug("Running autoflake on: {}".format(path))
# subprocess.run(cmd, capture_output=log.level >= logging.INFO)
- result = subprocess.run(cmd, capture_output=capture_output)
+ result = subprocess.run(autoflake_cmd, capture_output=capture_output, shell=True)
if result.returncode != 0: # pragma: no cover
log.warning(f"autoflake failed on: {path}")
ret = result.returncode
if process_pyi:
for file in list(path.rglob("*.pyi")):
- cmd = [
+ autoflake_cmd = [
"autoflake",
"-r",
"--in-place",
@@ -74,7 +74,7 @@ def run_autoflake(path: Path, capture_output: bool = False, process_pyi: bool =
]
log.debug("Running autoflake on: {}".format(path))
# subprocess.run(cmd, capture_output=log.level >= logging.INFO)
- result = subprocess.run(cmd, capture_output=capture_output)
+ result = subprocess.run(autoflake_cmd, capture_output=capture_output)
if result.returncode != 0:
log.warning(f"autoflake failed on: {file}")
ret = result.returncode
diff --git a/src/stubber/utils/repos.py b/src/stubber/utils/repos.py
index 4076663b..82497d4a 100644
--- a/src/stubber/utils/repos.py
+++ b/src/stubber/utils/repos.py
@@ -39,7 +39,7 @@ def switch(tag: str, *, mpy_path: Path, mpy_lib_path: Path):
git.switch_branch(repo=mpy_path, branch="master")
else:
git.checkout_tag(repo=mpy_path, tag=tag)
- match_lib_with_mpy(version_tag=tag, lib_path=mpy_lib_path)
+ match_lib_with_mpy(version_tag=tag, mpy_path=mpy_path, lib_path=mpy_lib_path)
def read_micropython_lib_commits(filename: str = "data/micropython_tags.csv"):
@@ -62,30 +62,39 @@ def read_micropython_lib_commits(filename: str = "data/micropython_tags.csv"):
reader = csv.DictReader(ntf.file, skipinitialspace=True) # dialect="excel",
rows = list(reader)
# create a dict version --> commit_hash
- version_commit = {row["version"].split("/")[-1]: row["lib_commit_hash"] for row in rows if row["version"].startswith("refs/tags/")}
+ version_commit = {
+ row["version"].split("/")[-1]: row["lib_commit_hash"]
+ for row in rows
+ if row["version"].startswith("refs/tags/")
+ }
# add default
version_commit = defaultdict(lambda: "master", version_commit)
return version_commit
-def match_lib_with_mpy(version_tag: str, lib_path: Path) -> bool:
+def match_lib_with_mpy(version_tag: str, mpy_path: Path, lib_path: Path) -> bool:
micropython_lib_commits = read_micropython_lib_commits()
# Make sure that the correct micropython-lib release is checked out
# check if micropython-lib has matching tags
if version_tag == "latest":
- return git.checkout_commit("master", lib_path)
+ # micropython-lib is now a submodule
+ result = git.checkout_commit("master", lib_path)
+ if not result:
+ log.error("Could not checkout micropython-lib @master")
+ return False
+
+ return git.sync_submodules(mpy_path)
elif Version(version_tag) >= Version("v1.20.0"):
- # TODO:if version is v1.12.0 or newer
- # then use submodules to checkout the correct version of micropython-lib
- # git submodule update lib/micropython-lib
- # or use the new git tags to checkout the correct version of micropython-lib
- # else
- # clean the submodules for just to be sure
- # git submodule foreach --recursive git clean -xfd
- # use the micropython_tags.csv to find the correct commit hash
- return git.checkout_tag(version_tag, lib_path)
+ # micropython-lib is now a submodule
+ result = git.checkout_tag(version_tag, lib_path)
+ if not result:
+ log.error("Could not checkout micropython-lib @master")
+ return False
+ return git.sync_submodules(mpy_path)
else:
- log.info(f"Matching repo's: Micropython {version_tag} needs micropython-lib:{micropython_lib_commits[version_tag]}")
+ log.info(
+ f"Matching repo's: Micropython {version_tag} needs micropython-lib:{micropython_lib_commits[version_tag]}"
+ )
return git.checkout_commit(micropython_lib_commits[version_tag], lib_path)
@@ -107,10 +116,16 @@ def fetch_repos(tag: str, mpy_path: Path, mpy_lib_path: Path):
git.switch_branch(repo=mpy_path, branch="master")
else:
git.checkout_tag(repo=mpy_path, tag=tag)
- result = match_lib_with_mpy(version_tag=tag, lib_path=mpy_lib_path)
+ result = match_lib_with_mpy(version_tag=tag, mpy_path=mpy_path, lib_path=mpy_lib_path)
- log.info(f"{mpy_path} {git.get_local_tag(mpy_path)}")
- log.info(f"{mpy_lib_path} {git.get_local_tag(mpy_lib_path)}")
+ log.info(f"{str(mpy_path):<40} {git.get_local_tag(mpy_path)}")
+ log.info(f"{str(mpy_lib_path):<40} {git.get_local_tag(mpy_lib_path)}")
+ try:
+ sub_mod_path = mpy_path / "lib/micropython-lib"
+ if (sub_mod_path / ".git").exists():
+ log.info(f"{str(sub_mod_path):<40} {git.get_local_tag(sub_mod_path)}")
+ except Exception:
+ pass
return result
diff --git a/src/stubber/utils/stubmaker.py b/src/stubber/utils/stubmaker.py
index f2b3d2c9..3515a826 100644
--- a/src/stubber/utils/stubmaker.py
+++ b/src/stubber/utils/stubmaker.py
@@ -9,7 +9,10 @@
# default stubgen options
STUBGEN_OPT = stubgen.Options(
- pyversion=(3, 8), # documentation uses position-only argument indicator which requires 3.8 or higher
+ pyversion=(
+ 3,
+ 8,
+ ), # documentation uses position-only argument indicator which requires 3.8 or higher
no_import=False,
include_private=True,
doc_dir="",
@@ -58,16 +61,18 @@ def generate_pyi_files(modules_folder: Path) -> bool:
"""
# stubgen cannot process folders with duplicate modules ( ie v1.14 and v1.15 )
# NOTE: FIX 1 add __init__.py to umqtt
- if (modules_folder / "umqtt/robust.py").exists(): # and not (freeze_path / "umqtt" / "__init__.py").exists():
+ if (
+ modules_folder / "umqtt/robust.py"
+ ).exists(): # and not (freeze_path / "umqtt" / "__init__.py").exists():
log.debug("add missing : umqtt/__init__.py")
with open(modules_folder / "umqtt" / "__init__.py", "a") as f:
f.write("")
- modlist = list(modules_folder.glob("**/modules.json"))
+ module_list = list(modules_folder.glob("**/modules.json"))
r = True
- if len(modlist) > 1:
- # try to process each module seperatlely
- for mod_manifest in modlist:
+ if len(module_list) > 1:
+ # try to process each module separately
+ for mod_manifest in module_list:
## generate fyi files for folder
r = r and generate_pyi_files(mod_manifest.parent)
else: # one or less module manifests
@@ -100,8 +105,8 @@ def generate_pyi_files(modules_folder: Path) -> bool:
py_files = list(modules_folder.rglob("*.py"))
pyi_files = list(modules_folder.rglob("*.pyi"))
- worklist = pyi_files.copy()
- for pyi in worklist:
+ work_list = pyi_files.copy()
+ for pyi in work_list:
# remove all py files that have been stubbed successfully from the list
try:
py_files.remove(pyi.with_suffix(".py"))
diff --git a/tests/checkout_repo/basicgit_test.py b/tests/checkout_repo/basicgit_test.py
index ae02226f..7d03066c 100644
--- a/tests/checkout_repo/basicgit_test.py
+++ b/tests/checkout_repo/basicgit_test.py
@@ -1,12 +1,13 @@
-import sys
import os
-import pytest
import subprocess
+import sys
from pathlib import Path
-from pytest_mock import MockerFixture
-from mock import MagicMock
from subprocess import CompletedProcess
+import pytest
+from mock import MagicMock
+from pytest_mock import MockerFixture
+
# make sure that the source can be found
RootPath = Path(os.getcwd())
src_path = str(RootPath / "src")
@@ -22,7 +23,7 @@ def common_tst(tag):
# print(tag)
assert isinstance(tag, str), "tag must be a string"
if tag != "latest":
- assert tag.startswith("v"), "tags start with a v"
+ assert tag.lower().startswith("v"), "tags start with a v"
assert len(tag) >= 2, "tags are longer than 2 chars"
@@ -32,7 +33,9 @@ def test_git_clone_shallow(tmp_path):
def test_git_clone(tmp_path):
- result = git.clone("https://github.com/micropython/micropython.git", tmp_path / "micropython", shallow=False)
+ result = git.clone(
+ "https://github.com/micropython/micropython.git", tmp_path / "micropython", shallow=False
+ )
assert result == True
@@ -51,16 +54,30 @@ def test_git_clone_fast(mocker: MockerFixture, tmp_path):
mock: MagicMock = mocker.MagicMock(return_value=m_result)
mocker.patch("stubber.basicgit.subprocess.run", mock)
- result = git.clone("https://github.com/micropython/micropython.git", tmp_path / "micropython", shallow=False)
+ result = git.clone(
+ "https://github.com/micropython/micropython.git", tmp_path / "micropython", shallow=False
+ )
assert result == True
- result = git.clone("https://github.com/micropython/micropython.git", tmp_path / "micropython", shallow=True)
+ result = git.clone(
+ "https://github.com/micropython/micropython.git", tmp_path / "micropython", shallow=True
+ )
assert result == True
- result = git.clone("https://github.com/micropython/micropython.git", tmp_path / "micropython", shallow=True, tag="latest")
+ result = git.clone(
+ "https://github.com/micropython/micropython.git",
+ tmp_path / "micropython",
+ shallow=True,
+ tag="latest",
+ )
assert result == True
- result = git.clone("https://github.com/micropython/micropython.git", tmp_path / "micropython", shallow=True, tag="foobar")
+ result = git.clone(
+ "https://github.com/micropython/micropython.git",
+ tmp_path / "micropython",
+ shallow=True,
+ tag="foobar",
+ )
assert result == True
@@ -93,7 +110,9 @@ def test_get_tag_latest():
if not (repo / ".git").exists():
pytest.skip("no git repo in current folder")
- result = subprocess.run(["git", "switch", "main", "--force"], capture_output=True, check=True, cwd=repo.as_posix())
+ result = subprocess.run(
+ ["git", "switch", "main", "--force"], capture_output=True, check=True, cwd=repo.as_posix()
+ )
assert result.stderr == 0
# get tag of current repro
@@ -157,7 +176,9 @@ def test_fetch():
def test_run_git_fails(mocker: MockerFixture):
"test what happens if _run_git fails"
- mock_run_git = mocker.patch("stubber.basicgit._run_local_git", autospec=True, return_value=None)
+ mock_run_git = mocker.patch(
+ "stubber.basicgit._run_local_git", autospec=True, return_value=None
+ )
# fail to fetch
r = git.fetch(repo=".")
diff --git a/tests/commandline/stubber_cli_test.py b/tests/commandline/stubber_cli_test.py
index 4c8928d3..09381c29 100644
--- a/tests/commandline/stubber_cli_test.py
+++ b/tests/commandline/stubber_cli_test.py
@@ -15,7 +15,7 @@
def test_cmd_help():
- # check basic commandline sanity check
+ # check basic command line sanity check
runner = CliRunner()
result = runner.invoke(stubber.stubber_cli, ["--help"])
assert result.exit_code == 0
@@ -42,16 +42,26 @@ def test_cmd_get_config():
def test_cmd_clone(mocker: MockerFixture, tmp_path: Path):
runner = CliRunner()
# from stubber.commands.clone import git
- m_clone: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.clone", autospec=True, return_value=0)
- m_fetch: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.fetch", autospec=True, return_value=0)
+ m_clone: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.clone", autospec=True, return_value=0
+ )
+ m_fetch: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.fetch", autospec=True, return_value=0
+ )
result = runner.invoke(stubber.stubber_cli, ["clone"])
assert result.exit_code == 0
# either clone or fetch
assert m_clone.call_count + m_fetch.call_count == 2
if m_clone.call_count > 0:
- m_clone.assert_any_call(remote_repo="https://github.com/micropython/micropython.git", path=Path("repos/micropython"))
- m_clone.assert_any_call(remote_repo="https://github.com/micropython/micropython-lib.git", path=Path("repos/micropython-lib"))
+ m_clone.assert_any_call(
+ remote_repo="https://github.com/micropython/micropython.git",
+ path=Path("repos/micropython"),
+ )
+ m_clone.assert_any_call(
+ remote_repo="https://github.com/micropython/micropython-lib.git",
+ path=Path("repos/micropython-lib"),
+ )
else:
m_fetch.assert_any_call(Path("repos/micropython"))
m_fetch.assert_any_call(Path("repos/micropython-lib"))
@@ -60,7 +70,9 @@ def test_cmd_clone(mocker: MockerFixture, tmp_path: Path):
@pytest.mark.mocked
def test_cmd_clone_path(mocker: MockerFixture, tmp_path: Path):
runner = CliRunner()
- m_clone: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.clone", autospec=True, return_value=0)
+ m_clone: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.clone", autospec=True, return_value=0
+ )
m_tag = mocker.patch("stubber.commands.clone_cmd.git.get_local_tag", autospec=True)
m_dir = mocker.patch("stubber.commands.clone_cmd.os.mkdir", autospec=True) # type: ignore
@@ -70,8 +82,14 @@ def test_cmd_clone_path(mocker: MockerFixture, tmp_path: Path):
assert result.exit_code == 0
assert m_clone.call_count >= 2
- m_clone.assert_any_call(remote_repo="https://github.com/micropython/micropython.git", path=Path("foobar/micropython"))
- m_clone.assert_any_call(remote_repo="https://github.com/micropython/micropython-lib.git", path=Path("foobar/micropython-lib"))
+ m_clone.assert_any_call(
+ remote_repo="https://github.com/micropython/micropython.git",
+ path=Path("foobar/micropython"),
+ )
+ m_clone.assert_any_call(
+ remote_repo="https://github.com/micropython/micropython-lib.git",
+ path=Path("foobar/micropython-lib"),
+ )
assert m_tag.call_count >= 2
@@ -93,13 +111,23 @@ def test_cmd_switch(mocker: MockerFixture, params: List[str]):
runner = CliRunner()
# Mock Path.exists
mocker.patch("stubber.commands.clone_cmd.git.clone", autospec=True, return_value=0)
- m_fetch: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.fetch", autospec=True, return_value=0)
-
- m_switch: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.switch_branch", autospec=True, return_value=0)
- m_checkout: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.checkout_tag", autospec=True, return_value=0)
- mocker.patch("stubber.commands.clone_cmd.git.get_local_tag", autospec=True, return_value="v1.42")
-
- m_match = mocker.patch("stubber.utils.repos.match_lib_with_mpy", autospec=True) # Moved to other module
+ m_fetch: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.fetch", autospec=True, return_value=0
+ )
+
+ m_switch: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.switch_branch", autospec=True, return_value=0
+ )
+ m_checkout: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.checkout_tag", autospec=True, return_value=0
+ )
+ mocker.patch(
+ "stubber.commands.clone_cmd.git.get_local_tag", autospec=True, return_value="v1.42"
+ )
+
+ m_match = mocker.patch(
+ "stubber.utils.repos.match_lib_with_mpy", autospec=True
+ ) # Moved to other module
mocker.patch("stubber.commands.clone_cmd.Path.exists", return_value=True)
result = runner.invoke(stubber.stubber_cli, params)
@@ -107,7 +135,7 @@ def test_cmd_switch(mocker: MockerFixture, params: List[str]):
# fetch latest
assert m_fetch.call_count == 3
- # TODO: Use Fakeconfig to test path
+ # TODO: Use Fake config to test path
m_fetch.assert_any_call(Path("repos/micropython"))
m_fetch.assert_any_call(Path("repos/micropython-lib"))
@@ -127,12 +155,22 @@ def test_cmd_switch(mocker: MockerFixture, params: List[str]):
def test_cmd_switch_version(mocker: MockerFixture, version: str):
runner = CliRunner()
# Mock Path.exists
- m_clone: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.clone", autospec=True, return_value=0)
- m_fetch: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.fetch", autospec=True, return_value=0)
-
- m_switch: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.switch_branch", autospec=True, return_value=0)
- m_checkout: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.checkout_tag", autospec=True, return_value=0)
- m_get_l_tag: MagicMock = mocker.patch("stubber.commands.clone_cmd.git.get_local_tag", autospec=True, return_value="v1.42")
+ m_clone: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.clone", autospec=True, return_value=0
+ )
+ m_fetch: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.fetch", autospec=True, return_value=0
+ )
+
+ m_switch: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.switch_branch", autospec=True, return_value=0
+ )
+ m_checkout: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.checkout_tag", autospec=True, return_value=0
+ )
+ m_get_l_tag: MagicMock = mocker.patch(
+ "stubber.commands.clone_cmd.git.get_local_tag", autospec=True, return_value="v1.42"
+ )
m_match = mocker.patch("stubber.utils.repos.match_lib_with_mpy", autospec=True)
@@ -161,7 +199,7 @@ def test_cmd_switch_version(mocker: MockerFixture, version: str):
##########################################################################################
@pytest.mark.mocked
def test_cmd_minify(mocker: MockerFixture):
- # check basic commandline sanity check
+ # check basic command line sanity check
runner = CliRunner()
mock_minify: MagicMock = mocker.MagicMock(return_value=0)
mocker.patch("stubber.commands.minify_cmd.minify", mock_minify)
@@ -173,7 +211,7 @@ def test_cmd_minify(mocker: MockerFixture):
@pytest.mark.mocked
def test_cmd_minify_all(mocker: MockerFixture):
- # check basic commandline sanity check
+ # check basic command line sanity check
runner = CliRunner()
mock_minify: MagicMock = mocker.MagicMock(return_value=0)
mocker.patch("stubber.commands.minify_cmd.minify", mock_minify)
@@ -188,7 +226,7 @@ def test_cmd_minify_all(mocker: MockerFixture):
##########################################################################################
@pytest.mark.mocked
def test_cmd_stub(mocker: MockerFixture):
- # check basic commandline sanity check
+ # check basic command line sanity check
runner = CliRunner()
# m_generate: MagicMock = mocker.patch("stubber.commands.stub_cmd.generate_pyi_files", autospec=True, return_value=True)
m_generate: MagicMock = mocker.MagicMock(return_value=True)
@@ -209,22 +247,29 @@ def test_cmd_stub(mocker: MockerFixture):
##########################################################################################
@pytest.mark.mocked
def test_cmd_get_frozen(mocker: MockerFixture, tmp_path: Path):
- # check basic commandline sanity check
+ # check basic command line sanity check
runner = CliRunner()
- m_get_local_tag: MagicMock = mocker.patch("stubber.basicgit.get_local_tag", autospec=True, return_value="v1.42")
+ m_get_local_tag: MagicMock = mocker.patch(
+ "stubber.basicgit.get_local_tag", autospec=True, return_value="v1.42"
+ )
- m_freeze_any: MagicMock = mocker.patch("stubber.commands.get_frozen_cmd.freeze_any", autospec=True)
+ m_freeze_any: MagicMock = mocker.patch(
+ "stubber.commands.get_frozen_cmd.freeze_any", autospec=True
+ )
m_post: MagicMock = mocker.patch("stubber.utils.do_post_processing", autospec=True)
# fake run - need to ensure that there is a destination folder
- result = runner.invoke(stubber.stubber_cli, ["get-frozen", "--stub-folder", tmp_path.as_posix()])
+ result = runner.invoke(
+ stubber.stubber_cli, ["get-frozen", "--stub-folder", tmp_path.as_posix()]
+ )
assert result.exit_code == 0
- # FIXME : test failes in CI
+ # FIXME : test fails in CI
m_freeze_any.assert_called_once()
m_get_local_tag.assert_called_once()
- m_post.assert_called_once_with([tmp_path / "micropython-v1_42-frozen"], True, True)
+ m_post.assert_any_call([tmp_path / "micropython-v1_42-frozen"], True, False)
+ m_post.assert_any_call([tmp_path / "micropython-v1_42-frozen"], False, True)
##########################################################################################
@@ -232,7 +277,7 @@ def test_cmd_get_frozen(mocker: MockerFixture, tmp_path: Path):
##########################################################################################
@pytest.mark.mocked
def test_cmd_get_lobo(mocker: MockerFixture, tmp_path: Path):
- # check basic commandline sanity check
+ # check basic command line sanity check
runner = CliRunner()
mock: MagicMock = mocker.patch("stubber.get_lobo.get_frozen", autospec=True)
@@ -251,7 +296,7 @@ def test_cmd_get_lobo(mocker: MockerFixture, tmp_path: Path):
##########################################################################################
@pytest.mark.mocked
def test_cmd_get_core(mocker: MockerFixture, tmp_path: Path):
- # check basic commandline sanity check
+ # check basic command line sanity check
runner = CliRunner()
mock: MagicMock = mocker.patch("stubber.get_cpython.get_core", autospec=True)
mock_post: MagicMock = mocker.patch("stubber.utils.do_post_processing", autospec=True)
@@ -263,7 +308,9 @@ def test_cmd_get_core(mocker: MockerFixture, tmp_path: Path):
assert mock.call_count == 2
# post is called one
- mock_post.assert_called_with([tmp_path / "cpython_core-pycopy", tmp_path / "cpython_core-micropython"], True, True)
+ mock_post.assert_called_with(
+ [tmp_path / "cpython_core-pycopy", tmp_path / "cpython_core-micropython"], True, True
+ )
##########################################################################################
@@ -271,18 +318,24 @@ def test_cmd_get_core(mocker: MockerFixture, tmp_path: Path):
##########################################################################################
@pytest.mark.mocked
def test_cmd_get_docstubs(mocker: MockerFixture, tmp_path: Path):
- # check basic commandline sanity check
+ # check basic command line sanity check
runner = CliRunner()
- m_get_l_tag: MagicMock = mocker.patch("stubber.basicgit.get_local_tag", autospec=True, return_value="v1.42")
+ m_get_l_tag: MagicMock = mocker.patch(
+ "stubber.basicgit.get_local_tag", autospec=True, return_value="v1.42"
+ )
# from stubber.commands.get_docstubs import generate_from_rst
- mock: MagicMock = mocker.patch("stubber.commands.get_docstubs_cmd.generate_from_rst", autospec=True)
+ mock: MagicMock = mocker.patch(
+ "stubber.commands.get_docstubs_cmd.generate_from_rst", autospec=True
+ )
mock_post: MagicMock = mocker.patch("stubber.utils.do_post_processing", autospec=True)
# fake run
- result = runner.invoke(stubber.stubber_cli, ["get-docstubs", "--stub-folder", tmp_path.as_posix()])
+ result = runner.invoke(
+ stubber.stubber_cli, ["get-docstubs", "--stub-folder", tmp_path.as_posix()]
+ )
assert result.exit_code == 0
# process is called twice
assert mock.call_count == 1
@@ -298,14 +351,18 @@ def test_cmd_get_docstubs(mocker: MockerFixture, tmp_path: Path):
##########################################################################################
@pytest.mark.mocked
def test_cmd_fallback(mocker: MockerFixture, tmp_path: Path):
- # check basic commandline sanity check
+ # check basic command line sanity check
runner = CliRunner()
- mock: MagicMock = mocker.patch("stubber.commands.upd_fallback_cmd.update_fallback", autospec=True)
+ mock: MagicMock = mocker.patch(
+ "stubber.commands.upd_fallback_cmd.update_fallback", autospec=True
+ )
# mock2: MagicMock = mocker.patch("stubber.update_fallback.update_fallback", autospec=True)
# from .update_fallback import update_fallback,
# fake run
- result = runner.invoke(stubber.stubber_cli, ["update-fallback", "--stub-folder", tmp_path.as_posix()])
+ result = runner.invoke(
+ stubber.stubber_cli, ["update-fallback", "--stub-folder", tmp_path.as_posix()]
+ )
mock.assert_called_once()
assert result.exit_code == 0
@@ -324,7 +381,9 @@ def test_cmd_fallback(mocker: MockerFixture, tmp_path: Path):
def test_cmd_merge(mocker: MockerFixture, cmdline: List[str]):
runner = CliRunner()
# from stubber.commands.clone import git
- m_merge_docstubs: MagicMock = mocker.patch("stubber.commands.merge_cmd.merge_all_docstubs", autospec=True, return_value={})
+ m_merge_docstubs: MagicMock = mocker.patch(
+ "stubber.commands.merge_cmd.merge_all_docstubs", autospec=True, return_value={}
+ )
result = runner.invoke(stubber.stubber_cli, cmdline)
assert result.exit_code == 0
m_merge_docstubs.assert_called_once()
@@ -344,7 +403,9 @@ def test_cmd_merge(mocker: MockerFixture, cmdline: List[str]):
def test_cmd_publish(mocker: MockerFixture, cmdline: List[str]):
runner = CliRunner()
# from stubber.commands.clone import git
- m_publish_multiple: MagicMock = mocker.patch("stubber.commands.publish_cmd.publish_multiple", autospec=True, return_value={})
+ m_publish_multiple: MagicMock = mocker.patch(
+ "stubber.commands.publish_cmd.publish_multiple", autospec=True, return_value={}
+ )
result = runner.invoke(stubber.stubber_cli, cmdline)
assert result.exit_code == 0
m_publish_multiple.assert_called_once()
diff --git a/tests/createstubs/createstubs_all_test.py b/tests/createstubs/createstubs_all_test.py
index cea241b2..64eca581 100644
--- a/tests/createstubs/createstubs_all_test.py
+++ b/tests/createstubs/createstubs_all_test.py
@@ -1,4 +1,5 @@
# type: ignore reportGeneralTypeIssues
+import os
import sys
from collections import namedtuple
from importlib import import_module
@@ -157,8 +158,15 @@ def mock_uname():
# mock that these modules can be imported without errors
sys.modules[mod] = MagicMock()
- # now run the tests
- stubber = createstubs.Stubber()
+ # change to the folder with the data files for the test
+ old_cwd = os.getcwd()
+ os.chdir("./src/stubber/data")
+ try:
+ # now run the tests
+ stubber = createstubs.Stubber()
+ finally:
+ # change back to the original folder
+ os.chdir(old_cwd)
assert stubber is not None, "Can't create Stubber instance"
info = createstubs._info()
@@ -183,10 +191,12 @@ def mock_uname():
for c in chars:
assert c not in stubber.flat_fwid, "flat_fwid must not contain '{}'".format(c)
- # Does the firmware id match (at least the beginning)
- assert new_fwid.startswith(fwid), "fwid does not match"
+ # Does the firmware id match (at least the part before the last -)
+ assert new_fwid.startswith(fwid.rsplit("-", 1)[0]), "fwid does not match"
- assert new_fwid == fwid, f"fwid: {new_fwid} does not match"
+ if not "esp8266" in fwid:
+ # TODO: Fix FWID logic with esp8266
+ assert new_fwid == fwid, f"fwid: {new_fwid} does not match"
# # throws an error on the commandline
diff --git a/tests/createstubs/testcases.py b/tests/createstubs/testcases.py
index dcb2eac0..3810ffe0 100644
--- a/tests/createstubs/testcases.py
+++ b/tests/createstubs/testcases.py
@@ -56,21 +56,21 @@
machine="ESP32 module with ESP32",
)
-mpy_v1_11_8_esp8622 = UName(
+mpy_v1_11_8_esp8266 = UName(
sysname="esp8266",
nodename="esp8266",
release="2.2.0-dev(9422289)",
version="v1.11-8-g48dcbbe60 on 2019-05-29",
machine="ESP module with ESP8266",
)
-mpy_v1_11_esp8622 = UName(
+mpy_v1_11_esp8266 = UName(
sysname="esp8266",
nodename="esp8266",
release="2.2.0-dev(9422289)",
version="v1.11 on 2019-05-29",
machine="ESP module with ESP8266",
)
-mpy_v1_17_esp8622_GEN = UName(
+mpy_v1_17_esp8266_GEN = UName(
sysname="esp8266",
nodename="esp8266",
release="2.0.0(5a875ba)",
@@ -108,16 +108,45 @@
# mpy esp32
("micropython-v1.9.4-esp32-GENERIC", "micropython", (1, 9, 4), "esp32", mpy_v1_9_4, []),
("micropython-v1.10-esp32-GENERIC", "micropython", (1, 10, 0), "esp32", mpy_v1_10, []),
- ("micropython-v1.13-103-esp32-GENERIC_SPIRAM", "micropython", (1, 13, 0), "esp32", mpy_v1_13_build, []),
- # mpy esp8622
- ("micropython-v1.11-esp8622-GENERIC", "micropython", (1, 11, 0), "esp8622", mpy_v1_11_esp8622, []),
- ("micropython-v1.11-8-esp8622-GENERIC", "micropython", (1, 11, 0), "esp8622", mpy_v1_11_8_esp8622, []),
- ("micropython-v1.17-esp8622-GENERIC", "micropython", (1, 17, 0), "esp8622", mpy_v1_17_esp8622_GEN, []),
+ # ("micropython-v1.13-103-esp32-GENERIC_SPIRAM", "micropython", (1, 13, 0), "esp32", mpy_v1_13_build, []),
+ (
+ "micropython-v1.13-103-esp32-GENERIC",
+ "micropython",
+ (1, 13, 0),
+ "esp32",
+ mpy_v1_13_build,
+ [],
+ ),
+ # mpy esp8266
+ (
+ "micropython-v1.11-esp8266-GENERIC",
+ "micropython",
+ (1, 11, 0),
+ "esp8266",
+ mpy_v1_11_esp8266,
+ [],
+ ),
+ (
+ "micropython-v1.11-8-esp8266-GENERIC",
+ "micropython",
+ (1, 11, 0),
+ "esp8266",
+ mpy_v1_11_8_esp8266,
+ [],
+ ),
+ (
+ "micropython-v1.17-esp8266-GENERIC",
+ "micropython",
+ (1, 17, 0),
+ "esp8266",
+ mpy_v1_17_esp8266_GEN,
+ [],
+ ),
# mpy pyb1
("micropython-v1.13-95-stm32-PYBV11", "micropython", (1, 13, 0), "pyb1", pyb1_v1_13_PYB11, []),
# RP2
(
- "micropython-v1.18-rp2-PICO",
+ "micropython-v1.18-rp2-RPI_PICO",
"micropython",
(1, 18, 0),
"rp2",
@@ -131,7 +160,7 @@
[],
),
(
- "micropython-v1.19.1-721-rp2-PICO_W",
+ "micropython-v1.19.1-721-rp2-RPI_PICO_W",
"micropython",
(1, 19, 1),
"rp2",
diff --git a/tests/freeze/freezer_mpy_test.py b/tests/freeze/freezer_mpy_test.py
index 3fdd1405..26f22fb7 100644
--- a/tests/freeze/freezer_mpy_test.py
+++ b/tests/freeze/freezer_mpy_test.py
@@ -15,7 +15,7 @@
# Module Under Test
from stubber.freeze.get_frozen import freeze_any, get_manifests
-from stubber.publish.package import GENERIC_L, GENERIC_U
+from stubber.publish.defaults import GENERIC_L, GENERIC_U
from stubber.utils.repos import switch
# pylint: disable=wrong-import-position,import-error
@@ -66,7 +66,9 @@ def test_get_portboard(path: str, port: str, board: str):
assert _port == port
-def test_manifest_uasync(tmp_path: Path, testrepo_micropython: Path, testrepo_micropython_lib: Path):
+def test_manifest_uasync(
+ tmp_path: Path, testrepo_micropython: Path, testrepo_micropython_lib: Path
+):
"test if task.py is included with the uasyncio frozen module"
mpy_version = "v1.18"
mpy_folder = testrepo_micropython.absolute()
@@ -78,7 +80,9 @@ def test_manifest_uasync(tmp_path: Path, testrepo_micropython: Path, testrepo_mi
manifest = mpy_folder / "ports/esp32/boards/manifest.py"
freeze_one_manifest_2(manifest, stub_folder, mpy_folder, lib_folder, mpy_version)
- assert (tmp_path / "esp32" / GENERIC_U / "uasyncio/task.py").exists(), "task.py must be included in uasyncio"
+ assert (
+ tmp_path / "esp32" / GENERIC_U / "uasyncio/task.py"
+ ).exists(), "task.py must be included in uasyncio"
#######################################################################################################################
@@ -198,10 +202,12 @@ def test_freeze_one_manifest_v2(
[
"v1.12",
"v1.16",
- "v1.17",
+ # "v1.17",
"v1.18",
- "v1.19",
+ # "v1.19",
"v1.19.1",
+ "v1.20.0",
+ "v1.21.0",
"latest",
],
)
@@ -215,7 +221,12 @@ def test_freeze_any(
# print(f"Testing {mpy_version} in {tmp_path}")
switch(mpy_version, mpy_path=testrepo_micropython, mpy_lib_path=testrepo_micropython_lib)
- freeze_any(tmp_path, version=mpy_version, mpy_path=testrepo_micropython, mpy_lib_path=testrepo_micropython_lib)
+ freeze_any(
+ tmp_path,
+ version=mpy_version,
+ mpy_path=testrepo_micropython,
+ mpy_lib_path=testrepo_micropython_lib,
+ )
scripts = list(tmp_path.rglob("*.py"))
assert scripts is not None, "can freeze scripts from manifest"
@@ -232,12 +243,15 @@ def test_freeze_any(
"mpy_version",
[
"master",
- "v1.19",
- "v1.18",
- "v1.17",
- "v1.16",
"v1.12",
- "v1.10",
+ "v1.16",
+ # "v1.17",
+ "v1.18",
+ # "v1.19",
+ "v1.19.1",
+ "v1.20.0",
+ "v1.21.0",
+ "latest",
],
)
@pytest.mark.mocked
@@ -250,10 +264,19 @@ def test_freeze_any_mocked(
):
"mocked test if we can freeze source using manifest.py files"
- m_freeze_folders: MagicMock = mocker.patch("stubber.freeze.get_frozen.freeze_folders", autospec=True, return_value=[1])
+ m_freeze_folders: MagicMock = mocker.patch(
+ "stubber.freeze.get_frozen.freeze_folders", autospec=True, return_value=[1]
+ )
# m_freeze_one_manifest_1: MagicMock = mocker.patch("stubber.freeze.get_frozen.freeze_one_manifest_1", autospec=True, return_value=1)
- m_freeze_one_manifest_2: MagicMock = mocker.patch("stubber.freeze.get_frozen.freeze_one_manifest_2", autospec=True, return_value=1)
- x = freeze_any(tmp_path, version=mpy_version, mpy_path=testrepo_micropython, mpy_lib_path=testrepo_micropython_lib)
+ m_freeze_one_manifest_2: MagicMock = mocker.patch(
+ "stubber.freeze.get_frozen.freeze_one_manifest_2", autospec=True, return_value=1
+ )
+ x = freeze_any(
+ tmp_path,
+ version=mpy_version,
+ mpy_path=testrepo_micropython,
+ mpy_lib_path=testrepo_micropython_lib,
+ )
# calls = m_freeze_folders.call_count + m_freeze_one_manifest_1.call_count + m_freeze_one_manifest_2.call_count
calls = m_freeze_folders.call_count + m_freeze_one_manifest_2.call_count
print(f" m_freeze_folders.call_count {m_freeze_folders.call_count}")
@@ -274,12 +297,21 @@ def test_freeze_manifest2_error_mocked(
):
"mocked test if we can freeze source using manifest.py files"
- m_freeze_folders: MagicMock = mocker.patch("stubber.freeze.get_frozen.freeze_folders", autospec=True, return_value=[1])
+ m_freeze_folders: MagicMock = mocker.patch(
+ "stubber.freeze.get_frozen.freeze_folders", autospec=True, return_value=[1]
+ )
# m_freeze_one_manifest_1: MagicMock = mocker.patch("stubber.freeze.get_frozen.freeze_one_manifest_1", autospec=True, return_value=1)
- m_freeze_one_manifest_2: MagicMock = mocker.patch("stubber.freeze.get_frozen.freeze_one_manifest_2", autospec=True, return_value=1)
+ m_freeze_one_manifest_2: MagicMock = mocker.patch(
+ "stubber.freeze.get_frozen.freeze_one_manifest_2", autospec=True, return_value=1
+ )
# get the correct version to test
switch(mpy_version, mpy_path=testrepo_micropython, mpy_lib_path=testrepo_micropython_lib)
- x = freeze_any(tmp_path, version=mpy_version, mpy_path=testrepo_micropython, mpy_lib_path=testrepo_micropython_lib)
+ x = freeze_any(
+ tmp_path,
+ version=mpy_version,
+ mpy_path=testrepo_micropython,
+ mpy_lib_path=testrepo_micropython_lib,
+ )
assert x >= 1, "expect >= 1 stubs"
assert m_freeze_folders.call_count == 0, "expect no calls to freeze_folders"
assert m_freeze_one_manifest_2.call_count == 34, "34 calls to freeze_one_manifest_2"
diff --git a/tests/publish/test_merge.py b/tests/publish/test_merge.py
index 35cad25c..eec6c185 100644
--- a/tests/publish/test_merge.py
+++ b/tests/publish/test_merge.py
@@ -26,9 +26,13 @@ def test_merge_all_docstubs_mocked(mocker, tmp_path, pytestconfig):
],
)
m_copy_and_merge_docstubs: MagicMock = mocker.patch("stubber.publish.merge_docstubs.copy_and_merge_docstubs", autospec=True)
+ m_add_machine_pin_call: MagicMock = mocker.patch("stubber.publish.merge_docstubs.add_machine_pin_call", autospec=True)
- result = merge_all_docstubs(["v1.18", "v1.19"])
+ # mock pathlib.Path.exists to return True so there is no dependency of folders existing on the test system
+ mocker.patch("stubber.publish.merge_docstubs.Path.exists", autospec=True, return_value=True)
+ result = merge_all_docstubs(["v1.18", "v1.19"])
+ assert result == 2
assert m_board_candidates.call_count == 1
assert m_copy_and_merge_docstubs.call_count == 2
diff --git a/tests/rst/data/return_testcases.json b/tests/rst/data/return_testcases.json
index f9bc5061..abc7673a 100644
--- a/tests/rst/data/return_testcases.json
+++ b/tests/rst/data/return_testcases.json
@@ -1003,7 +1003,7 @@
" Return value: number of bytes written or ``None`` on timeout."
],
"docstring_len": 103,
- "type": "int",
+ "type": "Union[int,None]",
"confidence": 0.18000000000000002,
"match": "",
"module": "machine",
diff --git a/tests/rst/test_repeats.py b/tests/rst/test_repeats.py
index c128800c..c6d9a0f8 100644
--- a/tests/rst/test_repeats.py
+++ b/tests/rst/test_repeats.py
@@ -138,7 +138,7 @@ def test_sequence_3():
r = RSTWriter()
# Plug in test data
# r.rst_text = SEQ_NUMBERS
- r.rst_text = SEQ_3.splitlines(keepends=True)
+ r.rst_text = SEQ_3.splitlines(keepends=True) # type: ignore
r.filename = "testdata.py"
r.current_module = "testdata"
r.max_line = len(r.rst_text) - 1
@@ -181,7 +181,7 @@ def test_sequence_functions():
r = RSTWriter()
# Plug in test data
- r.rst_text = FUNCTION_SEQ.splitlines(keepends=True)
+ r.rst_text = FUNCTION_SEQ.splitlines(keepends=True) # type: ignore
r.filename = "re.py"
r.current_module = "re"
r.max_line = len(r.rst_text) - 1
@@ -234,7 +234,7 @@ def test_sequence_methods():
r = RSTWriter()
# Plug in test data
- r.rst_text = CLASS_METHOD_SEQ.splitlines(keepends=True)
+ r.rst_text = CLASS_METHOD_SEQ.splitlines(keepends=True) # type: ignore
r.filename = "re.py"
r.current_module = "re"
r.max_line = len(r.rst_text) - 1
diff --git a/tests/snippets/test_snippet_filter.py b/tests/snippets/test_snippet_filter.py
new file mode 100644
index 00000000..14e73f00
--- /dev/null
+++ b/tests/snippets/test_snippet_filter.py
@@ -0,0 +1,49 @@
+from pathlib import Path
+from typing import Dict, List
+
+import pytest
+
+# Assuming the functions filter_issues and stub_ignore are in a module named 'mymodule'
+from snippets.test_snippets import stub_ignore
+
+
+@pytest.mark.parametrize(
+ "line, version, port, board, ignore",
+ [
+ (
+ "import espnow # stubs-ignore: version<1.21.0 or port.startswith('esp')",
+ "1.21.0",
+ "esp32",
+ "",
+ True,
+ ),
+ (
+ "import espnow # stubs-ignore: skip port.lower().startswith('pybd')",
+ "1.21.0",
+ "PYBD_SF6",
+ "",
+ True,
+ ),
+ ("import espnow # stubs-ignore: version < 1.21.0", "1.20.0", "esp32", "", True),
+ ("import espnow # stubs-ignore : version < 1.21.0", "1.20.0", "esp32", "", True),
+ ("import espnow # stubs-ignore :version<1.21.0", "1.20.0", "esp32", "", True),
+ ("import espnow # stubs-ignore:skip version < 1.21.0", "1.20.0", "esp32", "", True),
+ ("import espnow # stubs-ignore : skip version < 1.21.0", "1.20.0", "esp32", "", True),
+ ("import espnow # stubs-ignore :skip version<1.21.0", "1.20.0", "esp32", "", True),
+ ("version<1.21.0", "1.21.0", "esp32", "", False),
+ ("invalid condition", "1.21.0", "esp32", "", False),
+ ],
+)
+def test_stub_ignore(line, version, port, board, ignore):
+ is_source = "#" in line
+ assert (
+ stub_ignore(
+ line,
+ version,
+ port,
+ board,
+ linter="pytest",
+ is_source=is_source,
+ )
+ == ignore
+ )