class API:
@staticmethod
def from_json(json: Any) -> API:
result = API(json["distribution"], json["package"], json["version"])
for module_json in json.get("modules", []):
result.add_module(Module.from_json(module_json))
for class_json in json.get("classes", []):
result.add_class(Class.from_json(class_json))
for function_json in json.get("functions", []):
result.add_function(Function.from_json(function_json))
return result
def __init__(self, distribution: str, package: str, version: str) -> None:
self.distribution: str = distribution
self.package: str = package
self.version: str = version
self.modules: dict[str, Module] = {}
self.classes: dict[str, Class] = {}
self.functions: dict[str, Function] = {}
def add_module(self, module: Module) -> None:
self.modules[module.id] = module
def add_class(self, class_: Class) -> None:
self.classes[class_.id] = class_
def add_function(self, function: Function) -> None:
self.functions[function.id] = function
def is_public_class(self, class_id: str) -> bool:
return class_id in self.classes and self.classes[class_id].is_public
def is_public_function(self, function_id: str) -> bool:
return function_id in self.functions and self.functions[function_id].is_public
def class_count(self) -> int:
return len(self.classes)
def public_class_count(self) -> int:
return len([it for it in self.classes.values() if it.is_public])
def function_count(self) -> int:
return len(self.functions)
def public_function_count(self) -> int:
return len([it for it in self.functions.values() if it.is_public])
def parameter_count(self) -> int:
return len(self.parameters())
def public_parameter_count(self) -> int:
return len([it for it in self.parameters().values() if it.is_public])
def parameters(self) -> dict[str, Parameter]:
result: dict[str, Parameter] = {}
for function in self.functions.values():
for parameter in function.parameters:
parameter_id = f"{function.id}/{parameter.name}"
result[parameter_id] = parameter
return result
def attributes(self) -> dict[str, Attribute]:
result: dict[str, Attribute] = {}
for class_ in self.classes.values():
for attribute in class_.instance_attributes:
attribute_id = f"{class_.id}/{attribute.name}"
result[attribute_id] = attribute
return result
def results(self) -> dict[str, Result]:
result_dict: dict[str, Result] = {}
for function in self.functions.values():
for result in function.results:
result_id = f"{function.id}/{result.name}"
result_dict[result_id] = result
return result_dict
def get_default_value(self, parameter_id: str) -> Optional[str]:
function_id = parent_id(parameter_id)
if function_id not in self.functions:
return None
for parameter in self.functions[function_id].parameters:
if parameter.id == parameter_id:
return parameter.default_value
return None
def to_json(self) -> Any:
return {
"schemaVersion": API_SCHEMA_VERSION,
"distribution": self.distribution,
"package": self.package,
"version": self.version,
"modules": [
module.to_json()
for module in sorted(self.modules.values(), key=lambda it: it.id)
],
"classes": [
class_.to_json()
for class_ in sorted(self.classes.values(), key=lambda it: it.id)
],
"functions": [
function.to_json()
for function in sorted(self.functions.values(), key=lambda it: it.id)
],
}