72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
from pydash.strings import snake_case
|
|
|
|
from guardrails.classes.generic.serializeable import (
|
|
Serializeable,
|
|
SerializeableJSONEncoder,
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class Contributor(Serializeable):
|
|
name: str
|
|
email: str
|
|
|
|
|
|
@dataclass
|
|
class Repository(Serializeable):
|
|
url: str
|
|
branch: Optional[str] = None
|
|
|
|
|
|
@dataclass
|
|
class ModuleTags(Serializeable):
|
|
content_type: Optional[List[str]] = field(default_factory=list)
|
|
validation_category: Optional[List[str]] = field(default_factory=list)
|
|
process_requirements: Optional[List[str]] = field(default_factory=list)
|
|
has_guardrails_endpoint: Optional[bool] = field(default_factory=bool)
|
|
|
|
|
|
@dataclass
|
|
class ModelAuth(Serializeable):
|
|
type: str
|
|
name: str
|
|
displayName: Optional[str] = None
|
|
|
|
|
|
@dataclass
|
|
class ModuleManifest(Serializeable):
|
|
id: str
|
|
name: str
|
|
author: Contributor
|
|
maintainers: List[Contributor]
|
|
repository: Repository
|
|
namespace: str
|
|
package_name: str
|
|
module_name: str
|
|
exports: List[str]
|
|
tags: Optional[ModuleTags] = None
|
|
requires_auth: Optional[bool] = True
|
|
post_install: Optional[str] = None
|
|
index: Optional[str] = None
|
|
required_model_auth: Optional[List[ModelAuth]] = field(default_factory=list)
|
|
|
|
# @override
|
|
@classmethod
|
|
def from_dict(cls, data: Dict[str, Any]):
|
|
init_kwargs = {snake_case(k): data.get(k) for k in data}
|
|
init_kwargs["encoder"] = init_kwargs.get("encoder", SerializeableJSONEncoder)
|
|
author = init_kwargs.pop("author", {})
|
|
maintainers = init_kwargs.pop("maintainers", [])
|
|
repository = init_kwargs.pop("repository", {})
|
|
tags = init_kwargs.pop("tags", {})
|
|
return cls(
|
|
**init_kwargs,
|
|
author=Contributor.from_dict(author), # type: ignore
|
|
maintainers=[Contributor.from_dict(m) for m in maintainers], # type: ignore
|
|
repository=Repository.from_dict(repository), # type: ignore
|
|
tags=ModuleTags.from_dict(tags), # type: ignore
|
|
)
|