Skip to content

Commit ca5501f

Browse files
authored
Merge pull request #49 from mithro/master
Make sure pretty_hex works under Python 2 and Python 3.
2 parents 99f87a5 + 240ac67 commit ca5501f

File tree

5 files changed

+47
-12
lines changed

5 files changed

+47
-12
lines changed

programmer/MANIFEST.in

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ include *.md
44
# Include the license file
55
include LICENSE
66

7+
include *.py
78
include *.sh
89
include *.toml
910
include .coveragerc

programmer/check_doctests.py

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/usr/bin/env python
2+
import doctest
3+
import tinyprog
4+
doctest.testmod(tinyprog)

programmer/tinyprog/__init__.py

+28-7
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,30 @@
3333

3434

3535
def pretty_hex(data):
36-
output = ""
36+
"""
37+
>>> print(pretty_hex("abc123"))
38+
61 62 63 31 32 33
39+
>>> print(pretty_hex(b"abc123"))
40+
61 62 63 31 32 33
41+
>>> print(pretty_hex(u"abc123"))
42+
61 62 63 31 32 33
43+
>>> print(pretty_hex("\\x00a\\x02"*12))
44+
00 61 02 00 61 02 00 61 02 00 61 02 00 61 02 00
45+
61 02 00 61 02 00 61 02 00 61 02 00 61 02 00 61
46+
02 00 61 02
47+
"""
48+
output = []
3749
for i in range(0, len(data), 16):
38-
output += " ".join(["%02x" % ord(x) for x in data[i:i + 16]]) + "\n"
39-
return output
50+
output.append(" ".join("%02x" % to_int(x) for x in data[i:i + 16]))
51+
return "\n".join(output)
4052

4153

4254
def to_int(value):
4355
"""
4456
>>> to_int('A')
4557
65
4658
>>> to_int(0xff)
47-
256
59+
255
4860
>>> list(to_int(i) for i in ['T', 'i', 'n', 'y', 0xff, 0, 0])
4961
[84, 105, 110, 121, 255, 0, 0]
5062
"""
@@ -71,7 +83,8 @@ def get_ports(device_id):
7183
try:
7284
ports += [
7385
UsbPort(usb, d)
74-
for d in usb.core.find(idVendor=vid, idProduct=pid, find_all=True)
86+
for d in usb.core.find(
87+
idVendor=vid, idProduct=pid, find_all=True)
7588
if not d.is_kernel_driver_active(1)
7689
]
7790
except usb.core.USBError as e:
@@ -90,6 +103,7 @@ def get_ports(device_id):
90103
class PortError(Exception):
91104
pass
92105

106+
93107
class SerialPort(object):
94108
def __init__(self, port_name):
95109
self.port_name = port_name
@@ -129,6 +143,7 @@ def read(self, length):
129143
except serial.SerialException as e:
130144
raise PortError("Failed to read from serial port:\n%s" % str(e))
131145

146+
132147
class UsbPort(object):
133148
def __init__(self, usb, device):
134149
self.usb = usb
@@ -166,6 +181,7 @@ def read(self, length):
166181
except self.usb.core.USBError as e:
167182
raise PortError("Failed to read from USB:\n%s" % str(e))
168183

184+
169185
def _mirror_byte(b):
170186
return bit_reverse_table[to_int(b)]
171187

@@ -185,7 +201,11 @@ def __init__(self, prog):
185201

186202
def _parse_json(self, data):
187203
try:
188-
return json.loads(bytes(data).replace(b"\x00", b"").replace(b"\xff", b"").decode("utf-8"))
204+
data = bytes(data)
205+
data = data.replace(b"\x00", b"")
206+
data = data.replace(b"\xff", b"")
207+
data = data.decode("utf-8")
208+
return json.loads(data)
189209
except BaseException:
190210
return None
191211

@@ -239,7 +259,8 @@ def userdata_addr_range(self):
239259

240260
def _get_addr_range(self, name):
241261
# get the bootmeta's addrmap or fallback to the root's addrmap.
242-
addr_map = self.root.get(u"bootmeta", {}).get(u"addrmap", self.root.get(u"addrmap", None))
262+
addr_map = self.root.get(u"bootmeta", {}).get(
263+
u"addrmap", self.root.get(u"addrmap", None))
243264
if addr_map is None:
244265
raise Exception("Missing address map from device metadata")
245266
addr_str = addr_map.get(name, None)

programmer/tinyprog/__main__.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
#!/usr/bin/env python
2+
3+
from __future__ import print_function
4+
15
import sys
26
import argparse
37
import json
@@ -355,7 +359,8 @@ def parse_int(str_value):
355359

356360
if args.update_bootloader:
357361
boards_needing_update = (
358-
check_for_wrong_tinyfpga_bx_vidpid() + check_for_new_bootloader())
362+
check_for_wrong_tinyfpga_bx_vidpid()
363+
+ check_for_new_bootloader())
359364

360365
if len(boards_needing_update) == 0:
361366
print("""\
@@ -365,7 +370,8 @@ def parse_int(str_value):
365370
perform_bootloader_update(port)
366371

367372
# program the flash memory
368-
if (args.program is not None) or (args.program_userdata is not None) or (
373+
if (args.program is not None) or (
374+
args.program_userdata is not None) or (
369375
args.program_image is not None):
370376
boot_fpga = False
371377

@@ -422,7 +428,8 @@ def progress(info):
422428
sys.exit(1)
423429

424430
if check_if_overwrite_bootloader(
425-
addr, len(bitstream), fpga.meta.userdata_addr_range()):
431+
addr, len(bitstream),
432+
fpga.meta.userdata_addr_range()):
426433
boot_fpga = True
427434
print(" Programming at addr {:06x}".format(addr))
428435
if not fpga.program_bitstream(addr, bitstream):

programmer/tox.ini

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ commands =
1616
python setup.py --version
1717
check-manifest --ignore tox.ini,tinyprog/full_version.py
1818
python setup.py check -m -s
19-
flake8 --exclude=data_tables.py setup.py tinyprog
19+
python check_doctests.py
20+
flake8 setup.py tinyprog
2021
python setup.py install
2122
tinyprog --help
2223
tinyprog --version
2324

2425
[flake8]
25-
exclude = .tox,*.egg,build,data
26+
exclude = .tox,*.egg,build,data,data_tables.py
2627
select = E,W,F
28+
ignore=W503

0 commit comments

Comments
 (0)