Skip to content

Commit d2e3a05

Browse files
authored
Merge pull request #29 from FoamyGuy/type_annotations
adding type annotations
2 parents 1e7f941 + 32ca2f3 commit d2e3a05

File tree

1 file changed

+44
-36
lines changed

1 file changed

+44
-36
lines changed

adafruit_miniqr.py

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@
3636
# imports
3737
import math
3838

39+
40+
try:
41+
from typing import Optional, List, Dict, Tuple
42+
except ImportError:
43+
pass
44+
3945
__version__ = "0.0.0+auto.0"
4046
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_miniQR.git"
4147

@@ -52,14 +58,14 @@
5258
# Optimized polynomial helpers
5359

5460

55-
def _glog(n):
61+
def _glog(n: int) -> int:
5662
"""Lookup log(n) from pre-calculated byte table"""
5763
if n < 1:
5864
raise ValueError("glog(" + n + ")")
5965
return LOG_TABLE[n]
6066

6167

62-
def _gexp(n):
68+
def _gexp(n: int) -> int:
6369
"""Lookup exp(n) from pre-calculated byte table"""
6470
while n < 0:
6571
n += 255
@@ -78,7 +84,7 @@ def _gexp(n):
7884
class QRCode:
7985
"""The generator class for QR code matrices"""
8086

81-
def __init__(self, *, qr_type=None, error_correct=L):
87+
def __init__(self, *, qr_type: Optional[int] = None, error_correct: int = L):
8288
"""Initialize an empty QR code. You can define the `qr_type` (size)
8389
of the code matrix, or have the libary auto-select the smallest
8490
match. Default `error_correct` is type L (7%), but you can select M,
@@ -90,7 +96,7 @@ def __init__(self, *, qr_type=None, error_correct=L):
9096
self.data_cache = None
9197
self.data_list = []
9298

93-
def add_data(self, data):
99+
def add_data(self, data: bytes) -> None:
94100
"""Add more data to the QR code, must be bytestring stype"""
95101
self.data_list.append(data)
96102
datalen = sum(len(x) for x in self.data_list)
@@ -105,7 +111,7 @@ def add_data(self, data):
105111
break
106112
self.data_cache = None
107113

108-
def make(self, *, test=False, mask_pattern=0):
114+
def make(self, *, test: bool = False, mask_pattern: int = 0) -> None:
109115
"""Perform the actual generation of the QR matrix. To keep things
110116
small and speedy we don't generate all 8 mask patterns and pick
111117
the best. Instead, please pass in a desired mask_pattern, the
@@ -127,7 +133,7 @@ def make(self, *, test=False, mask_pattern=0):
127133
self.data_cache = QRCode._create_data(self.type, self.ECC, self.data_list)
128134
self._map_data(self.data_cache, mask_pattern)
129135

130-
def _setup_position_probe_pattern(self, row, col):
136+
def _setup_position_probe_pattern(self, row: int, col: int) -> None:
131137
"""Add the positition probe data pixels to the matrix"""
132138
for r in range(-1, 8):
133139
if row + r <= -1 or self.module_count <= row + r:
@@ -142,7 +148,7 @@ def _setup_position_probe_pattern(self, row, col):
142148
)
143149
self.matrix[row + r, col + c] = test
144150

145-
def _setup_timing_pattern(self):
151+
def _setup_timing_pattern(self) -> None:
146152
"""Add the timing data pixels to the matrix"""
147153
for r in range(8, self.module_count - 8):
148154
if self.matrix[r, 6] is not None:
@@ -154,7 +160,7 @@ def _setup_timing_pattern(self):
154160
continue
155161
self.matrix[6, c] = c % 2 == 0
156162

157-
def _setup_position_adjust_pattern(self):
163+
def _setup_position_adjust_pattern(self) -> None:
158164
"""Add the position adjust data pixels to the matrix"""
159165
pos = QRUtil.get_pattern_position(self.type)
160166

@@ -168,7 +174,7 @@ def _setup_position_adjust_pattern(self):
168174
test = abs(r) == 2 or abs(c) == 2 or (r == 0 and c == 0)
169175
self.matrix[row + r, col + c] = test
170176

171-
def _setup_type_number(self, test):
177+
def _setup_type_number(self, test: bool) -> None:
172178
"""Add the type number pixels to the matrix"""
173179
bits = QRUtil.get_BCH_type_number(self.type)
174180

@@ -180,7 +186,7 @@ def _setup_type_number(self, test):
180186
mod = not test and ((bits >> i) & 1) == 1
181187
self.matrix[i % 3 + self.module_count - 8 - 3, i // 3] = mod
182188

183-
def _setup_type_info(self, test, mask_pattern):
189+
def _setup_type_info(self, test: bool, mask_pattern: int) -> None:
184190
"""Add the type info pixels to the matrix"""
185191
data = (self.ECC << 3) | mask_pattern
186192
bits = QRUtil.get_BCH_type_info(data)
@@ -208,7 +214,7 @@ def _setup_type_info(self, test, mask_pattern):
208214
# // fixed module
209215
self.matrix[self.module_count - 8, 8] = not test
210216

211-
def _map_data(self, data, mask_pattern):
217+
def _map_data(self, data: bytes, mask_pattern: int) -> None:
212218
"""Map the data onto the QR code"""
213219
inc = -1
214220
row = self.module_count - 1
@@ -240,7 +246,7 @@ def _map_data(self, data, mask_pattern):
240246
break
241247

242248
@staticmethod
243-
def _create_data(qr_type, ecc, data_list):
249+
def _create_data(qr_type: int, ecc: int, data_list: list) -> bytes:
244250
"""Check and format data into bit buffer"""
245251
rs_blocks = _get_rs_blocks(qr_type, ecc)
246252

@@ -286,7 +292,7 @@ def _create_data(qr_type, ecc, data_list):
286292

287293
# pylint: disable=too-many-locals,too-many-branches
288294
@staticmethod
289-
def _create_bytes(buffer, rs_blocks):
295+
def _create_bytes(buffer: bytes, rs_blocks: List[Dict]) -> bytes:
290296
"""Perform error calculation math on bit buffer"""
291297
offset = 0
292298
max_dc_count = 0
@@ -377,7 +383,7 @@ class QRUtil:
377383

378384
# pylint: disable=invalid-name
379385
@staticmethod
380-
def get_BCH_type_info(data):
386+
def get_BCH_type_info(data: int) -> int:
381387
"""Encode with G15 BCH mask"""
382388
d = data << 10
383389
while QRUtil.get_BCH_digit(d) - QRUtil.get_BCH_digit(QRUtil.G15) >= 0:
@@ -388,7 +394,7 @@ def get_BCH_type_info(data):
388394
return ((data << 10) | d) ^ QRUtil.G15_MASK
389395

390396
@staticmethod
391-
def get_BCH_type_number(data):
397+
def get_BCH_type_number(data: int) -> int:
392398
"""Encode with G18 BCH mask"""
393399
d = data << 12
394400
while QRUtil.get_BCH_digit(d) - QRUtil.get_BCH_digit(QRUtil.G18) >= 0:
@@ -398,7 +404,7 @@ def get_BCH_type_number(data):
398404
return (data << 12) | d
399405

400406
@staticmethod
401-
def get_BCH_digit(data):
407+
def get_BCH_digit(data: int) -> int:
402408
"""Count digits in data"""
403409
digit = 0
404410
while data != 0:
@@ -408,12 +414,12 @@ def get_BCH_digit(data):
408414

409415
# pylint: enable=invalid-name
410416
@staticmethod
411-
def get_pattern_position(qr_type):
417+
def get_pattern_position(qr_type: int) -> bytes:
412418
"""The mask pattern position array for this QR type"""
413419
return QRUtil.PATTERN_POSITION_TABLE[qr_type - 1]
414420

415421
@staticmethod
416-
def get_mask(mask, i, j):
422+
def get_mask(mask: int, i: int, j: int) -> int:
417423
"""Perform matching calculation on two vals for given pattern mask"""
418424
# pylint: disable=multiple-statements, too-many-return-statements
419425
if mask == 0:
@@ -436,7 +442,7 @@ def get_mask(mask, i, j):
436442
# pylint: enable=multiple-statements, too-many-return-statements
437443

438444
@staticmethod
439-
def get_error_correct_polynomial(ecc_length):
445+
def get_error_correct_polynomial(ecc_length: int) -> "QRPolynomial":
440446
"""Generate a ecc polynomial"""
441447
poly = QRPolynomial([1], 0)
442448
for i in range(ecc_length):
@@ -447,7 +453,7 @@ def get_error_correct_polynomial(ecc_length):
447453
class QRPolynomial:
448454
"""Structure for creating and manipulating error code polynomials"""
449455

450-
def __init__(self, num, shift):
456+
def __init__(self, num: int, shift: int):
451457
"""Create a QR polynomial"""
452458
if not num:
453459
raise ValueError(num.length + "/" + shift)
@@ -458,21 +464,23 @@ def __init__(self, num, shift):
458464
for i in range(len(num) - offset):
459465
self.num[i] = num[i + offset]
460466

461-
def get(self, index):
467+
def get(self, index: int) -> int:
462468
"""The exponent at the index location"""
463469
return self.num[index]
464470

465-
def get_length(self):
471+
def get_length(self) -> int:
466472
"""Length of the poly"""
467473
return len(self.num)
468474

469-
def multiply(self, e): # pylint: disable=invalid-name
475+
def multiply(
476+
self, other_polynomial: "QRPolynomial"
477+
) -> "QRPolynomial": # pylint: disable=invalid-name
470478
"""Multiply two polynomials, returns a new one"""
471-
num = [0 for x in range(self.get_length() + e.get_length() - 1)]
479+
num = [0 for x in range(self.get_length() + other_polynomial.get_length() - 1)]
472480

473481
for i in range(self.get_length()):
474-
for j in range(e.get_length()):
475-
num[i + j] ^= _gexp(_glog(self.get(i)) + _glog(e.get(j)))
482+
for j in range(other_polynomial.get_length()):
483+
num[i + j] ^= _gexp(_glog(self.get(i)) + _glog(other_polynomial.get(j)))
476484

477485
return QRPolynomial(num, 0)
478486

@@ -517,7 +525,7 @@ def multiply(self, e): # pylint: disable=invalid-name
517525
) # pylint: disable=line-too-long
518526

519527

520-
def _get_rs_blocks(qr_type, ecc):
528+
def _get_rs_blocks(qr_type: int, ecc: int) -> List[Dict]:
521529
rs_block = _QRRS_BLOCK_TABLE[(qr_type - 1) * 4 + ecc]
522530

523531
length = len(rs_block) // 3
@@ -535,15 +543,15 @@ def _get_rs_blocks(qr_type, ecc):
535543
class QRBitMatrix:
536544
"""A bit-packed storage class for matrices"""
537545

538-
def __init__(self, width, height):
546+
def __init__(self, width: int, height: int):
539547
self.width = width
540548
self.height = height
541549
if width > 60:
542550
raise ValueError("Max 60 bits wide:", width)
543551
self.buffer = [0] * self.height * 2
544552
self.used = [0] * self.height * 2
545553

546-
def __repr__(self):
554+
def __repr__(self) -> str:
547555
b = ""
548556
for y in range(self.height):
549557
for x in range(self.width):
@@ -554,7 +562,7 @@ def __repr__(self):
554562
b += "\n"
555563
return b
556564

557-
def __getitem__(self, key):
565+
def __getitem__(self, key: Tuple[int, int]) -> int:
558566
x, y = key
559567
if y > self.width:
560568
raise ValueError()
@@ -564,7 +572,7 @@ def __getitem__(self, key):
564572
return None
565573
return self.buffer[i] & (1 << j)
566574

567-
def __setitem__(self, key, value):
575+
def __setitem__(self, key: Tuple[int, int], value: int) -> None:
568576
x, y = key
569577
if y > self.width:
570578
raise ValueError()
@@ -584,24 +592,24 @@ def __init__(self):
584592
self.buffer = []
585593
self.length = 0
586594

587-
def __repr__(self):
595+
def __repr__(self) -> str:
588596
return ".".join([str(n) for n in self.buffer])
589597

590-
def get(self, index):
598+
def get(self, index: int) -> int:
591599
"""The bit value at a location"""
592600
i = index // 8
593601
return self.buffer[i] & (1 << (7 - index % 8))
594602

595-
def put(self, num, length):
603+
def put(self, num: int, length: int) -> None:
596604
"""Add a number of bits from a single integer value"""
597605
for i in range(length):
598606
self.put_bit(num & (1 << (length - i - 1)))
599607

600-
def get_length_bits(self):
608+
def get_length_bits(self) -> int:
601609
"""Size of bit buffer"""
602610
return self.length
603611

604-
def put_bit(self, bit):
612+
def put_bit(self, bit: int) -> None:
605613
"""Insert one bit at the end of the bit buffer"""
606614
i = self.length // 8
607615
if len(self.buffer) <= i:

0 commit comments

Comments
 (0)