@dataclass
class Function:
id: str
qname: str
decorators: list[str]
parameters: list[Parameter]
results: list[Result]
is_public: bool
reexported_by: list[str]
documentation: FunctionDocumentation
code: str
formatted_code: Optional[str] = field(init=False)
def __post_init__(self) -> None:
self.formatted_code = None
@staticmethod
def from_json(json: Any) -> Function:
return Function(
json["id"],
json["qname"],
json.get("decorators", []),
[
Parameter.from_json(parameter_json)
for parameter_json in json.get("parameters", [])
],
[Result.from_json(result_json) for result_json in json.get("results", [])],
json.get("is_public", True),
json.get("reexported_by", []),
FunctionDocumentation(
description=json.get("description", ""),
full_docstring=json.get("docstring", ""),
),
json.get("code", ""),
)
@property
def name(self) -> str:
return self.qname.rsplit(".", maxsplit=1)[-1]
def to_json(self) -> Any:
return {
"id": self.id,
"name": self.name,
"qname": self.qname,
"decorators": self.decorators,
"parameters": [parameter.to_json() for parameter in self.parameters],
"results": [result.to_json() for result in self.results],
"is_public": self.is_public,
"reexported_by": self.reexported_by,
"description": self.documentation.description,
"docstring": self.documentation.full_docstring,
"code": self.code,
}
def get_formatted_code(self) -> str:
if self.formatted_code is None:
self.formatted_code = _generate_formatted_code(self)
return self.formatted_code
def __repr__(self) -> str:
return "Function(id=" + self.id + ")"
def __hash__(self) -> int:
return hash(
(
self.id,
self.name,
self.qname,
frozenset(self.decorators),
frozenset(self.parameters),
frozenset(self.results),
self.is_public,
frozenset(self.reexported_by),
self.documentation,
self.code,
)
)