summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authordherrada <=>2020-05-18 19:01:50 -0400
committerdherrada <=>2020-05-18 19:01:50 -0400
commit0fa5f6a0dd72d98551079db070efcabdbd2ae2b1 (patch)
tree8de5959a69b4d42d527745ce42af48fc6fa48b28 /tools
parentcf524cb6b19dc971610452986f1ce8d1001d9d7e (diff)
parente67d6756d1dbfe2e7b61b1fbfc2357c3f1f56639 (diff)
Merge branch 'extract-types' of https://github.com/dherrada/circuitpython into extract-types
Diffstat (limited to 'tools')
-rw-r--r--tools/extract_pyi.py77
1 files changed, 40 insertions, 37 deletions
diff --git a/tools/extract_pyi.py b/tools/extract_pyi.py
index 7c664d965..3b30e1ac3 100644
--- a/tools/extract_pyi.py
+++ b/tools/extract_pyi.py
@@ -6,47 +6,46 @@ import traceback
top_level = sys.argv[1].strip("/")
stub_directory = sys.argv[2]
-if top_level.count("/") == 1:
- top_level, module = top_level.split("/")
- modules = [module]
-else:
- modules = os.listdir(top_level)
- modules = sorted(modules)
-
-ok = 0
-total = 0
-for module in modules:
- module_path = os.path.join(top_level, module)
- if not os.path.isdir(module_path):
- continue
+def convert_folder(top_level, stub_directory):
+ ok = 0
+ total = 0
+ filenames = sorted(os.listdir(top_level))
pyi_lines = []
- classes = os.listdir(module_path)
- classes = [x for x in sorted(classes) if x.endswith(".c")]
- if classes and classes[-1] == "__init__.c":
- classes.insert(0, classes.pop())
- for class_file in classes:
- class_path = os.path.join(module_path, class_file)
- with open(class_path, "r") as f:
- for line in f:
- if line.startswith("//|"):
- if line[3] == " ":
- line = line[4:]
- elif line[3] == "\n":
- line = line[3:]
- else:
- continue
- pyi_lines.append(line)
+ for filename in filenames:
+ full_path = os.path.join(top_level, filename)
+ file_lines = []
+ if os.path.isdir(full_path):
+ mok, mtotal = convert_folder(full_path, os.path.join(stub_directory, filename))
+ ok += mok
+ total += mtotal
+ elif filename.endswith(".c"):
+ with open(full_path, "r") as f:
+ for line in f:
+ if line.startswith("//|"):
+ if line[3] == " ":
+ line = line[4:]
+ elif line[3] == "\n":
+ line = line[3:]
+ else:
+ continue
+ file_lines.append(line)
+ elif filename.endswith(".pyi"):
+ with open(full_path, "r") as f:
+ file_lines.extend(f.readlines())
+
+ # Always put the contents from an __init__ first.
+ if filename.startswith("__init__."):
+ pyi_lines = file_lines + pyi_lines
+ else:
+ pyi_lines.extend(file_lines)
- raw_stubs = [x for x in sorted(classes) if x.endswith(".pyi")]
- if raw_stubs and raw_stubs[-1] == "__init__.pyi":
- raw_stubs.insert(0, raw_stubs.pop())
- for raw_stub in raw_stubs:
- raw_stub_path = os.path.join(module_path, raw_stub)
- with open(raw_stub_path, "r") as f:
- pyi_lines.extend(f.readlines())
- stub_filename = os.path.join(stub_directory, module + ".pyi")
+ if not pyi_lines:
+ return ok, total
+
+ stub_filename = os.path.join(stub_directory, "__init__.pyi")
print(stub_filename)
stub_contents = "".join(pyi_lines)
+ os.makedirs(stub_directory, exist_ok=True)
with open(stub_filename, "w") as f:
f.write(stub_contents)
@@ -74,6 +73,10 @@ for module in modules:
except astroid.exceptions.AstroidSyntaxError as e:
e = e.__cause__
traceback.print_exception(type(e), e, e.__traceback__)
+ print()
+ return ok, total
+
+ok, total = convert_folder(top_level, stub_directory)
print(f"{ok} ok out of {total}")