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 style_bits
from .utils import to_numpy, to_numpy_list, uuid
from . import media_type
import logging
log = logging.getLogger(__name__)
@ -42,6 +43,7 @@ class Container:
self.segments = []
self.header = None
self.filesystem = None
self._media_type = None
self._data = None
self._style = None
@ -74,7 +76,7 @@ class Container:
@data.setter
def data(self, value):
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()
try:
unpacked = self.calc_unpacked_bytes(raw)
@ -100,6 +102,29 @@ class Container:
def header_length(self):
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
def __str__(self):
@ -148,6 +173,18 @@ class Container:
"""
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
def __getstate__(self):

View File

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

View File

@ -94,7 +94,7 @@ class Segment:
origin = " @ %04x" % (self.origin)
else:
origin = ""
s = "%s ($%x bytes%s)" % (self.name, len(self), origin)
s = "%s (%d bytes%s)" % (self.name, len(self), origin)
if self.error:
s += " " + self.error
return s
@ -142,7 +142,7 @@ class Segment:
def create_subset(self, new_order, *args, **kwargs):
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
#### serialization
@ -212,6 +212,13 @@ class Segment:
s += " error='%s'" % self.error
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):
return i >= 0 and i < len(self)

View File

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