WIP for py3 support
This commit is contained in:
parent
53bf63d506
commit
841aa1dc9b
|
@ -1,5 +1,6 @@
|
|||
from __future__ import print_function
|
||||
from __future__ import absolute_import
|
||||
from builtins import str
|
||||
import os
|
||||
import sys
|
||||
import zlib
|
||||
|
@ -379,7 +380,7 @@ def run():
|
|||
}
|
||||
# reverse aliases does the inverse mapping of command aliases, including
|
||||
# the identity mapping of "command" to "command"
|
||||
reverse_aliases = {z: k for k, v in command_aliases.iteritems() for z in (v + [k])}
|
||||
reverse_aliases = {z: k for k, v in command_aliases.items() for z in (v + [k])}
|
||||
|
||||
skip_diskimage_summary = set(["crc"])
|
||||
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from builtins import str
|
||||
from builtins import range
|
||||
from past.utils import old_div
|
||||
from builtins import object
|
||||
import numpy as np
|
||||
|
||||
from .errors import *
|
||||
|
@ -221,11 +226,13 @@ class AtariDosDirent(Dirent):
|
|||
return raw[0:num_bytes], num_bytes
|
||||
|
||||
def set_values(self, filename, filetype, index):
|
||||
if "." in filename:
|
||||
filename, ext = filename.split(".", 1)
|
||||
if type(filename) is not bytes:
|
||||
filename = filename.encode("utf-8")
|
||||
if b'.' in filename:
|
||||
filename, ext = filename.split(b'.', 1)
|
||||
else:
|
||||
ext = " "
|
||||
self.basename = "%-8s" % filename[0:8]
|
||||
ext = b' '
|
||||
self.basename = b'%-8s' % filename[0:8]
|
||||
self.ext = ext
|
||||
self.file_num = index
|
||||
self.dos_2 = True
|
||||
|
@ -359,7 +366,7 @@ class AtrHeader(BaseHeader):
|
|||
def encode(self, raw):
|
||||
values = raw.view(dtype=self.format)[0]
|
||||
values[0] = 0x296
|
||||
paragraphs = self.image_size / 16
|
||||
paragraphs = old_div(self.image_size, 16)
|
||||
parshigh, pars = divmod(paragraphs, 256*256)
|
||||
values[1] = pars
|
||||
values[2] = self.sector_size
|
||||
|
@ -395,7 +402,7 @@ class AtrHeader(BaseHeader):
|
|||
self.sectors_per_track = 18
|
||||
self.payload_bytes = self.sector_size - 3
|
||||
initial_bytes = self.initial_sector_size * self.num_initial_sectors
|
||||
self.max_sectors = ((self.image_size - initial_bytes) / self.sector_size) + self.num_initial_sectors
|
||||
self.max_sectors = (old_div((self.image_size - initial_bytes), self.sector_size)) + self.num_initial_sectors
|
||||
|
||||
def get_pos(self, sector):
|
||||
if not self.sector_is_valid(sector):
|
||||
|
@ -487,14 +494,14 @@ class AtariDosDiskImage(DiskImageBase):
|
|||
|
||||
def calc_vtoc_code(self):
|
||||
# From AA post: http://atariage.com/forums/topic/179868-mydos-vtoc-size/
|
||||
num = 1 + (self.total_sectors + 80) / (self.header.sector_size * 8)
|
||||
num = 1 + old_div((self.total_sectors + 80), (self.header.sector_size * 8))
|
||||
if self.header.sector_size == 128:
|
||||
if num == 1:
|
||||
code = 2
|
||||
else:
|
||||
if num & 1:
|
||||
num += 1
|
||||
code = ((num + 1) / 2) + 2
|
||||
code = (old_div((num + 1), 2)) + 2
|
||||
else:
|
||||
if self.total_sectors < 1024:
|
||||
code = 2
|
||||
|
@ -630,7 +637,7 @@ class AtariDosDiskImage(DiskImageBase):
|
|||
dirent.start_read(self)
|
||||
while True:
|
||||
bytes, last, pos, size = dirent.read_sector(self)
|
||||
byte_order.extend(range(pos, pos + size))
|
||||
byte_order.extend(list(range(pos, pos + size)))
|
||||
if last:
|
||||
break
|
||||
if len(byte_order) > 0:
|
||||
|
@ -680,7 +687,7 @@ class BootDiskImage(AtariDosDiskImage):
|
|||
# before the boot sectors are finished loading
|
||||
max_ram = 0xc000
|
||||
max_size = max_ram - bload
|
||||
max_sectors = max_size / self.header.sector_size
|
||||
max_sectors = old_div(max_size, self.header.sector_size)
|
||||
if nsec > max_sectors or nsec < 1:
|
||||
raise InvalidDiskImage("Number of boot sectors out of range")
|
||||
if bload < 0x200 or bload > (0xc000 - (nsec * self.header.sector_size)):
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
from __future__ import absolute_import
|
||||
from builtins import str
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
import numpy as np
|
||||
|
||||
from .errors import *
|
||||
|
@ -126,10 +129,11 @@ class DiskImageBase(object):
|
|||
return Directory
|
||||
|
||||
def set_filename(self, filename):
|
||||
if "." in filename:
|
||||
self.filename, self.ext = filename.rsplit(".", 1)
|
||||
if type(filename) is not bytes: filename = filename.encode("utf-8")
|
||||
if b'.' in filename:
|
||||
self.filename, self.ext = filename.rsplit(b'.', 1)
|
||||
else:
|
||||
self.filename, self.ext = filename, ""
|
||||
self.filename, self.ext = filename, b''
|
||||
|
||||
def dir(self):
|
||||
lines = []
|
||||
|
@ -175,9 +179,10 @@ class DiskImageBase(object):
|
|||
if not filename:
|
||||
filename = self.filename
|
||||
if self.ext:
|
||||
filename += "." + self.ext
|
||||
filename += b'.' + self.ext
|
||||
if not filename:
|
||||
raise RuntimeError("No filename specified for save!")
|
||||
if type(filename) is not bytes: filename = filename.encode("utf-8")
|
||||
bytes = self.bytes[:]
|
||||
with open(filename, "wb") as fh:
|
||||
bytes.tofile(fh)
|
||||
|
@ -270,6 +275,7 @@ class DiskImageBase(object):
|
|||
# check if we've been passed a dirent instead of a filename
|
||||
if hasattr(filename, "filename"):
|
||||
return filename
|
||||
if type(filename) is not bytes: filename = filename.encode("utf-8")
|
||||
for dirent in self.files:
|
||||
if filename == dirent.filename:
|
||||
return dirent
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
from __future__ import print_function
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from builtins import str
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
from past.utils import old_div
|
||||
import numpy as np
|
||||
|
||||
from .errors import *
|
||||
|
@ -58,7 +63,7 @@ class Dos33TSSector(WriteableSector):
|
|||
|
||||
|
||||
class Dos33VTOC(VTOC):
|
||||
max_tracks = (256 - 0x38) / 4 # 50, but kept here in case sector size changed
|
||||
max_tracks = old_div((256 - 0x38), 4) # 50, but kept here in case sector size changed
|
||||
max_sectors = max_tracks * 16
|
||||
vtoc_bit_reorder_index = np.tile(np.arange(15, -1, -1), max_tracks) + (np.repeat(np.arange(max_tracks), 16) * 16)
|
||||
|
||||
|
@ -191,7 +196,7 @@ class Dos33Dirent(Dirent):
|
|||
0x20: "a", # ?
|
||||
0x40: "b", # ?
|
||||
}
|
||||
text_to_type = {v: k for k, v in type_to_text.iteritems()}
|
||||
text_to_type = {v: k for k, v in type_to_text.items()}
|
||||
|
||||
@property
|
||||
def file_type(self):
|
||||
|
@ -533,7 +538,7 @@ class Dos33DiskImage(DiskImageBase):
|
|||
self.assert_valid_sector(sector)
|
||||
if _xd: log.debug("loading directory segment from catalog sector %d" % sector)
|
||||
raw, pos, size = self.get_raw_bytes(sector)
|
||||
byte_order.extend(range(pos, pos + size))
|
||||
byte_order.extend(list(range(pos, pos + size)))
|
||||
sector = self.header.sector_from_track(raw[1], raw[2])
|
||||
raw = self.rawdata.get_indexed(byte_order)
|
||||
segment = DefaultSegment(raw, name="Catalog")
|
||||
|
@ -573,7 +578,7 @@ class Dos33DiskImage(DiskImageBase):
|
|||
dirent.start_read(self)
|
||||
while True:
|
||||
bytes, last, pos, size = dirent.read_sector(self)
|
||||
byte_order.extend(range(pos, pos + size))
|
||||
byte_order.extend(list(range(pos, pos + size)))
|
||||
if last:
|
||||
break
|
||||
if len(byte_order) > 0:
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
from __future__ import absolute_import
|
||||
from builtins import str
|
||||
from builtins import object
|
||||
import numpy as np
|
||||
|
||||
from .segments import SegmentData, DefaultSegment
|
||||
|
|
|
@ -1,7 +1,13 @@
|
|||
from __future__ import print_function
|
||||
from __future__ import absolute_import
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
from builtins import zip
|
||||
from builtins import str
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
import bisect
|
||||
import cStringIO
|
||||
import io
|
||||
import uuid
|
||||
|
||||
import numpy as np
|
||||
|
@ -196,7 +202,7 @@ class SegmentData(object):
|
|||
|
||||
@property
|
||||
def stringio(self):
|
||||
buf = cStringIO.StringIO(self.data[:])
|
||||
buf = io.StringIO(self.data[:])
|
||||
return buf
|
||||
|
||||
@property
|
||||
|
@ -435,7 +441,7 @@ class DefaultSegment(object):
|
|||
state['_order_list'] = r.order.tolist() # more compact serialization in python list
|
||||
else:
|
||||
state['_order_list'] = None
|
||||
state['memory_map'] = sorted([list(i) for i in self.memory_map.iteritems()])
|
||||
state['memory_map'] = sorted([list(i) for i in self.memory_map.items()])
|
||||
return state
|
||||
|
||||
def __setstate__(self, state):
|
||||
|
@ -629,7 +635,7 @@ class DefaultSegment(object):
|
|||
that uses this base data.
|
||||
"""
|
||||
style_base = self.rawdata.style_base
|
||||
comment_text_indexes = np.asarray(self.rawdata.extra.comments.keys(), dtype=np.uint32)
|
||||
comment_text_indexes = np.asarray(list(self.rawdata.extra.comments.keys()), dtype=np.uint32)
|
||||
comment_mask = self.get_style_mask(comment=True)
|
||||
has_comments = np.where(style_base & comment_bit_mask > 0)[0]
|
||||
both = np.intersect1d(comment_text_indexes, has_comments)
|
||||
|
@ -644,7 +650,7 @@ class DefaultSegment(object):
|
|||
#print len(r.style)
|
||||
#print len(r.style_base)
|
||||
r.style_base[:] &= style_bits
|
||||
comment_indexes = np.asarray(self.rawdata.extra.comments.keys(), dtype=np.uint32)
|
||||
comment_indexes = np.asarray(list(self.rawdata.extra.comments.keys()), dtype=np.uint32)
|
||||
#print comment_indexes
|
||||
r.style_base[comment_indexes] |= comment_bit_mask
|
||||
return r.unindexed_style[:]
|
||||
|
@ -933,7 +939,7 @@ class DefaultSegment(object):
|
|||
|
||||
# Naive way, but maybe it's fast enough: loop over all comments
|
||||
# gathering those within the bounds
|
||||
for rawindex, comment in self.rawdata.extra.comments.iteritems():
|
||||
for rawindex, comment in self.rawdata.extra.comments.items():
|
||||
try:
|
||||
index = self.get_index_from_base_index(rawindex)
|
||||
except IndexError:
|
||||
|
@ -976,13 +982,13 @@ class DefaultSegment(object):
|
|||
del self.rawdata.extra.comments[rawindex]
|
||||
|
||||
def get_sorted_comments(self):
|
||||
return sorted([[k, v] for k, v in self.rawdata.extra.comments.iteritems()])
|
||||
return sorted([[k, v] for k, v in self.rawdata.extra.comments.items()])
|
||||
|
||||
def iter_comments_in_segment(self):
|
||||
start = self.start_addr
|
||||
start_index = self.get_raw_index(0)
|
||||
end_index = self.get_raw_index(len(self.rawdata))
|
||||
for k, v in self.rawdata.extra.comments.iteritems():
|
||||
for k, v in self.rawdata.extra.comments.items():
|
||||
if k >= start_index and k < end_index:
|
||||
yield self.rawdata.get_reverse_index(k), v
|
||||
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
from __future__ import absolute_import
|
||||
from builtins import str
|
||||
from builtins import range
|
||||
import numpy as np
|
||||
|
||||
from .errors import *
|
||||
|
@ -233,7 +235,7 @@ class SpartaDosDiskImage(AtariDosDiskImage):
|
|||
while True:
|
||||
bytes, last, pos, size = dirent.read_sector(self)
|
||||
if not last:
|
||||
byte_order.extend(range(pos, pos + size))
|
||||
byte_order.extend(list(range(pos, pos + size)))
|
||||
else:
|
||||
break
|
||||
if len(byte_order) > 0:
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
from __future__ import absolute_import
|
||||
from builtins import zip
|
||||
from builtins import str
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
import types
|
||||
|
||||
import numpy as np
|
||||
|
@ -185,7 +189,7 @@ class Directory(BaseSectorList):
|
|||
|
||||
def get_free_dirent(self):
|
||||
used = set()
|
||||
d = self.dirents.items()
|
||||
d = list(self.dirents.items())
|
||||
if d:
|
||||
d.sort()
|
||||
for i, dirent in d:
|
||||
|
@ -210,11 +214,11 @@ class Directory(BaseSectorList):
|
|||
def find_dirent(self, filename):
|
||||
if hasattr(filename, "filename"):
|
||||
# we've been passed a dirent instead of a filename
|
||||
for dirent in self.dirents.values():
|
||||
for dirent in list(self.dirents.values()):
|
||||
if dirent == filename:
|
||||
return dirent
|
||||
else:
|
||||
for dirent in self.dirents.values():
|
||||
for dirent in list(self.dirents.values()):
|
||||
if filename == dirent.filename:
|
||||
return dirent
|
||||
raise FileNotFound("%s not found on disk" % filename)
|
||||
|
@ -239,7 +243,7 @@ class Directory(BaseSectorList):
|
|||
self.current_sector = self.get_dirent_sector()
|
||||
self.encode_index = 0
|
||||
|
||||
d = self.dirents.items()
|
||||
d = list(self.dirents.items())
|
||||
d.sort()
|
||||
# there may be gaps, so fill in missing entries with blanks
|
||||
current = 0
|
||||
|
|
|
@ -8,6 +8,8 @@ module_dir = os.path.realpath(os.path.abspath(".."))
|
|||
if module_dir not in sys.path:
|
||||
sys.path.insert(0, module_dir)
|
||||
|
||||
print(sys.path)
|
||||
|
||||
import pytest
|
||||
try:
|
||||
slow = pytest.mark.skipif(
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from __future__ import print_function
|
||||
from builtins import object
|
||||
import numpy as np
|
||||
|
||||
from mock import *
|
||||
|
@ -16,12 +17,12 @@ class BaseFilesystemModifyTest(object):
|
|||
rawdata = SegmentData(self.sample_data.copy())
|
||||
self.image = self.diskimage_type(rawdata)
|
||||
|
||||
def check_entries(self, entries, prefix="TEST", save=None):
|
||||
def check_entries(self, entries, prefix=b"TEST", save=None):
|
||||
orig_num_files = len(self.image.files)
|
||||
filenames = []
|
||||
count = 1
|
||||
for data in entries:
|
||||
filename = "%s%d.BIN" % (prefix, count)
|
||||
filename = b"%s%d.BIN" % (prefix, count)
|
||||
self.image.write_file(filename, None, data)
|
||||
assert len(self.image.files) == orig_num_files + count
|
||||
data2 = np.fromstring(self.image.find_file(filename), dtype=np.uint8)
|
||||
|
@ -31,7 +32,7 @@ class BaseFilesystemModifyTest(object):
|
|||
# loop over them again to make sure data wasn't overwritten
|
||||
count = 1
|
||||
for data in entries:
|
||||
filename = "%s%d.BIN" % (prefix, count)
|
||||
filename = b"%s%d.BIN" % (prefix, count)
|
||||
data2 = np.fromstring(self.image.find_file(filename), dtype=np.uint8)
|
||||
assert np.array_equal(data, data2[0:len(data)])
|
||||
count += 1
|
||||
|
@ -46,20 +47,20 @@ class BaseFilesystemModifyTest(object):
|
|||
assert len(self.image.files) == self.num_files_in_sample
|
||||
|
||||
data = np.asarray([0xff, 0xff, 0x00, 0x60, 0x01, 0x60, 1, 2], dtype=np.uint8)
|
||||
self.image.write_file("TEST.XEX", None, data)
|
||||
self.image.write_file(b"TEST.XEX", None, data)
|
||||
assert len(self.image.files) == self.num_files_in_sample + 1
|
||||
|
||||
data2 = np.fromstring(self.image.find_file("TEST.XEX"), dtype=np.uint8)
|
||||
data2 = np.fromstring(self.image.find_file(b"TEST.XEX"), dtype=np.uint8)
|
||||
assert np.array_equal(data, data2[0:len(data)])
|
||||
|
||||
def test_50k(self):
|
||||
assert len(self.image.files) == self.num_files_in_sample
|
||||
|
||||
data = np.arange(50*1024, dtype=np.uint8)
|
||||
self.image.write_file("RAMP50K.BIN", None, data)
|
||||
self.image.write_file(b"RAMP50K.BIN", None, data)
|
||||
assert len(self.image.files) == self.num_files_in_sample + 1
|
||||
|
||||
data2 = self.image.find_file("RAMP50K.BIN")
|
||||
data2 = self.image.find_file(b"RAMP50K.BIN")
|
||||
assert data.tostring() == data2
|
||||
|
||||
def test_many_small(self):
|
||||
|
@ -76,17 +77,17 @@ class BaseFilesystemModifyTest(object):
|
|||
np.arange(9*1024, dtype=np.uint8),
|
||||
np.arange(10*1024, dtype=np.uint8),
|
||||
]
|
||||
self.check_entries(entries, save="many_small.atr")
|
||||
self.check_entries(entries, save=b"many_small.atr")
|
||||
|
||||
def test_big_failure(self):
|
||||
assert len(self.image.files) == self.num_files_in_sample
|
||||
|
||||
data = np.arange(50*1024, dtype=np.uint8)
|
||||
self.image.write_file("RAMP50K.BIN", None, data)
|
||||
self.image.write_file(b"RAMP50K.BIN", None, data)
|
||||
assert len(self.image.files) == self.num_files_in_sample + 1
|
||||
with pytest.raises(NotEnoughSpaceOnDisk):
|
||||
huge = np.arange(500*1024, dtype=np.uint8)
|
||||
self.image.write_file("RAMP500K.BIN", None, huge)
|
||||
self.image.write_file(b"RAMP500K.BIN", None, huge)
|
||||
assert len(self.image.files) == self.num_files_in_sample + 1
|
||||
|
||||
def test_delete(self):
|
||||
|
@ -116,7 +117,7 @@ class BaseFilesystemModifyTest(object):
|
|||
self.image.delete_file(filenames[8])
|
||||
assert len(self.image.files) == self.num_files_in_sample + 7
|
||||
|
||||
filename = self.check_entries(entries2, "SECOND", save="test_delete.atr")
|
||||
filename = self.check_entries(entries2, b"SECOND", save="test_delete.atr")
|
||||
assert len(self.image.files) == self.num_files_in_sample + 9
|
||||
|
||||
def test_delete_all(self):
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from __future__ import print_function
|
||||
from builtins import object
|
||||
from mock import *
|
||||
|
||||
from atrcopy import SegmentData, AtariDosFile, InvalidBinaryFile, DefaultSegment, XexContainerSegment
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from __future__ import print_function
|
||||
from builtins import object
|
||||
import numpy as np
|
||||
|
||||
from mock import *
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
from __future__ import print_function
|
||||
from builtins import zip
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
import os
|
||||
|
||||
import pytest
|
||||
|
@ -22,7 +25,7 @@ class TestJsonPickle(object):
|
|||
r3 = s2.rawdata[100:200]
|
||||
s3 = DefaultSegment(r3)
|
||||
print(s3.byte_bounds_offset(), len(s3), s3.__getstate__())
|
||||
order = list(reversed(range(700, 800)))
|
||||
order = list(reversed(list(range(700, 800))))
|
||||
r4 = self.segment.rawdata.get_indexed(order)
|
||||
s4 = DefaultSegment(r4)
|
||||
print(s4.byte_bounds_offset(), len(s4), s4.__getstate__())
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
from __future__ import print_function
|
||||
from builtins import zip
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
import os
|
||||
|
||||
import numpy as np
|
||||
|
@ -294,7 +297,7 @@ class TestComments(object):
|
|||
for start, end, style, items in r0:
|
||||
print(style)
|
||||
assert np.all(style == 0)
|
||||
for rawindex, comment in items.values():
|
||||
for rawindex, comment in list(items.values()):
|
||||
assert not comment
|
||||
s1.restore_comments(r)
|
||||
r1 = s1.get_comment_restore_data([indexes])
|
||||
|
@ -322,7 +325,7 @@ class TestComments(object):
|
|||
for start, end, style, items in r0:
|
||||
print(style)
|
||||
assert np.all(style == 0)
|
||||
for rawindex, comment in items.values():
|
||||
for rawindex, comment in list(items.values()):
|
||||
assert not comment
|
||||
s2.restore_comments(r)
|
||||
r2 = s2.get_comment_restore_data([indexes])
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
from __future__ import print_function
|
||||
from builtins import range
|
||||
from builtins import object
|
||||
import os
|
||||
|
||||
import numpy as np
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from builtins import object
|
||||
from mock import *
|
||||
from atrcopy import utils
|
||||
|
||||
|
|
Loading…
Reference in New Issue