Skip to content

Module omnipy.modules.json.serializers

Overview

View Source
from typing import IO, Type

from omnipy.data.dataset import Dataset

from omnipy.data.serializer import TarFileSerializer

from .datasets import JsonBaseDataset, JsonDataset

from .models import JsonModel

class JsonDatasetToTarFileSerializer(TarFileSerializer):

    """"""

    @classmethod

    def is_dataset_directly_supported(cls, dataset: Dataset) -> bool:

        return isinstance(dataset, JsonBaseDataset)

    @classmethod

    def get_dataset_cls_for_new(cls) -> Type[Dataset]:

        return JsonDataset

    @classmethod

    def get_output_file_suffix(cls) -> str:

        return 'json'

    @classmethod

    def serialize(cls, json_dataset: JsonBaseDataset) -> bytes | memoryview:

        def json_encode_func(json_data: JsonModel) -> bytes:

            return json_data.json(indent=2).encode('utf8')

        return cls.create_tarfile_from_dataset(json_dataset, data_encode_func=json_encode_func)

    @classmethod

    def deserialize(cls, tarfile_bytes: bytes) -> JsonDataset:

        json_dataset = JsonDataset()

        def json_decode_func(file_stream: IO[bytes]) -> str:

            return file_stream.read().decode('utf8')

        def json_dictify_object(obj_type: str, obj_val: str) -> dict[str, str]:

            return {f'{obj_type}': f'{obj_val}'}

        cls.create_dataset_from_tarfile(

            json_dataset,

            tarfile_bytes,

            data_decode_func=json_decode_func,

            dictify_object_func=json_dictify_object,

            import_method='from_json')

        return json_dataset

Classes

JsonDatasetToTarFileSerializer

class JsonDatasetToTarFileSerializer(
    /,
    *args,
    **kwargs
)
View Source
class JsonDatasetToTarFileSerializer(TarFileSerializer):

    """"""

    @classmethod

    def is_dataset_directly_supported(cls, dataset: Dataset) -> bool:

        return isinstance(dataset, JsonBaseDataset)

    @classmethod

    def get_dataset_cls_for_new(cls) -> Type[Dataset]:

        return JsonDataset

    @classmethod

    def get_output_file_suffix(cls) -> str:

        return 'json'

    @classmethod

    def serialize(cls, json_dataset: JsonBaseDataset) -> bytes | memoryview:

        def json_encode_func(json_data: JsonModel) -> bytes:

            return json_data.json(indent=2).encode('utf8')

        return cls.create_tarfile_from_dataset(json_dataset, data_encode_func=json_encode_func)

    @classmethod

    def deserialize(cls, tarfile_bytes: bytes) -> JsonDataset:

        json_dataset = JsonDataset()

        def json_decode_func(file_stream: IO[bytes]) -> str:

            return file_stream.read().decode('utf8')

        def json_dictify_object(obj_type: str, obj_val: str) -> dict[str, str]:

            return {f'{obj_type}': f'{obj_val}'}

        cls.create_dataset_from_tarfile(

            json_dataset,

            tarfile_bytes,

            data_decode_func=json_decode_func,

            dictify_object_func=json_dictify_object,

            import_method='from_json')

        return json_dataset

Static methods

create_dataset_from_tarfile
def create_dataset_from_tarfile(
    dataset: omnipy.data.dataset.Dataset,
    tarfile_bytes: bytes,
    data_decode_func: Callable[[IO[bytes]], Any],
    dictify_object_func: Callable[[str, Any], dict | str],
    import_method='from_data'
)

Parameters:

Name Type Description Default
dataset Dataset
tarfile_bytes bytes
data_decode_func Callable[[IO[bytes]], Any]
dictify_object_func Callable[[str, Any], dict str]
import_method from_data
View Source
    @classmethod

    def create_dataset_from_tarfile(cls,

                                    dataset: Dataset,

                                    tarfile_bytes: bytes,

                                    data_decode_func: Callable[[IO[bytes]], Any],

                                    dictify_object_func: Callable[[str, Any], dict | str],

                                    import_method='from_data'):

        with tarfile.open(fileobj=BytesIO(tarfile_bytes), mode='r:gz') as tarfile_stream:

            for filename in tarfile_stream.getnames():

                obj_type_file = tarfile_stream.extractfile(filename)

                assert filename.endswith(f'.{cls.get_output_file_suffix()}')

                obj_type = '.'.join(filename.split('.')[:-1])

                getattr(dataset, import_method)(

                    dictify_object_func(obj_type, data_decode_func(obj_type_file)))
create_tarfile_from_dataset
def create_tarfile_from_dataset(
    dataset: omnipy.data.dataset.Dataset,
    data_encode_func: Callable[[Any], bytes | memoryview]
)

Parameters:

Name Type Description Default
dataset Dataset
data_encode_func Callable[[Any], bytes memoryview]
View Source
    @classmethod

    def create_tarfile_from_dataset(cls,

                                    dataset: Dataset,

                                    data_encode_func: Callable[[Any], bytes | memoryview]):

        bytes_io = BytesIO()

        with tarfile.open(fileobj=bytes_io, mode='w:gz') as tarfile_stream:

            for obj_type, data_obj in dataset.items():

                json_data_bytestream = BytesIO(data_encode_func(data_obj))

                json_data_bytestream.seek(0)

                tarinfo = TarInfo(name=f'{obj_type}.{cls.get_output_file_suffix()}')

                tarinfo.size = len(json_data_bytestream.getbuffer())

                tarfile_stream.addfile(tarinfo, json_data_bytestream)

        return bytes_io.getbuffer().tobytes()
deserialize
def deserialize(
    tarfile_bytes: bytes
) -> omnipy.modules.json.datasets.JsonDataset

Parameters:

Name Type Description Default
tarfile_bytes bytes

Returns:

Type Description
JsonDataset
View Source
    @classmethod

    def deserialize(cls, tarfile_bytes: bytes) -> JsonDataset:

        json_dataset = JsonDataset()

        def json_decode_func(file_stream: IO[bytes]) -> str:

            return file_stream.read().decode('utf8')

        def json_dictify_object(obj_type: str, obj_val: str) -> dict[str, str]:

            return {f'{obj_type}': f'{obj_val}'}

        cls.create_dataset_from_tarfile(

            json_dataset,

            tarfile_bytes,

            data_decode_func=json_decode_func,

            dictify_object_func=json_dictify_object,

            import_method='from_json')

        return json_dataset
get_dataset_cls_for_new
def get_dataset_cls_for_new(

) -> Type[omnipy.data.dataset.Dataset]

Returns:

Type Description
Type[Dataset]
View Source
    @classmethod

    def get_dataset_cls_for_new(cls) -> Type[Dataset]:

        return JsonDataset
get_output_file_suffix
def get_output_file_suffix(

) -> str

Returns:

Type Description
str
View Source
    @classmethod

    def get_output_file_suffix(cls) -> str:

        return 'json'
is_dataset_directly_supported
def is_dataset_directly_supported(
    dataset: omnipy.data.dataset.Dataset
) -> bool

Parameters:

Name Type Description Default
dataset Dataset

Returns:

Type Description
bool
View Source
    @classmethod

    def is_dataset_directly_supported(cls, dataset: Dataset) -> bool:

        return isinstance(dataset, JsonBaseDataset)
serialize
def serialize(
    json_dataset: omnipy.modules.json.datasets.JsonBaseDataset
) -> bytes | memoryview

Parameters:

Name Type Description Default
json_dataset JsonBaseDataset

Returns:

Type Description
bytes memoryview
View Source
    @classmethod

    def serialize(cls, json_dataset: JsonBaseDataset) -> bytes | memoryview:

        def json_encode_func(json_data: JsonModel) -> bytes:

            return json_data.json(indent=2).encode('utf8')

        return cls.create_tarfile_from_dataset(json_dataset, data_encode_func=json_encode_func)