Skip to content

Commit 06eb686

Browse files
authored
Merge pull request #90 from ArcanaFramework/touch-ups
2 parents d1916d1 + 4fee622 commit 06eb686

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

extras/fileformats/extras/application/medical.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1+
import sys
12
import typing as ty
23
from pathlib import Path
3-
from typing_extensions import TypeAlias
44
import pydicom.tag
55
from fileformats.core import FileSet, extra_implementation
66
from fileformats.application import Dicom
77
import medimages4tests.dummy.dicom.mri.t1w.siemens.skyra.syngo_d13c
88
from fileformats.core import SampleFileGenerator
99

10+
if sys.version_info <= (3, 11):
11+
from typing_extensions import TypeAlias
12+
else:
13+
from typing import TypeAlias
14+
1015
TagListType: TypeAlias = ty.Union[
1116
ty.List[int],
1217
ty.List[str],

fileformats/core/sampling.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import fileformats.core
77

88

9+
FILE_FILL_LENGTH_DEFAULT = 256
10+
11+
912
class SampleFileGenerator:
1013
"""Generates sample files. Designed to be used within generate_sample_data overrides
1114
@@ -48,6 +51,14 @@ def _generate_fname_stem(self) -> str:
4851
def rng(self) -> random.Random:
4952
return random.Random(self.seed)
5053

54+
def generate_contents(
55+
self, binary: bool, fill: int = FILE_FILL_LENGTH_DEFAULT
56+
) -> ty.Union[str, bytes]:
57+
if binary:
58+
return bytes(self.rng.choices(list(range(256)), k=fill))
59+
else:
60+
return "".join(self.rng.choices(string.printable, k=fill))
61+
5162
def generate(
5263
self,
5364
file_type: ty.Union[
@@ -88,14 +99,12 @@ def generate(
8899
fspath.parent.mkdir(parents=True, exist_ok=True)
89100
is_binary: bool = getattr(file_type, "binary", False)
90101
if not contents:
91-
contents = (
92-
bytes(random.choices(list(range(256)), k=fill))
93-
if is_binary
94-
else "".join(random.choices(string.printable, k=fill))
102+
contents = self.generate_contents(
103+
is_binary, fill if fill else FILE_FILL_LENGTH_DEFAULT
95104
)
96105
else:
97106
contents_type = bytes if is_binary else str
98-
if not isinstance(contents, bytes):
107+
if not isinstance(contents, contents_type):
99108
raise TypeError(
100109
f"contents must be {contents_type} for {file_type} files, "
101110
f"not {type(contents)}"

fileformats/generic/generate_sample_data.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,19 @@ def file_generate_sample_data(
3030
contents = None
3131
if getattr(file, "binary", False):
3232
if hasattr(file, "magic_number"):
33+
contents = generator.generate_contents(binary=True)
34+
magic_number: bytes
35+
if isinstance(file.magic_number, str):
36+
magic_number = bytes.fromhex(file.magic_number)
37+
else:
38+
magic_number = file.magic_number
3339
offset = getattr(file, "magic_number_offset", 0)
34-
contents = os.urandom(offset)
35-
magic_number = getattr(file, "magic_number", b"")
36-
if isinstance(magic_number, str):
37-
magic_number = bytes.fromhex(magic_number)
38-
contents += magic_number
40+
if offset < 0:
41+
postamble = os.urandom(-(len(magic_number) + offset))
42+
contents += magic_number + postamble # type: ignore[operator]
43+
else:
44+
preamble = generator.generate_contents(binary=True, fill=offset)
45+
contents = preamble + magic_number + contents # type: ignore[operator]
3946
elif hasattr(file, "magic_pattern"):
4047
raise NotImplementedError(
4148
"Sampling of magic version file types is not implemented yet"

0 commit comments

Comments
 (0)