Spaces:
Runtime error
Runtime error
from __future__ import annotations | |
from abc import ABC, abstractmethod | |
from pathlib import Path | |
from typing import Any, Dict | |
from gradio import processing_utils, utils | |
class Serializable(ABC): | |
def serialize( | |
self, x: Any, load_dir: str | Path = "", encryption_key: bytes | None = None | |
): | |
""" | |
Convert data from human-readable format to serialized format for a browser. | |
""" | |
pass | |
def deserialize( | |
self, | |
x: Any, | |
save_dir: str | Path | None = None, | |
encryption_key: bytes | None = None, | |
): | |
""" | |
Convert data from serialized format for a browser to human-readable format. | |
""" | |
pass | |
class SimpleSerializable(Serializable): | |
def serialize( | |
self, x: Any, load_dir: str | Path = "", encryption_key: bytes | None = None | |
) -> Any: | |
""" | |
Convert data from human-readable format to serialized format. For SimpleSerializable components, this is a no-op. | |
Parameters: | |
x: Input data to serialize | |
load_dir: Ignored | |
encryption_key: Ignored | |
""" | |
return x | |
def deserialize( | |
self, | |
x: Any, | |
save_dir: str | Path | None = None, | |
encryption_key: bytes | None = None, | |
): | |
""" | |
Convert data from serialized format to human-readable format. For SimpleSerializable components, this is a no-op. | |
Parameters: | |
x: Input data to deserialize | |
save_dir: Ignored | |
encryption_key: Ignored | |
""" | |
return x | |
class ImgSerializable(Serializable): | |
def serialize( | |
self, | |
x: str | None, | |
load_dir: str | Path = "", | |
encryption_key: bytes | None = None, | |
) -> str | None: | |
""" | |
Convert from human-friendly version of a file (string filepath) to a seralized | |
representation (base64). | |
Parameters: | |
x: String path to file to serialize | |
load_dir: Path to directory containing x | |
encryption_key: Used to encrypt the file | |
""" | |
if x is None or x == "": | |
return None | |
return processing_utils.encode_url_or_file_to_base64( | |
Path(load_dir) / x, encryption_key=encryption_key | |
) | |
def deserialize( | |
self, | |
x: str | None, | |
save_dir: str | Path | None = None, | |
encryption_key: bytes | None = None, | |
) -> str | None: | |
""" | |
Convert from serialized representation of a file (base64) to a human-friendly | |
version (string filepath). Optionally, save the file to the directory specified by save_dir | |
Parameters: | |
x: Base64 representation of image to deserialize into a string filepath | |
save_dir: Path to directory to save the deserialized image to | |
encryption_key: Used to decrypt the file | |
""" | |
if x is None or x == "": | |
return None | |
file = processing_utils.decode_base64_to_file( | |
x, dir=save_dir, encryption_key=encryption_key | |
) | |
return file.name | |
class FileSerializable(Serializable): | |
def serialize( | |
self, | |
x: str | None, | |
load_dir: str | Path = "", | |
encryption_key: bytes | None = None, | |
) -> Dict | None: | |
""" | |
Convert from human-friendly version of a file (string filepath) to a | |
seralized representation (base64) | |
Parameters: | |
x: String path to file to serialize | |
load_dir: Path to directory containing x | |
encryption_key: Used to encrypt the file | |
""" | |
if x is None or x == "": | |
return None | |
filename = Path(load_dir) / x | |
return { | |
"name": filename, | |
"data": processing_utils.encode_url_or_file_to_base64( | |
filename, encryption_key=encryption_key | |
), | |
"orig_name": Path(filename).name, | |
"is_file": False, | |
} | |
def deserialize( | |
self, | |
x: str | Dict | None, | |
save_dir: Path | str | None = None, | |
encryption_key: bytes | None = None, | |
) -> str | None: | |
""" | |
Convert from serialized representation of a file (base64) to a human-friendly | |
version (string filepath). Optionally, save the file to the directory specified by `save_dir` | |
Parameters: | |
x: Base64 representation of file to deserialize into a string filepath | |
save_dir: Path to directory to save the deserialized file to | |
encryption_key: Used to decrypt the file | |
""" | |
if x is None: | |
return None | |
if isinstance(save_dir, Path): | |
save_dir = str(save_dir) | |
if isinstance(x, str): | |
file_name = processing_utils.decode_base64_to_file( | |
x, dir=save_dir, encryption_key=encryption_key | |
).name | |
elif isinstance(x, dict): | |
if x.get("is_file", False): | |
if utils.validate_url(x["name"]): | |
file_name = x["name"] | |
else: | |
file_name = processing_utils.create_tmp_copy_of_file( | |
x["name"], dir=save_dir | |
).name | |
else: | |
file_name = processing_utils.decode_base64_to_file( | |
x["data"], dir=save_dir, encryption_key=encryption_key | |
).name | |
else: | |
raise ValueError( | |
f"A FileSerializable component cannot only deserialize a string or a dict, not a: {type(x)}" | |
) | |
return file_name | |
class JSONSerializable(Serializable): | |
def serialize( | |
self, | |
x: str | None, | |
load_dir: str | Path = "", | |
encryption_key: bytes | None = None, | |
) -> Dict | None: | |
""" | |
Convert from a a human-friendly version (string path to json file) to a | |
serialized representation (json string) | |
Parameters: | |
x: String path to json file to read to get json string | |
load_dir: Path to directory containing x | |
encryption_key: Ignored | |
""" | |
if x is None or x == "": | |
return None | |
return processing_utils.file_to_json(Path(load_dir) / x) | |
def deserialize( | |
self, | |
x: str | Dict, | |
save_dir: str | Path | None = None, | |
encryption_key: bytes | None = None, | |
) -> str | None: | |
""" | |
Convert from serialized representation (json string) to a human-friendly | |
version (string path to json file). Optionally, save the file to the directory specified by `save_dir` | |
Parameters: | |
x: Json string | |
save_dir: Path to save the deserialized json file to | |
encryption_key: Ignored | |
""" | |
if x is None: | |
return None | |
return processing_utils.dict_or_str_to_json_file(x, dir=save_dir).name | |