def _write_after(self) -> None: super()._write_after() self.fileobj.seek(self._fileobj_blocks_end_pos) self.fileobj.truncate() self.fileobj.write( create_xz_index_footer( self.check, [(block.unpadded_size, block.uncompressed_size) for block in self._fileobjs.values()], ))
def __init__( self, fileobj: IOAbstract, check: int, unpadded_size: int, uncompressed_size: int, ) -> None: self.length = uncompressed_size self.fileobj = IOCombiner( IOStatic(create_xz_header(check)), fileobj, IOStatic( create_xz_index_footer(check, [(unpadded_size, uncompressed_size)])), ) self.reset()
def fileobj() -> BinaryIO: # create xz raw data composed of many identical blocks nb_blocks = 50 seed(0) data = compress(randbytes(BLOCK_SIZE)) header = data[:12] footer = data[-12:] check, backward_size = parse_xz_footer(footer) block = data[12 : -12 - backward_size] records = parse_xz_index(data[-12 - backward_size : -12]) index_footer = create_xz_index_footer(check, records * nb_blocks) return cast( BinaryIO, IOCombiner( IOStatic(header), *[IOStatic(block)] * nb_blocks, IOStatic(index_footer), ), )
def test_create_xz_footer_invalid_check() -> None: with pytest.raises(XZError) as exc_info: create_xz_index_footer(17, []) assert str(exc_info.value) == "footer check"
def test_create_xz_footer(check: int, data: str) -> None: assert create_xz_index_footer(check, [])[-12:] == bytes.fromhex(data)
def test_create_xz_index_invalid() -> None: with pytest.raises(XZError) as exc_info: create_xz_index_footer(1, [(73, 60), (0, 12), (56, 30)]) assert str(exc_info.value) == "index record unpadded size"
def test_create_xz_index(records: List[Tuple[int, int]], data: str) -> None: assert create_xz_index_footer(1, records)[:-12] == bytes.fromhex(data)