def __make_pydantic(cls): """ Temporary wrapper function to convert an MSONable class into a PyDantic Model for the sake of building schemas """ if any(cls == T for T in built_in_primitives): return cls if cls in prim_to_type_hint: return prim_to_type_hint[cls] if cls == Any: return Any if type(cls) == TypeVar: return cls if hasattr(cls, "__origin__") and hasattr(cls, "__args__"): args = tuple(__make_pydantic(arg) for arg in cls.__args__) if cls.__origin__ == Union: return Union.__getitem__(args) if cls.__origin__ == Optional and len(args) == 1: return Optional.__getitem__(args) if cls._name == "List": return List.__getitem__(args) if cls._name == "Tuple": return Tuple.__getitem__(args) if cls._name == "Set": return Set.__getitem__(args) if cls._name == "Sequence": return Sequence.__getitem__(args) if issubclass(cls, MSONable): if cls.__name__ not in STUBS: STUBS[cls] = MSONable_to_pydantic(cls) return STUBS[cls] if cls == ndarray: return List[Any] return cls
def LikeNamedTuple(nt: Union[str, typing.NamedTupleMeta]) -> type: if isinstance(nt, str): return typing.ForwardRef(f'LikeNamedTuple({nt})') field_types = tuple(nt.__annotations__[f] for f in nt._fields) return Union[nt, Tuple.__getitem__(field_types)]