[Script] Fixed export function to work with Optional (requires python 3.8+)
This commit is contained in:
parent
824ffc8675
commit
7074c29d63
|
@ -1,43 +1,63 @@
|
|||
#!/usr/bin/python3
|
||||
import inspect
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
import pkg_resources
|
||||
|
||||
|
||||
class InterfaceGenerator:
|
||||
known = []
|
||||
classes = {}
|
||||
mapper = {"str": "string", "int": "number", "float": "number", "datetime": "Date"}
|
||||
mapper = {"str": "string", "int": "number", "float": "number", "datetime": "Date", "NoneType": "null"}
|
||||
|
||||
def __init__(self, namespace, filename):
|
||||
self.basename = ""
|
||||
self.namespace = namespace
|
||||
self.filename = filename
|
||||
self.this_type = None
|
||||
|
||||
def pytype(self, cls):
|
||||
if isinstance(cls, list):
|
||||
return "", "Array<{}>".format(self.pytype(cls[0])[1])
|
||||
# if typing.get_origin(cls) is typing.Optional:
|
||||
# return "?", pytype(typing.get_args(cls)[1])
|
||||
if sys.version_info >= (3, 8):
|
||||
import typing
|
||||
|
||||
if isinstance(cls, typing.ForwardRef):
|
||||
return "", "this" if cls.__forward_arg__ == self.this_type else cls.__forward_arg__
|
||||
if typing.get_origin(cls) == typing.Union:
|
||||
types = typing.get_args(cls)
|
||||
if len(types) == 2 and types[-1] is type(None):
|
||||
return "?", self.pytype(types[0])[1]
|
||||
else:
|
||||
return "", "|".join([self.pytype(pt)[1] for pt in types])
|
||||
if hasattr(cls, "__name__"):
|
||||
if cls.__name__ in self.mapper:
|
||||
return "", self.mapper[cls.__name__]
|
||||
else:
|
||||
return "", cls.__name__
|
||||
print(
|
||||
"WARNING: This python version might not detect all types (try >= 3.8). Could not identify >{}<".format(cls)
|
||||
)
|
||||
return "?", "any"
|
||||
|
||||
def walker(self, module):
|
||||
if inspect.ismodule(module[1]) and module[1].__name__.startswith(self.basename) and module[1].__name__ not in self.known:
|
||||
if (
|
||||
inspect.ismodule(module[1])
|
||||
and module[1].__name__.startswith(self.basename)
|
||||
and module[1].__name__ not in self.known
|
||||
):
|
||||
self.known.append(module[1].__name__)
|
||||
for cls in inspect.getmembers(module[1], lambda x: inspect.isclass(x) or inspect.ismodule(x)):
|
||||
self.walker(cls)
|
||||
elif (
|
||||
inspect.isclass(module[1])
|
||||
and module[1].__module__.startswith(self.basename)
|
||||
and module[0] not in self.classes
|
||||
and not module[0].startswith("_")
|
||||
and hasattr(module[1], "__annotations__")
|
||||
inspect.isclass(module[1])
|
||||
and module[1].__module__.startswith(self.basename)
|
||||
and module[0] not in self.classes
|
||||
and not module[0].startswith("_")
|
||||
and hasattr(module[1], "__annotations__")
|
||||
):
|
||||
self.this_type = module[0]
|
||||
d = {
|
||||
param: self.pytype(ptype)
|
||||
for param, ptype in module[1].__annotations__.items()
|
||||
|
|
Loading…
Reference in New Issue