@dataclass
class Class:
id: str
qname: str
decorators: list[str]
superclasses: list[str]
methods: list[str] = field(init=False)
is_public: bool
reexported_by: list[str]
docstring: ClassDocstring
code: str
instance_attributes: list[Attribute]
@staticmethod
def from_dict(d: dict[str, Any]) -> Class:
result = Class(
d["id"],
d["qname"],
d.get("decorators", []),
d.get("superclasses", []),
d.get("is_public", True),
d.get("reexported_by", []),
ClassDocstring(description=d.get("description", "")),
d.get("code", ""),
[
Attribute.from_dict(instance_attribute, d["id"])
for instance_attribute in d.get("instance_attributes", [])
],
)
for method_id in d["methods"]:
result.add_method(method_id)
return result
def __post_init__(self) -> None:
self.methods: list[str] = []
@property
def name(self) -> str:
return self.qname.split(".")[-1]
def add_method(self, method_id: str) -> None:
self.methods.append(method_id)
def to_dict(self) -> dict[str, Any]:
return {
"id": self.id,
"name": self.name,
"qname": self.qname,
"decorators": self.decorators,
"superclasses": self.superclasses,
"methods": self.methods,
"is_public": self.is_public,
"reexported_by": self.reexported_by,
"description": self.docstring.description,
"code": self.code,
"instance_attributes": [attribute.to_dict() for attribute in self.instance_attributes],
}
def get_formatted_code(self, *, cut_documentation: bool = False) -> str:
formatted_code = _generate_formatted_code(self)
if cut_documentation:
formatted_code = _cut_documentation_from_code(formatted_code, self)
return formatted_code