WIP for py3 support

This commit is contained in:
Rob McMullen 2017-05-07 18:58:10 -07:00
parent 53bf63d506
commit 841aa1dc9b
16 changed files with 93 additions and 46 deletions

View File

@ -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"])

View File

@ -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)):

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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(

View File

@ -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):

View File

@ -1,4 +1,5 @@
from __future__ import print_function
from builtins import object
from mock import *
from atrcopy import SegmentData, AtariDosFile, InvalidBinaryFile, DefaultSegment, XexContainerSegment

View File

@ -1,4 +1,5 @@
from __future__ import print_function
from builtins import object
import numpy as np
from mock import *

View File

@ -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__())

View File

@ -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])

View File

@ -1,4 +1,6 @@
from __future__ import print_function
from builtins import range
from builtins import object
import os
import numpy as np

View File

@ -1,3 +1,4 @@
from builtins import object
from mock import *
from atrcopy import utils