Futurize --stage1 changes

This commit is contained in:
Rob McMullen 2017-05-07 13:28:15 -07:00
parent 6047824405
commit bddae24cb1
19 changed files with 185 additions and 161 deletions

View File

@ -1,3 +1,5 @@
from __future__ import print_function
from __future__ import absolute_import
import os import os
import sys import sys
import zlib import zlib
@ -5,22 +7,22 @@ import zlib
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
from _metadata import __version__ from ._metadata import __version__
try: try:
import numpy as np import numpy as np
except ImportError: except ImportError:
raise RuntimeError("atrcopy %s requires numpy" % __version__) raise RuntimeError("atrcopy %s requires numpy" % __version__)
from errors import * from .errors import *
from ataridos import AtrHeader, AtariDosDiskImage, BootDiskImage, AtariDosFile, XexContainerSegment, get_xex, add_atr_header from .ataridos import AtrHeader, AtariDosDiskImage, BootDiskImage, AtariDosFile, XexContainerSegment, get_xex, add_atr_header
from dos33 import Dos33DiskImage from .dos33 import Dos33DiskImage
from kboot import KBootImage, add_xexboot_header from .kboot import KBootImage, add_xexboot_header
from segments import SegmentData, SegmentSaver, DefaultSegment, EmptySegment, ObjSegment, RawSectorsSegment, SegmentedFileSegment, user_bit_mask, match_bit_mask, comment_bit_mask, data_style, selected_bit_mask, diff_bit_mask, not_user_bit_mask, interleave_segments, SegmentList, get_style_mask, get_style_bits from .segments import SegmentData, SegmentSaver, DefaultSegment, EmptySegment, ObjSegment, RawSectorsSegment, SegmentedFileSegment, user_bit_mask, match_bit_mask, comment_bit_mask, data_style, selected_bit_mask, diff_bit_mask, not_user_bit_mask, interleave_segments, SegmentList, get_style_mask, get_style_bits
from spartados import SpartaDosDiskImage from .spartados import SpartaDosDiskImage
from cartridge import A8CartHeader, AtariCartImage from .cartridge import A8CartHeader, AtariCartImage
from parsers import SegmentParser, DefaultSegmentParser, guess_parser_for_mime, guess_parser_for_system, iter_parsers, iter_known_segment_parsers, mime_parse_order from .parsers import SegmentParser, DefaultSegmentParser, guess_parser_for_mime, guess_parser_for_system, iter_parsers, iter_known_segment_parsers, mime_parse_order
from utils import to_numpy, text_to_int from .utils import to_numpy, text_to_int
def process(image, dirent, options): def process(image, dirent, options):
@ -42,38 +44,38 @@ def process(image, dirent, options):
action = "DRY_RUN: %s" % action action = "DRY_RUN: %s" % action
skip = True skip = True
if options.extract: if options.extract:
print "%s: %s %s" % (dirent, action, outfilename) print("%s: %s %s" % (dirent, action, outfilename))
if not skip: if not skip:
bytes = image.get_file(dirent) bytes = image.get_file(dirent)
with open(outfilename, "wb") as fh: with open(outfilename, "wb") as fh:
fh.write(bytes) fh.write(bytes)
else: else:
print dirent print(dirent)
def find_diskimage(filename): def find_diskimage(filename):
try: try:
with open(filename, "rb") as fh: with open(filename, "rb") as fh:
if options.verbose: if options.verbose:
print "Loading file %s" % filename print("Loading file %s" % filename)
rawdata = SegmentData(fh.read()) rawdata = SegmentData(fh.read())
parser = None parser = None
for mime in mime_parse_order: for mime in mime_parse_order:
if options.verbose: if options.verbose:
print "Trying MIME type %s" % mime print("Trying MIME type %s" % mime)
parser = guess_parser_for_mime(mime, rawdata, options.verbose) parser = guess_parser_for_mime(mime, rawdata, options.verbose)
if parser is None: if parser is None:
continue continue
if options.verbose: if options.verbose:
print "Found parser %s" % parser.menu_name print("Found parser %s" % parser.menu_name)
break break
if parser is None: if parser is None:
print "%s: Unknown disk image type" % filename print("%s: Unknown disk image type" % filename)
except UnsupportedDiskImage, e: except UnsupportedDiskImage as e:
print "%s: %s" % (filename, e) print("%s: %s" % (filename, e))
return None return None
except IOError, e: except IOError as e:
print "%s: %s" % (filename, e) print("%s: %s" % (filename, e))
return None return None
else: else:
parser.image.filename = filename parser.image.filename = filename
@ -88,7 +90,7 @@ def extract_files(image, files):
try: try:
dirent = image.find_dirent(name) dirent = image.find_dirent(name)
except FileNotFound: except FileNotFound:
print "%s not in %s" % (name, image) print("%s not in %s" % (name, image))
continue continue
output = dirent.filename output = dirent.filename
if options.lower: if options.lower:
@ -96,13 +98,13 @@ def extract_files(image, files):
if not options.dry_run: if not options.dry_run:
data = image.get_file(dirent) data = image.get_file(dirent)
if os.path.exists(output) and not options.force: if os.path.exists(output) and not options.force:
print "skipping %s, file exists. Use -f to overwrite" % output print("skipping %s, file exists. Use -f to overwrite" % output)
continue continue
print "extracting %s -> %s" % (name, output) print("extracting %s -> %s" % (name, output))
with open(output, "wb") as fh: with open(output, "wb") as fh:
fh.write(data) fh.write(data)
else: else:
print "extracting %s -> %s" % (name, output) print("extracting %s -> %s" % (name, output))
def save_file(image, name, filetype, data): def save_file(image, name, filetype, data):
@ -111,11 +113,11 @@ def save_file(image, name, filetype, data):
if options.force: if options.force:
image.delete_file(name) image.delete_file(name)
else: else:
print "skipping %s, use -f to overwrite" % (name) print("skipping %s, use -f to overwrite" % (name))
return False return False
except FileNotFound: except FileNotFound:
pass pass
print "copying %s to %s" % (name, image.filename) print("copying %s to %s" % (name, image.filename))
if not options.dry_run: if not options.dry_run:
image.write_file(name, filetype, data) image.write_file(name, filetype, data)
return True return True
@ -141,9 +143,9 @@ def remove_files(image, files):
try: try:
dirent = image.find_dirent(name) dirent = image.find_dirent(name)
except FileNotFound: except FileNotFound:
print "%s not in %s" % (name, image) print("%s not in %s" % (name, image))
continue continue
print "removing %s from %s" % (name, image) print("removing %s from %s" % (name, image))
if not options.dry_run: if not options.dry_run:
image.delete_file(name) image.delete_file(name)
changed = True changed = True
@ -163,7 +165,7 @@ def list_files(image, files, show_crc=False, show_metadata=False):
extra = "" extra = ""
print("%s%s" % (dirent, extra)) print("%s%s" % (dirent, extra))
if show_metadata: if show_metadata:
print dirent.extra_metadata(image) print(dirent.extra_metadata(image))
def crc_files(image, files): def crc_files(image, files):
@ -186,20 +188,20 @@ def assemble(image, source_files, data_files, obj_files, run_addr=""):
for name in source_files: for name in source_files:
try: try:
asm = pyatasm.Assemble(name) asm = pyatasm.Assemble(name)
except SyntaxError, e: except SyntaxError as e:
raise AtrError("Assembly error: %s" % e.msg) raise AtrError("Assembly error: %s" % e.msg)
log.debug("Assembled %s into:" % name) log.debug("Assembled %s into:" % name)
for first, last, object_code in asm.segments: for first, last, object_code in asm.segments:
s = segments.add_segment(object_code, first) s = segments.add_segment(object_code, first)
log.debug(" %s" % s.name) log.debug(" %s" % s.name)
print "adding %s from %s assembly" % (s, name) print("adding %s from %s assembly" % (s, name))
for name in data_files: for name in data_files:
if "@" not in name: if "@" not in name:
raise AtrError("Data files must include a load address specified with the @ char") raise AtrError("Data files must include a load address specified with the @ char")
name, addr = name.rsplit("@", 1) name, addr = name.rsplit("@", 1)
first = text_to_int(addr) first = text_to_int(addr)
log.debug("Adding data file %s at $%04x" % (name, first)) log.debug("Adding data file %s at $%04x" % (name, first))
subset = slice(0, sys.maxint) subset = slice(0, sys.maxsize)
if "[" in name and "]" in name: if "[" in name and "]" in name:
name, slicetext = name.rsplit("[", 1) name, slicetext = name.rsplit("[", 1)
if ":" in slicetext: if ":" in slicetext:
@ -224,11 +226,11 @@ def assemble(image, source_files, data_files, obj_files, run_addr=""):
if parser and parser.image: if parser and parser.image:
for s in parser.segments: for s in parser.segments:
if s.start_addr > 0: if s.start_addr > 0:
print "adding %s from %s" % (s, name) print("adding %s from %s" % (s, name))
segments.add_segment(s.data, s.start_addr) segments.add_segment(s.data, s.start_addr)
if options.verbose: if options.verbose:
for s in segments: for s in segments:
print "%s - %04x)" % (str(s)[:-1], s.start_addr + len(s)) print("%s - %04x)" % (str(s)[:-1], s.start_addr + len(s)))
if run_addr: if run_addr:
try: try:
run_addr = text_to_int(run_addr) run_addr = text_to_int(run_addr)
@ -236,14 +238,14 @@ def assemble(image, source_files, data_files, obj_files, run_addr=""):
run_addr = None run_addr = None
file_data, filetype = image.create_executable_file_image(segments, run_addr) file_data, filetype = image.create_executable_file_image(segments, run_addr)
print "total file size: $%x (%d) bytes" % (len(file_data), len(file_data)) print("total file size: $%x (%d) bytes" % (len(file_data), len(file_data)))
changed = save_file(image, options.output, filetype, file_data) changed = save_file(image, options.output, filetype, file_data)
if changed: if changed:
image.save() image.save()
def shred_image(image, value=0): def shred_image(image, value=0):
print "shredding: free sectors from %s filled with %d" % (image, value) print("shredding: free sectors from %s filled with %d" % (image, value))
if not options.dry_run: if not options.dry_run:
image.shred() image.shred()
image.save() image.save()
@ -266,7 +268,7 @@ def get_template_path(rel_path="templates"):
zippath, template_path = template_path.split(".zip/") zippath, template_path = template_path.split(".zip/")
template_path = os.path.normpath(os.path.join(root, template_path)) template_path = os.path.normpath(os.path.join(root, template_path))
else: else:
print "App packager %s not yet supported for image paths!!!" print("App packager %s not yet supported for image paths!!!")
return template_path return template_path
@ -313,18 +315,18 @@ def create_image(template, name):
import textwrap import textwrap
data, inf = get_template_data(template) data, inf = get_template_data(template)
print "using %s template:\n %s" % (template, "\n ".join(textwrap.wrap(inf, 77))) print("using %s template:\n %s" % (template, "\n ".join(textwrap.wrap(inf, 77))))
if not options.dry_run: if not options.dry_run:
if os.path.exists(name) and not options.force: if os.path.exists(name) and not options.force:
print "skipping %s, use -f to overwrite" % (name) print("skipping %s, use -f to overwrite" % (name))
else: else:
with open(name, "wb") as fh: with open(name, "wb") as fh:
fh.write(data) fh.write(data)
parser = find_diskimage(name) parser = find_diskimage(name)
print "created %s: %s" % (name, str(parser.image)) print("created %s: %s" % (name, str(parser.image)))
list_files(parser.image, []) list_files(parser.image, [])
else: else:
print "creating %s" % name print("creating %s" % name)
def run(): def run():
@ -512,10 +514,10 @@ def run():
parser = find_diskimage(disk_image_name) parser = find_diskimage(disk_image_name)
if parser and parser.image: if parser and parser.image:
if command not in skip_diskimage_summary: if command not in skip_diskimage_summary:
print "%s: %s" % (disk_image_name, parser.image) print("%s: %s" % (disk_image_name, parser.image))
if command == "vtoc": if command == "vtoc":
vtoc = parser.image.get_vtoc_object() vtoc = parser.image.get_vtoc_object()
print vtoc print(vtoc)
if options.clear_empty: if options.clear_empty:
shred_image(parser.image) shred_image(parser.image)
elif command == "list": elif command == "list":
@ -534,6 +536,6 @@ def run():
obj = options.obj[0] if options.obj else [] obj = options.obj[0] if options.obj else []
assemble(parser.image, asm, data, obj, options.run_addr) assemble(parser.image, asm, data, obj, options.run_addr)
elif command == "segments": elif command == "segments":
print "\n".join([str(a) for a in parser.segments]) print("\n".join([str(a) for a in parser.segments]))
else: else:
log.error("Invalid disk image: %s" % disk_image_name) log.error("Invalid disk image: %s" % disk_image_name)

View File

@ -1,9 +1,10 @@
from __future__ import absolute_import
import numpy as np import numpy as np
from errors import * from .errors import *
from diskimages import DiskImageBase, BaseHeader from .diskimages import DiskImageBase, BaseHeader
from segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment, DefaultSegment, SegmentedFileSegment, SegmentSaver, get_style_bits from .segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment, DefaultSegment, SegmentedFileSegment, SegmentSaver, get_style_bits
from utils import * from .utils import *
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@ -1,11 +1,12 @@
from __future__ import absolute_import
from collections import defaultdict from collections import defaultdict
import numpy as np import numpy as np
from errors import * from .errors import *
from segments import SegmentData, EmptySegment, ObjSegment from .segments import SegmentData, EmptySegment, ObjSegment
from diskimages import DiskImageBase from .diskimages import DiskImageBase
from utils import to_numpy from .utils import to_numpy
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@ -1,8 +1,9 @@
from __future__ import absolute_import
import numpy as np import numpy as np
from errors import * from .errors import *
from segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment from .segments import SegmentData, EmptySegment, ObjSegment, RawSectorsSegment
from utils import * from .utils import *
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -290,7 +291,7 @@ class DiskImageBase(object):
for dirent in self.files: for dirent in self.files:
try: try:
segment = self.get_file_segment(dirent) segment = self.get_file_segment(dirent)
except InvalidFile, e: except InvalidFile as e:
segment = EmptySegment(self.rawdata, name=dirent.filename, error=str(e)) segment = EmptySegment(self.rawdata, name=dirent.filename, error=str(e))
segments.append(segment) segments.append(segment)
return segments return segments

View File

@ -1,9 +1,11 @@
from __future__ import print_function
from __future__ import absolute_import
import numpy as np import numpy as np
from errors import * from .errors import *
from diskimages import BaseHeader, DiskImageBase from .diskimages import BaseHeader, DiskImageBase
from utils import Directory, VTOC, WriteableSector, BaseSectorList, Dirent from .utils import Directory, VTOC, WriteableSector, BaseSectorList, Dirent
from segments import DefaultSegment, EmptySegment, ObjSegment, RawTrackSectorSegment, SegmentSaver, get_style_bits, SegmentData from .segments import DefaultSegment, EmptySegment, ObjSegment, RawTrackSectorSegment, SegmentSaver, get_style_bits, SegmentData
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -624,7 +626,7 @@ class Dos33DiskImage(DiskImageBase):
words[1] = size words[1] = size
for s in all_segments: for s in all_segments:
index = s.start_addr - origin + 4 index = s.start_addr - origin + 4
print "setting data for $%04x - $%04x at index $%04x" % (s.start_addr, s.start_addr + len(s), index) print("setting data for $%04x - $%04x at index $%04x" % (s.start_addr, s.start_addr + len(s), index))
image[index:index + len(s)] = s.data image[index:index + len(s)] = s.data
return image, 'B' return image, 'B'

View File

@ -1,7 +1,8 @@
from __future__ import absolute_import
import numpy as np import numpy as np
from errors import * from .errors import *
from ataridos import AtariDosDirent, AtariDosDiskImage, XexSegment from .ataridos import AtariDosDirent, AtariDosDiskImage, XexSegment
class KBootDirent(AtariDosDirent): class KBootDirent(AtariDosDirent):

View File

@ -1,11 +1,12 @@
from __future__ import absolute_import
import zipfile import zipfile
import numpy as np import numpy as np
from errors import * from .errors import *
from segments import SegmentData, EmptySegment, ObjSegment from .segments import SegmentData, EmptySegment, ObjSegment
from diskimages import DiskImageBase from .diskimages import DiskImageBase
from utils import to_numpy from .utils import to_numpy
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@ -1,13 +1,14 @@
from __future__ import absolute_import
import numpy as np import numpy as np
from segments import SegmentData, DefaultSegment from .segments import SegmentData, DefaultSegment
from kboot import KBootImage from .kboot import KBootImage
from ataridos import AtariDosDiskImage, BootDiskImage, AtariDosFile, XexContainerSegment from .ataridos import AtariDosDiskImage, BootDiskImage, AtariDosFile, XexContainerSegment
from spartados import SpartaDosDiskImage from .spartados import SpartaDosDiskImage
from cartridge import AtariCartImage, get_known_carts from .cartridge import AtariCartImage, get_known_carts
from mame import MameZipImage from .mame import MameZipImage
from dos33 import Dos33DiskImage, ProdosDiskImage, Dos33BinFile from .dos33 import Dos33DiskImage, ProdosDiskImage, Dos33BinFile
from errors import * from .errors import *
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -60,7 +61,7 @@ class SegmentParser(object):
self.image.parse_segments() self.image.parse_segments()
except UnsupportedDiskImage: except UnsupportedDiskImage:
raise raise
except AtrError, e: except AtrError as e:
raise InvalidSegmentParser(e) raise InvalidSegmentParser(e)
self.segments.extend(self.image.segments) self.segments.extend(self.image.segments)
@ -71,7 +72,7 @@ class SegmentParser(object):
if self.strict: if self.strict:
try: try:
self.image.strict_check() self.image.strict_check()
except AtrError, e: except AtrError as e:
raise InvalidSegmentParser(e) raise InvalidSegmentParser(e)
else: else:
self.image.relaxed_check() self.image.relaxed_check()
@ -147,7 +148,7 @@ def guess_parser_for_mime(mime, r, verbose=False):
try: try:
found = parser(r, True) found = parser(r, True)
break break
except InvalidSegmentParser, e: except InvalidSegmentParser as e:
if verbose: if verbose:
log.info("parser isn't %s: %s" % (parser.__name__, str(e))) log.info("parser isn't %s: %s" % (parser.__name__, str(e)))
pass pass

View File

@ -1,11 +1,14 @@
from __future__ import print_function
from __future__ import absolute_import
import bisect import bisect
import cStringIO import cStringIO
import uuid import uuid
import numpy as np import numpy as np
from errors import * from .errors import *
from utils import to_numpy, to_numpy_list from .utils import to_numpy, to_numpy_list
from functools import reduce
user_bit_mask = 0x07 user_bit_mask = 0x07
data_style = 0x1 data_style = 0x1
@ -1007,11 +1010,11 @@ class DefaultSegment(object):
def compare_segment(self, other_segment): def compare_segment(self, other_segment):
self.clear_style_bits(diff=True) self.clear_style_bits(diff=True)
diff = self.rawdata.data != other_segment.rawdata.data diff = self.rawdata.data != other_segment.rawdata.data
print diff, diff.dtype print(diff, diff.dtype)
d = diff * np.uint8(diff_bit_mask) d = diff * np.uint8(diff_bit_mask)
print d print(d)
self.style |= (diff * np.uint8(diff_bit_mask)) self.style |= (diff * np.uint8(diff_bit_mask))
print "# entries", len(diff), "# diffs:", len(np.where(diff == True)[0]) print("# entries", len(diff), "# diffs:", len(np.where(diff == True)[0]))
class EmptySegment(DefaultSegment): class EmptySegment(DefaultSegment):

View File

@ -1,8 +1,9 @@
from __future__ import absolute_import
import numpy as np import numpy as np
from errors import * from .errors import *
from ataridos import AtariDosDirent, AtariDosDiskImage, XexSegment from .ataridos import AtariDosDirent, AtariDosDiskImage, XexSegment
from segments import DefaultSegment, EmptySegment, ObjSegment, RawSectorsSegment, SegmentSaver from .segments import DefaultSegment, EmptySegment, ObjSegment, RawSectorsSegment, SegmentSaver
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@ -1,8 +1,9 @@
from __future__ import absolute_import
import types import types
import numpy as np import numpy as np
from errors import * from .errors import *
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -15,9 +16,9 @@ except NameError:
def to_numpy(value): def to_numpy(value):
if type(value) is np.ndarray: if type(value) is np.ndarray:
return value return value
elif type(value) is types.StringType: elif type(value) is bytes:
return np.fromstring(value, dtype=np.uint8) return np.fromstring(value, dtype=np.uint8)
elif type(value) is types.ListType: elif type(value) is list:
return np.asarray(value, dtype=np.uint8) return np.asarray(value, dtype=np.uint8)
raise TypeError("Can't convert to numpy data") raise TypeError("Can't convert to numpy data")

View File

@ -1,3 +1,4 @@
from __future__ import print_function
import numpy as np import numpy as np
from mock import * from mock import *
@ -161,7 +162,7 @@ class TestDos33Image(BaseFilesystemModifyTest):
if __name__ == "__main__": if __name__ == "__main__":
t = TestAtariDosSDImage() t = TestAtariDosSDImage()
for name in dir(t): for name in dir(t):
print name print(name)
if name.startswith("test_"): if name.startswith("test_"):
t.setup() t.setup()
getattr(t, name)() getattr(t, name)()

View File

@ -1,3 +1,4 @@
from __future__ import print_function
from mock import * from mock import *
from atrcopy import SegmentData, AtariDosFile, InvalidBinaryFile, DefaultSegment, XexContainerSegment from atrcopy import SegmentData, AtariDosFile, InvalidBinaryFile, DefaultSegment, XexContainerSegment
@ -13,7 +14,7 @@ class TestAtariDosFile(object):
container = XexContainerSegment(rawdata, 0) container = XexContainerSegment(rawdata, 0)
image = AtariDosFile(container.rawdata) image = AtariDosFile(container.rawdata)
image.parse_segments() image.parse_segments()
print image.segments print(image.segments)
assert len(image.segments) == 1 assert len(image.segments) == 1
assert len(image.segments[0]) == 2 assert len(image.segments[0]) == 2
assert np.all(image.segments[0] == bytes[6:8]) assert np.all(image.segments[0] == bytes[6:8])
@ -23,7 +24,7 @@ class TestAtariDosFile(object):
new_segment = DefaultSegment(rawdata[8:16]) new_segment = DefaultSegment(rawdata[8:16])
new_segment[:] = 99 new_segment[:] = 99
assert np.all(image.segments[0] == bytes[6:8]) assert np.all(image.segments[0] == bytes[6:8])
print new_segment[:] print(new_segment[:])
assert np.all(new_segment[:] == 99) assert np.all(new_segment[:] == 99)

View File

@ -1,3 +1,4 @@
from __future__ import print_function
from mock import * from mock import *
from atrcopy import AtariCartImage, SegmentData, InvalidDiskImage from atrcopy import AtariCartImage, SegmentData, InvalidDiskImage
@ -73,7 +74,7 @@ class TestAtariCart(object):
if __name__ == "__main__": if __name__ == "__main__":
print "\n".join(mime_parse_order) print("\n".join(mime_parse_order))
t = TestAtariCart() t = TestAtariCart()
t.setup() t.setup()

View File

@ -1,3 +1,4 @@
from __future__ import print_function
import numpy as np import numpy as np
from mock import * from mock import *
@ -42,8 +43,8 @@ class BaseCreateTest(object):
file_data, filetype = image.create_executable_file_image(segments, run_addr) file_data, filetype = image.create_executable_file_image(segments, run_addr)
except TypeError: except TypeError:
file_data, filetype = image.create_executable_file_image(segments, run_addr) file_data, filetype = image.create_executable_file_image(segments, run_addr)
print image print(image)
print file_data, filetype print(file_data, filetype)
assert len(file_data) == expected assert len(file_data) == expected
@pytest.mark.parametrize("sample_file", ["../test_data/dos_sd_test1.atr"]) @pytest.mark.parametrize("sample_file", ["../test_data/dos_sd_test1.atr"])

View File

@ -1,3 +1,4 @@
from __future__ import print_function
import os import os
import pytest import pytest
@ -14,33 +15,33 @@ class TestJsonPickle(object):
self.segment = DefaultSegment(SegmentData(data)) self.segment = DefaultSegment(SegmentData(data))
def test_simple(self): def test_simple(self):
print self.segment.byte_bounds_offset(), len(self.segment) print(self.segment.byte_bounds_offset(), len(self.segment))
r2 = self.segment.rawdata[100:400] r2 = self.segment.rawdata[100:400]
s2 = DefaultSegment(r2) s2 = DefaultSegment(r2)
print s2.byte_bounds_offset(), len(s2), s2.__getstate__() print(s2.byte_bounds_offset(), len(s2), s2.__getstate__())
r3 = s2.rawdata[100:200] r3 = s2.rawdata[100:200]
s3 = DefaultSegment(r3) s3 = DefaultSegment(r3)
print s3.byte_bounds_offset(), len(s3), s3.__getstate__() print(s3.byte_bounds_offset(), len(s3), s3.__getstate__())
order = list(reversed(range(700, 800))) order = list(reversed(range(700, 800)))
r4 = self.segment.rawdata.get_indexed(order) r4 = self.segment.rawdata.get_indexed(order)
s4 = DefaultSegment(r4) s4 = DefaultSegment(r4)
print s4.byte_bounds_offset(), len(s4), s4.__getstate__() print(s4.byte_bounds_offset(), len(s4), s4.__getstate__())
slist = [s2, s3, s4] slist = [s2, s3, s4]
for s in slist: for s in slist:
print s print(s)
j = jsonpickle.dumps(slist) j = jsonpickle.dumps(slist)
print j print(j)
slist2 = jsonpickle.loads(j) slist2 = jsonpickle.loads(j)
print slist2 print(slist2)
for s in slist2: for s in slist2:
s.reconstruct_raw(self.segment.rawdata) s.reconstruct_raw(self.segment.rawdata)
print s print(s)
for orig, rebuilt in zip(slist, slist2): for orig, rebuilt in zip(slist, slist2):
print "orig", orig.data[:] print("orig", orig.data[:])
print "rebuilt", rebuilt.data[:] print("rebuilt", rebuilt.data[:])
assert np.array_equal(orig[:], rebuilt[:]) assert np.array_equal(orig[:], rebuilt[:])
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -1,3 +1,4 @@
from __future__ import print_function
import os import os
import numpy as np import numpy as np
@ -21,9 +22,9 @@ class TestKbootHeader(object):
rawdata = SegmentData(bytes) rawdata = SegmentData(bytes)
newatr = KBootImage(rawdata) newatr = KBootImage(rawdata)
image = newatr.bytes image = newatr.bytes
print image[0:16] print(image[0:16])
paragraphs = image_size / 16 paragraphs = image_size / 16
print newatr.header, paragraphs print(newatr.header, paragraphs)
assert int(image[2:4].view(dtype='<u2')) == paragraphs assert int(image[2:4].view(dtype='<u2')) == paragraphs
assert int(image[16 + 9:16 + 9 + 2].view('<u2')) == xex_size assert int(image[16 + 9:16 + 9 + 2].view('<u2')) == xex_size
return image return image

View File

@ -1,3 +1,4 @@
from __future__ import print_function
import os import os
import numpy as np import numpy as np
@ -5,6 +6,7 @@ import pytest
from atrcopy import DefaultSegment, SegmentData, get_xex, interleave_segments, user_bit_mask, diff_bit_mask from atrcopy import DefaultSegment, SegmentData, get_xex, interleave_segments, user_bit_mask, diff_bit_mask
from atrcopy.errors import * from atrcopy.errors import *
from functools import reduce
def get_indexed(segment, num, scale): def get_indexed(segment, num, scale):
@ -32,7 +34,7 @@ class TestSegment1(object):
s[1].set_comment_at(0, "comment 0") s[1].set_comment_at(0, "comment 0")
s[1].set_comment_at(10, "comment 10") s[1].set_comment_at(10, "comment 10")
s[1].set_comment_at(100, "comment 100") s[1].set_comment_at(100, "comment 100")
print list(s[1].iter_comments_in_segment()) print(list(s[1].iter_comments_in_segment()))
with pytest.raises(InvalidBinaryFile): with pytest.raises(InvalidBinaryFile):
seg, subseg = get_xex(s, 0xbeef) seg, subseg = get_xex(s, 0xbeef)
seg, subseg = get_xex(s) seg, subseg = get_xex(s)
@ -42,8 +44,8 @@ class TestSegment1(object):
# An extra segment has been inserted for the run address! # An extra segment has been inserted for the run address!
size = reduce(lambda a, b:a + len(b), subseg, 0) size = reduce(lambda a, b:a + len(b), subseg, 0)
assert len(seg) == 2 + size assert len(seg) == 2 + size
print id(s[1]), list(s[1].iter_comments_in_segment()) print(id(s[1]), list(s[1].iter_comments_in_segment()))
print id(subseg[2]), list(subseg[2].iter_comments_in_segment()) print(id(subseg[2]), list(subseg[2].iter_comments_in_segment()))
for i, c in s[1].iter_comments_in_segment(): for i, c in s[1].iter_comments_in_segment():
assert c == subseg[2].get_comment(i + 4) assert c == subseg[2].get_comment(i + 4)
assert np.all(s[1].style[:] == subseg[2].style[4:]) assert np.all(s[1].style[:] == subseg[2].style[4:])
@ -51,15 +53,15 @@ class TestSegment1(object):
def test_copy(self): def test_copy(self):
for s in self.segments: for s in self.segments:
d = s.rawdata d = s.rawdata
print "orig:", d.data.shape, d.is_indexed, d.data, id(d.data) print("orig:", d.data.shape, d.is_indexed, d.data, id(d.data))
c = d.copy() c = d.copy()
print "copy", c.data.shape, c.is_indexed, c.data, id(c.data) print("copy", c.data.shape, c.is_indexed, c.data, id(c.data))
assert c.data.shape == s.data.shape assert c.data.shape == s.data.shape
assert id(c) != id(s) assert id(c) != id(s)
assert np.all((c.data[:] - s.data[:]) == 0) assert np.all((c.data[:] - s.data[:]) == 0)
c.data[0:100] = 1 c.data[0:100] = 1
print d.data print(d.data)
print c.data print(c.data)
assert not np.all((c.data[:] - s.data[:]) == 0) assert not np.all((c.data[:] - s.data[:]) == 0)
@ -104,13 +106,13 @@ class TestIndexed(object):
# try with elements up to 256 * 3 # try with elements up to 256 * 3
s, indexes = get_indexed(sub, 256, 3) s, indexes = get_indexed(sub, 256, 3)
print sub.data print(sub.data)
print indexes print(indexes)
print s.data[:] print(s.data[:])
assert s.rawdata.is_indexed assert s.rawdata.is_indexed
for i in range(len(indexes)): for i in range(len(indexes)):
ri = s.get_raw_index(i) ri = s.get_raw_index(i)
print ri, "base[ri]=%d" % base[ri], i, indexes[i], "s[i]=%d" % s[i] print(ri, "base[ri]=%d" % base[ri], i, indexes[i], "s[i]=%d" % s[i])
assert ri == sub.start_addr + indexes[i] assert ri == sub.start_addr + indexes[i]
assert s[i] == base[ri] assert s[i] == base[ri]
start, end = s.byte_bounds_offset() start, end = s.byte_bounds_offset()
@ -147,9 +149,9 @@ class TestIndexed(object):
a[1::4] = s1[1::2] a[1::4] = s1[1::2]
a[2::4] = s2[0::2] a[2::4] = s2[0::2]
a[3::4] = s2[1::2] a[3::4] = s2[1::2]
print list(s[:]) print(list(s[:]))
print list(a[:]) print(list(a[:]))
print s.rawdata.order print(s.rawdata.order)
assert np.array_equal(s[:], a) assert np.array_equal(s[:], a)
s = interleave_segments([s1, s2], 4) s = interleave_segments([s1, s2], 4)
@ -184,8 +186,8 @@ class TestIndexed(object):
def test_copy(self): def test_copy(self):
s, indexes = get_indexed(self.segment, 1024, 3) s, indexes = get_indexed(self.segment, 1024, 3)
c = s.rawdata.copy() c = s.rawdata.copy()
print c.data.shape, c.is_indexed print(c.data.shape, c.is_indexed)
print id(c.data.np_data), id(s.data.np_data) print(id(c.data.np_data), id(s.data.np_data))
assert c.data.shape == s.data.shape assert c.data.shape == s.data.shape
assert id(c) != id(s) assert id(c) != id(s)
assert np.all((c.data[:] - s.data[:]) == 0) assert np.all((c.data[:] - s.data[:]) == 0)
@ -220,9 +222,9 @@ class TestComments(object):
s.set_user_data([r], 4, 99) s.set_user_data([r], 4, 99)
s2 = self.sub_segment s2 = self.sub_segment
print len(s2) print(len(s2))
copy = s2.get_comment_locations() copy = s2.get_comment_locations()
print copy print(copy)
# comments at 4 and 40 in the original means 2 and 38 in the copy # comments at 4 and 40 in the original means 2 and 38 in the copy
orig = s.get_comment_locations() orig = s.get_comment_locations()
assert copy[2] == orig[4] assert copy[2] == orig[4]
@ -235,17 +237,17 @@ class TestComments(object):
s.set_comment([[i,i+1]], "comment at %d" % i) s.set_comment([[i,i+1]], "comment at %d" % i)
s2 = self.sub_segment s2 = self.sub_segment
print len(s2) print(len(s2))
copy = s2.get_comment_locations() copy = s2.get_comment_locations()
print copy print(copy)
# comments at 4 and 40 in the original means 2 and 38 in the copy # comments at 4 and 40 in the original means 2 and 38 in the copy
orig = s.get_comment_locations() orig = s.get_comment_locations()
print orig[0:200] print(orig[0:200])
assert copy[2] == orig[4] assert copy[2] == orig[4]
assert copy[28] == orig[38] assert copy[28] == orig[38]
r = s2.get_entire_style_ranges([1], user=True) r = s2.get_entire_style_ranges([1], user=True)
print r print(r)
assert r == [((0, 23), 1), ((23, 48), 1), ((48, 73), 1), ((73, 98), 1), ((98, 123), 1), ((123, 148), 1), ((148, 173), 1), ((173, 198), 1), ((198, 200), 1)] assert r == [((0, 23), 1), ((23, 48), 1), ((48, 73), 1), ((73, 98), 1), ((98, 123), 1), ((123, 148), 1), ((148, 173), 1), ((173, 198), 1), ((198, 200), 1)]
def test_split_data_at_comment2(self): def test_split_data_at_comment2(self):
@ -260,17 +262,17 @@ class TestComments(object):
s.set_comment([[i,i+1]], "comment at %d" % i) s.set_comment([[i,i+1]], "comment at %d" % i)
s2 = self.sub_segment s2 = self.sub_segment
print len(s2) print(len(s2))
copy = s2.get_comment_locations() copy = s2.get_comment_locations()
print copy print(copy)
# comments at 4 and 40 in the original means 2 and 38 in the copy # comments at 4 and 40 in the original means 2 and 38 in the copy
orig = s.get_comment_locations() orig = s.get_comment_locations()
print orig[0:200] print(orig[0:200])
assert copy[2] == orig[4] assert copy[2] == orig[4]
assert copy[28] == orig[38] assert copy[28] == orig[38]
r = s2.get_entire_style_ranges([1], user=user_bit_mask) r = s2.get_entire_style_ranges([1], user=user_bit_mask)
print r print(r)
assert r == [((0, 38), 0), ((38, 48), 1), ((48, 73), 1), ((73, 78), 1), ((78, 118), 2), ((118, 158), 3), ((158, 198), 4), ((198, 200), 5)] assert r == [((0, 38), 0), ((38, 48), 1), ((48, 73), 1), ((73, 78), 1), ((78, 118), 2), ((118, 158), 3), ((158, 198), 4), ((198, 200), 5)]
def test_restore_comments(self): def test_restore_comments(self):
@ -280,64 +282,64 @@ class TestComments(object):
s.set_comment([[i,i+1]], "comment at %d" % i) s.set_comment([[i,i+1]], "comment at %d" % i)
s1 = self.segment s1 = self.segment
print len(s1) print(len(s1))
indexes = [7,12] indexes = [7,12]
r = s1.get_comment_restore_data([indexes]) r = s1.get_comment_restore_data([indexes])
print r print(r)
# force clear comments # force clear comments
s1.rawdata.extra.comments = {} s1.rawdata.extra.comments = {}
s1.style[indexes[0]:indexes[1]] = 0 s1.style[indexes[0]:indexes[1]] = 0
r0 = s1.get_comment_restore_data([indexes]) r0 = s1.get_comment_restore_data([indexes])
print r0 print(r0)
for start, end, style, items in r0: for start, end, style, items in r0:
print style print(style)
assert np.all(style == 0) assert np.all(style == 0)
for rawindex, comment in items.values(): for rawindex, comment in items.values():
assert not comment assert not comment
s1.restore_comments(r) s1.restore_comments(r)
r1 = s1.get_comment_restore_data([indexes]) r1 = s1.get_comment_restore_data([indexes])
print r1 print(r1)
for item1, item2 in zip(r, r1): for item1, item2 in zip(r, r1):
print item1 print(item1)
print item2 print(item2)
for a1, a2 in zip(item1, item2): for a1, a2 in zip(item1, item2):
print a1, a2 print(a1, a2)
if hasattr(a1, "shape"): if hasattr(a1, "shape"):
assert np.all(a1 - a2 == 0) assert np.all(a1 - a2 == 0)
else: else:
assert a1 == a2 assert a1 == a2
s2 = self.sub_segment s2 = self.sub_segment
print len(s2) print(len(s2))
indexes = [5,10] indexes = [5,10]
r = s2.get_comment_restore_data([indexes]) r = s2.get_comment_restore_data([indexes])
print r print(r)
# force clear comments # force clear comments
s2.rawdata.extra.comments = {} s2.rawdata.extra.comments = {}
s2.style[indexes[0]:indexes[1]] = 0 s2.style[indexes[0]:indexes[1]] = 0
r0 = s2.get_comment_restore_data([indexes]) r0 = s2.get_comment_restore_data([indexes])
print r0 print(r0)
for start, end, style, items in r0: for start, end, style, items in r0:
print style print(style)
assert np.all(style == 0) assert np.all(style == 0)
for rawindex, comment in items.values(): for rawindex, comment in items.values():
assert not comment assert not comment
s2.restore_comments(r) s2.restore_comments(r)
r2 = s2.get_comment_restore_data([indexes]) r2 = s2.get_comment_restore_data([indexes])
print r2 print(r2)
for item1, item2 in zip(r, r2): for item1, item2 in zip(r, r2):
print item1 print(item1)
print item2 print(item2)
for a1, a2 in zip(item1, item2): for a1, a2 in zip(item1, item2):
print a1, a2 print(a1, a2)
if hasattr(a1, "shape"): if hasattr(a1, "shape"):
assert np.all(a1 - a2 == 0) assert np.all(a1 - a2 == 0)
else: else:
assert a1 == a2 assert a1 == a2
for item1, item2 in zip(r1, r2): for item1, item2 in zip(r1, r2):
print item1 print(item1)
print item2 print(item2)
# indexes won't be the same, but rawindexes and comments will # indexes won't be the same, but rawindexes and comments will
assert np.all(item1[2] - item2[2] == 0) assert np.all(item1[2] - item2[2] == 0)
assert set(item1[3].values()) == set(item2[3].values()) assert set(item1[3].values()) == set(item2[3].values())
@ -381,11 +383,11 @@ class TestResize(object):
# pointing to the same array in memory # pointing to the same array in memory
newbase = c.rawdata newbase = c.rawdata
newsub = s.rawdata newsub = s.rawdata
print c.rawdata.data[offset:offset+offset] print(c.rawdata.data[offset:offset+offset])
print s.rawdata.data[:] print(s.rawdata.data[:])
s.rawdata.data[:] = 111 s.rawdata.data[:] = 111
print c.rawdata.data[offset:offset+offset] print(c.rawdata.data[offset:offset+offset])
print s.rawdata.data[:] print(s.rawdata.data[:])
for i in range(offset): for i in range(offset):
assert s[i] == c[i + offset] assert s[i] == c[i + offset]
@ -408,11 +410,11 @@ class TestResize(object):
assert s.get_raw_index(i) == indexes[i] assert s.get_raw_index(i) == indexes[i]
newbase = c.rawdata newbase = c.rawdata
newsub = s.rawdata newsub = s.rawdata
print c.rawdata.data print(c.rawdata.data)
print s.rawdata.data[:] print(s.rawdata.data[:])
s.rawdata.data[:] = 111 s.rawdata.data[:] = 111
print c.rawdata.data print(c.rawdata.data)
print s.rawdata.data[:] print(s.rawdata.data[:])
for i in range(len(indexes)): for i in range(len(indexes)):
assert c.rawdata.data[indexes[i]] == s.rawdata.data[i] assert c.rawdata.data[indexes[i]] == s.rawdata.data[i]

View File

@ -1,3 +1,4 @@
from __future__ import print_function
import os import os
import numpy as np import numpy as np
@ -33,7 +34,7 @@ class TestSegment(object):
out = dict() out = dict()
s.serialize_extra_to_dict(out) s.serialize_extra_to_dict(out)
print "saved", out print("saved", out)
data = np.ones([4000], dtype=np.uint8) data = np.ones([4000], dtype=np.uint8)
r = SegmentData(data) r = SegmentData(data)
@ -41,7 +42,7 @@ class TestSegment(object):
s2.restore_extra_from_dict(out) s2.restore_extra_from_dict(out)
out2 = dict() out2 = dict()
s2.serialize_extra_to_dict(out2) s2.serialize_extra_to_dict(out2)
print "loaded", out2 print("loaded", out2)
assert out == out2 assert out == out2