Added hierarchical printing to container and segment

This commit is contained in:
Rob McMullen 2019-03-25 09:43:01 -07:00
parent a6f5ed0a0a
commit 1817483b3c
4 changed files with 54 additions and 6 deletions

View File

@ -7,6 +7,7 @@ import numpy as np
from . import errors from . import errors
from . import style_bits from . import style_bits
from .utils import to_numpy, to_numpy_list, uuid from .utils import to_numpy, to_numpy_list, uuid
from . import media_type
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -42,6 +43,7 @@ class Container:
self.segments = [] self.segments = []
self.header = None self.header = None
self.filesystem = None self.filesystem = None
self._media_type = None
self._data = None self._data = None
self._style = None self._style = None
@ -74,7 +76,7 @@ class Container:
@data.setter @data.setter
def data(self, value): def data(self, value):
if self._data is not None: if self._data is not None:
raise errors.ReadOnlyContainer("media_type already populated with data") raise errors.ReadOnlyContainer("container already populated with data")
raw = value.tobytes() raw = value.tobytes()
try: try:
unpacked = self.calc_unpacked_bytes(raw) unpacked = self.calc_unpacked_bytes(raw)
@ -100,6 +102,29 @@ class Container:
def header_length(self): def header_length(self):
return len(self.header) if self.header is not None else 0 return len(self.header) if self.header is not None else 0
@property
def media_type(self):
return self._media_type
@media_type.setter
def media_type(self, value):
self._media_type = value
self.segments = []
if value.header:
self.header = value.header
self.segments.append(self.header)
self.segments.append(value)
@property
def verbose_info(self):
lines = []
name = self.verbose_name or self.name
lines.append(f"{name}: {len(self)} bytes")
for s in self.segments:
v = s.segment_info(" ")
lines.extend(v)
return "\n".join(lines)
#### dunder methods #### dunder methods
def __str__(self): def __str__(self):
@ -148,6 +173,18 @@ class Container:
""" """
return np_data return np_data
#### media
def guess_media_type(self):
media = media_type.guess_media_type(self)
self.media_type = media
def guess_filesystem(self):
fs = filesystem.guess_filesystem(self.media_type)
if fs is not None:
self.filesystem = fs
self.segments.append(fs)
#### serialization #### serialization
def __getstate__(self): def __getstate__(self):

View File

@ -65,6 +65,11 @@ class MediaType(Segment):
""" """
pass pass
def find_filesystem(self):
fs = filesystem.guess_filesystem(self)
if fs:
self.segments = list(fs.iter_segments())
class DiskImage(MediaType): class DiskImage(MediaType):
pretty_name = "Disk Image" pretty_name = "Disk Image"

View File

@ -94,7 +94,7 @@ class Segment:
origin = " @ %04x" % (self.origin) origin = " @ %04x" % (self.origin)
else: else:
origin = "" origin = ""
s = "%s ($%x bytes%s)" % (self.name, len(self), origin) s = "%s (%d bytes%s)" % (self.name, len(self), origin)
if self.error: if self.error:
s += " " + self.error s += " " + self.error
return s return s
@ -142,7 +142,7 @@ class Segment:
def create_subset(self, new_order, *args, **kwargs): def create_subset(self, new_order, *args, **kwargs):
new_order_of_source = self.container_offset[new_order] new_order_of_source = self.container_offset[new_order]
segment = DefaultSegment(self.container, new_order_of_source, *args, **kwargs) segment = Segment(self.container, new_order_of_source, *args, **kwargs)
return segment return segment
#### serialization #### serialization
@ -212,6 +212,13 @@ class Segment:
s += " error='%s'" % self.error s += " error='%s'" % self.error
return s return s
def segment_info(self, indent=""):
lines = []
lines.append(indent + str(self))
for s in self.segments:
lines.extend(s.segment_info(indent + " "))
return lines
def is_valid_index(self, i): def is_valid_index(self, i):
return i >= 0 and i < len(self) return i >= 0 and i < len(self)

View File

@ -56,9 +56,8 @@ if __name__ == "__main__":
print(f"checking {pathname}") print(f"checking {pathname}")
sample_data = np.fromfile(pathname, dtype=np.uint8) sample_data = np.fromfile(pathname, dtype=np.uint8)
container = guess_container(sample_data) container = guess_container(sample_data)
print(container) container.guess_media_type()
media = guess_media_type(container) print(container.verbose_info)
print(f"{pathname}: {media}")
import sys import sys
import glob import glob