Source code for cle.backends.static_archive

import logging

from cle.errors import CLEError

from .backend import Backend, register_backend

try:
    import arpy
except ImportError:
    arpy = None

log = logging.getLogger(__name__)


[docs]class StaticArchive(Backend):
[docs] @classmethod def is_compatible(cls, stream): stream.seek(0) return stream.read(8) == b"!<arch>\n"
is_default = True
[docs] def __init__(self, *args, **kwargs): if arpy is None: raise CLEError("run `pip install arpy==1.1.1` to load archive files") super().__init__(*args, **kwargs) # hack: we are using a loader internal method in a non-kosher way which will cause our children to be # marked as the main binary if we are also the main binary # work around this by setting ourself here: if self.loader._main_object is None: self.loader._main_object = self ar = arpy.Archive(fileobj=self._binary_stream) ar.read_all_headers() for name, stream in ar.archived_files.items(): child = self.loader._load_object_isolated(stream) child.binary = child.binary_basename = name.decode() child.parent_object = self self.child_objects.append(child) if self.child_objects: self._arch = self.child_objects[0].arch else: log.warning("Loaded empty static archive?") self.has_memory = False self.pic = True # hack pt. 2 if self.loader._main_object is self: self.loader._main_object = None
register_backend("AR", StaticArchive)