Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions fileformats/datascience/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from .scripts import RFile, IPythonNotebook
from .object_serialization import (
Pickle,
Pickle___Gzip,
Pickle__Gzip,
)

__all__ = [
Expand All @@ -26,5 +26,5 @@
"RFile",
"IPythonNotebook",
"Pickle",
"Pickle___Gzip",
"Pickle__Gzip",
]
17 changes: 12 additions & 5 deletions fileformats/datascience/object_serialization.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
from fileformats.generic import BinaryFile
from fileformats.core.mixin import WithMagicNumber
from fileformats.application import Gzip
from fileformats.core.mixin import WithMagicVersion
from fileformats.generic import BinaryFile


class ObjectSerialisation(BinaryFile): ...


class Pickle(WithMagicNumber, ObjectSerialisation):
class Pickle(WithMagicVersion, ObjectSerialisation):
"""Python's native byte-encoded serialization format"""

ext = ".pkl"
magic_number = "8004"
magic_pattern = rb"\x80([\x02-\xff])"
magic_pattern_maxlength = 2

@classmethod
def decode_version(cls, version_bytes: bytes) -> str:
# The protocol version is stored as the integer value
# of the byte
return str(version_bytes[0])


class Pickle___Gzip(Gzip[Pickle]): # type: ignore[type-arg]
class Pickle__Gzip(Gzip[Pickle]): # type: ignore[type-arg]
"""Python pickle file that has been gzipped"""

ext = "pkl.gz"
Expand Down
6 changes: 3 additions & 3 deletions fileformats/datascience/tests/test_mime.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from fileformats.core import from_mime
from fileformats.datascience import Pickle___Gzip
from fileformats.datascience import Pickle__Gzip


def test_native_container_roundtrip() -> None:

mime = Pickle___Gzip.mime_like
assert Pickle___Gzip is from_mime(mime)
mime = Pickle__Gzip.mime_like
assert Pickle__Gzip is from_mime(mime)
Loading