Skip to content

Commit

Permalink
Typing improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
SmileyChris committed Mar 11, 2022
1 parent f2fee0a commit 179c94d
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 15 deletions.
4 changes: 2 additions & 2 deletions qrcode/image/styles/moduledrawers/pil.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from __future__ import absolute_import

import abc
from typing import TYPE_CHECKING, Union
from typing import TYPE_CHECKING, List, Union

from qrcode.image.styles.moduledrawers.base import QRModuleDrawer

Expand Down Expand Up @@ -150,7 +150,7 @@ def setup_corners(self):
self.SE_ROUND = self.NW_ROUND.transpose(Image.ROTATE_180)
self.NE_ROUND = self.NW_ROUND.transpose(Image.FLIP_LEFT_RIGHT)

def drawrect(self, box, is_active):
def drawrect(self, box: List[List[int]], is_active: "Union[bool, ActiveWithNeighbors]"):
if not is_active:
return
# find rounded edges
Expand Down
34 changes: 23 additions & 11 deletions qrcode/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
Optional,
Type,
TypeVar,
cast,
overload,
)

Expand Down Expand Up @@ -74,19 +75,20 @@ def __bool__(self) -> bool:

class QRCode(Generic[GenericImage]):
modules: ModulesType
_version: Optional[int] = None

def __init__(
self,
version=None,
error_correction=constants.ERROR_CORRECT_M,
box_size=10,
border=4,
image_factory: Type[GenericImage] = None,
image_factory: Optional[Type[GenericImage]] = None,
mask_pattern=None,
):
_check_box_size(box_size)
_check_border(border)
self.version = version and int(version)
self.version = version
self.error_correction = int(error_correction)
self.box_size = int(box_size)
# Spec says border should be at least four boxes wide, but allow for
Expand All @@ -98,6 +100,19 @@ def __init__(
assert issubclass(image_factory, BaseImage)
self.clear()

@property
def version(self) -> int:
if self._version is None:
self.best_fit()
return cast(int, self._version)

@version.setter
def version(self, value) -> None:
if value is not None:
value = int(value)
util.check_version(value)
self._version = value

@property
def mask_pattern(self):
return self._mask_pattern
Expand Down Expand Up @@ -147,17 +162,14 @@ def make(self, fit=True):
self.makeImpl(False, self.mask_pattern)

def makeImpl(self, test, mask_pattern):
util.check_version(self.version)
self.modules_count = self.version * 4 + 17

if self.version in precomputed_qr_blanks:
self.modules = copy_2d_array(precomputed_qr_blanks[self.version])
else:
self.modules = [None] * self.modules_count

for row in range(self.modules_count):
self.modules[row] = [None] * self.modules_count

self.modules = [
[None] * self.modules_count for i in range(self.modules_count)
]
self.setup_position_probe_pattern(0, 0)
self.setup_position_probe_pattern(self.modules_count - 7, 0)
self.setup_position_probe_pattern(0, self.modules_count - 7)
Expand Down Expand Up @@ -298,12 +310,12 @@ def print_ascii(self, out=None, tty=False, invert=False):
if invert:
codes.reverse()

def get_module(x, y):
def get_module(x, y) -> int:
if invert and self.border and max(x, y) >= modcount + self.border:
return 1
if min(x, y) < 0 or max(x, y) >= modcount:
return 0
return self.modules[x][y]
return cast(int, self.modules[x][y])

for r in range(-self.border, modcount + self.border, 2):
if tty:
Expand Down Expand Up @@ -513,7 +525,7 @@ def get_matrix(self):
code = [[False] * width] * self.border
x_border = [False] * self.border
for module in self.modules:
code.append(x_border + module + x_border)
code.append(x_border + cast(List[bool], module) + x_border)
code += [[False] * width] * self.border

return code
Expand Down
3 changes: 1 addition & 2 deletions qrcode/tests/test_qrcode.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ def test_large(self):
qr.make(fit=False)

def test_invalid_version(self):
qr = qrcode.QRCode(version=41)
self.assertRaises(ValueError, qr.make, fit=False)
self.assertRaises(ValueError, qrcode.QRCode, version=41)

def test_invalid_border(self):
self.assertRaises(ValueError, qrcode.QRCode, border=-1)
Expand Down
3 changes: 3 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ exclude =
max-line-length = 88
ignore = E203,W503

[isort]
profile = black

[coverage:run]
source = qrcode
parallel = True
Expand Down

0 comments on commit 179c94d

Please sign in to comment.