Skip to content

Commit dee4a35

Browse files
committed
Make PNG library optional.
Refs #338
1 parent dee7e1d commit dee4a35

File tree

4 files changed

+18
-9
lines changed

4 files changed

+18
-9
lines changed

qrcode/compat/png.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Try to import png library.
2+
PngWriter = None
3+
4+
try:
5+
from png import Writer as PngWriter # type: ignore # noqa: F401
6+
except ImportError: # pragma: no cover
7+
pass

qrcode/image/pure.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
from itertools import chain
22

3-
import png
3+
from qrcode.compat.png import PngWriter
4+
from qrcode.image.base import BaseImage
45

5-
import qrcode.image.base
66

7-
8-
class PyPNGImage(qrcode.image.base.BaseImage):
7+
class PyPNGImage(BaseImage):
98
"""
109
pyPNG image builder.
1110
"""
@@ -15,7 +14,7 @@ class PyPNGImage(qrcode.image.base.BaseImage):
1514
needs_drawrect = False
1615

1716
def new_image(self, **kwargs):
18-
return png.Writer(self.pixel_size, self.pixel_size, greyscale=True, bitdepth=1)
17+
return PngWriter(self.pixel_size, self.pixel_size, greyscale=True, bitdepth=1)
1918

2019
def drawrect(self, row, col):
2120
"""

qrcode/tests/test_qrcode.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
from tempfile import mkdtemp
55
from unittest import mock
66

7-
import png
87

98
import qrcode
109
import qrcode.util
1110
from qrcode.compat.pil import Image as pil_Image
11+
from qrcode.compat.png import PngWriter
1212
from qrcode.exceptions import DataOverflowError
1313
from qrcode.image.base import BaseImage
1414
from qrcode.image.pure import PyPNGImage
@@ -174,20 +174,22 @@ class MockFactory(BaseImage):
174174
self.assertTrue(MockFactory.new_image.called)
175175
self.assertTrue(MockFactory.drawrect.called)
176176

177+
@unittest.skipIf(not PngWriter, "Requires PNG")
177178
def test_render_pypng(self):
178179
qr = qrcode.QRCode()
179180
qr.add_data(UNICODE_TEXT)
180181
img = qr.make_image(image_factory=PyPNGImage)
181-
self.assertIsInstance(img.get_image(), png.Writer)
182+
self.assertIsInstance(img.get_image(), PngWriter)
182183

183184
print(img.width, img.box_size, img.border)
184185
img.save(io.BytesIO())
185186

187+
@unittest.skipIf(not PngWriter, "Requires PNG")
186188
def test_render_pypng_to_str(self):
187189
qr = qrcode.QRCode()
188190
qr.add_data(UNICODE_TEXT)
189191
img = qr.make_image(image_factory=PyPNGImage)
190-
self.assertIsInstance(img.get_image(), png.Writer)
192+
self.assertIsInstance(img.get_image(), PngWriter)
191193

192194
mock_open = mock.mock_open()
193195
with mock.patch("qrcode.image.pure.open", mock_open, create=True):

tox.ini

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tox]
22
distribute = False
3-
envlist = py{39,310,311,312}-{pil,nopil}
3+
envlist = py{39,310,311,312}-{pil,png,none}
44
skip_missing_interpreters = True
55

66
[gh-actions]
@@ -15,5 +15,6 @@ commands =
1515
pytest {envsitepackagesdir}/qrcode
1616
deps =
1717
pil: pillow>=9.1.0
18+
png: pypng
1819
pytest
1920
pytest-cov

0 commit comments

Comments
 (0)