diff --git a/flaschengeist/utils/HTTP.py b/flaschengeist/utils/HTTP.py new file mode 100644 index 0000000..e69de29 diff --git a/run_flaschengeist b/run_flaschengeist index b9d7429..e7419cb 100644 --- a/run_flaschengeist +++ b/run_flaschengeist @@ -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()