Skip to content

Commit 80538f3

Browse files
committed
feat: Use Logger
1 parent 2ea7264 commit 80538f3

File tree

2 files changed

+43
-24
lines changed

2 files changed

+43
-24
lines changed

example.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from rmqrcode import QRImage
44
from rmqrcode import FitStrategy
55

6+
import logging
7+
68

79
def main():
810
data = "https://oudon.xyz"
@@ -11,19 +13,29 @@ def main():
1113

1214
# Determine rMQR version automatically
1315
qr = rMQR.fit(data, ecc=error_correction_level, fit_strategy=fit_strategy)
14-
qr.dump()
16+
print(qr)
1517

1618
# Determine rMQR version manually
1719
# version = 'R13x99'
1820
# qr = rMQR(version, error_correction_level)
1921
# qr.make(data)
20-
# qr.dump()
22+
# print(qr)
2123

2224
# Save as png
2325
image = QRImage(qr)
2426
image.show()
2527
image.save("my_qr.png")
2628

2729

30+
def _init_logger():
31+
logger = logging.getLogger()
32+
logger.setLevel(logging.DEBUG)
33+
ch = logging.StreamHandler()
34+
ch.setLevel(logging.DEBUG)
35+
logger.addHandler(ch)
36+
return logger
37+
38+
2839
if __name__ == '__main__':
40+
logger = _init_logger()
2941
main()

rmqrcode/rmqrcode.py

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,28 @@
1111
from .enums.color import Color
1212
from .enums.fit_strategy import FitStrategy
1313

14+
import logging
1415

1516
class rMQR:
17+
@staticmethod
18+
def _init_logger():
19+
logger = logging.getLogger(__name__)
20+
logger.addHandler(logging.NullHandler())
21+
logger.setLevel(logging.DEBUG)
22+
logger.propagate = True
23+
return logger
24+
25+
1626
@staticmethod
1727
def fit(data,ecc=ErrorCorrectionLevel.M, fit_strategy=FitStrategy.BALANCED):
28+
logger = rMQR._init_logger()
29+
1830
data_length = ByteEncoder.length(data)
1931
ok_versions = []
2032
determined_width = set()
2133
determined_height = set()
2234

35+
logger.debug("Select rMQR Code version")
2336
for version_name, qr_version in data_capacities.items():
2437
if data_length <= qr_version['capacity']['Byte'][ecc]:
2538
width, height = qr_version['width'], qr_version['height']
@@ -31,7 +44,7 @@ def fit(data,ecc=ErrorCorrectionLevel.M, fit_strategy=FitStrategy.BALANCED):
3144
'width': width,
3245
'height': height,
3346
})
34-
print(f"ok: {version_name}")
47+
logger.debug(f"ok: {version_name}")
3548

3649
if len(ok_versions) == 0:
3750
raise DataTooLongError("The data is too long.")
@@ -43,14 +56,16 @@ def fit(data,ecc=ErrorCorrectionLevel.M, fit_strategy=FitStrategy.BALANCED):
4356
elif fit_strategy == FitStrategy.BALANCED:
4457
sort_key = lambda x: x['height'] * 9 + x['width']
4558
selected = sorted(ok_versions, key=sort_key)[0]
46-
print(f"selected: {selected}")
59+
logger.debug(f"selected: {selected}")
4760

4861
qr = rMQR(selected['version'], ecc)
4962
qr.make(data)
5063
return qr
5164

5265

53-
def __init__(self, version, ecc):
66+
def __init__(self, version, ecc, logger=None):
67+
self._logger = logger or rMQR._init_logger()
68+
5469
if not rMQR.validate_version(version):
5570
raise IllegalVersionError("The rMQR version is illegal.")
5671

@@ -96,21 +111,25 @@ def to_list(self):
96111
return [list(map(lambda x: 1 if x == Color.BLACK else 0, column)) for column in self._qr]
97112

98113

99-
def dump(self):
114+
def __str__(self):
115+
res = ""
116+
100117
show = {}
101118
show[Color.WHITE] = "_"
102119
show[Color.BLACK] = "X"
103120
show[Color.UNDEFINED] = "?"
104121
show[True] = "X"
105122
show[False] = "_"
106-
print(f"rMQR Version R{self._height}x{self._width}:")
123+
124+
res += f"rMQR Version R{self._height}x{self._width}:\n"
107125
for i in range(self._height):
108126
for j in range(self._width):
109127
if self._qr[i][j] in show:
110-
print(show[self._qr[i][j]], end="")
128+
res += show[self._qr[i][j]]
111129
else:
112-
print(self._qr[i][j], end="")
113-
print("")
130+
res += self._qr[i][j]
131+
res += "\n"
132+
return res
114133

115134

116135
def _put_finder_pattern(self):
@@ -259,9 +278,6 @@ def _put_data(self, data):
259278
codewords,
260279
qr_version['blocks'][self._error_correction_level]
261280
)
262-
# print("==============")
263-
# print(f"data_codewords_per_block = {data_codewords_per_block}")
264-
# print(f"rs_codewords_per_block = {rs_codewords_per_block}")
265281

266282
# データの並び替え
267283
# Data codewords
@@ -271,15 +287,15 @@ def _put_data(self, data):
271287
if i >= len(data_codewords):
272288
continue
273289
final_codewords.append(data_codewords[i])
274-
print(f"Put QR data codeword {i} : {data_codewords[i]}")
290+
self._logger.debug(f"Put QR data codeword {i} : {data_codewords[i]}")
275291

276292
# RS Codewords
277293
for i in range(len(rs_codewords_per_block[-1])):
278294
for rs_codewords in rs_codewords_per_block:
279295
if i >= len(rs_codewords):
280296
continue
281297
final_codewords.append(rs_codewords[i])
282-
print(f"Put RS data codewords {i} : {rs_codewords[i]}")
298+
self._logger.debug(f"Put RS data codewords {i} : {rs_codewords[i]}")
283299

284300
# 配置
285301
dy = -1 # 最初は上方向
@@ -292,7 +308,6 @@ def _put_data(self, data):
292308
while True:
293309
for x in [cx, cx-1]:
294310
if self._qr[cy][x] == Color.UNDEFINED:
295-
# print(f"(x, y) = ({x}, {cy}), dir = {dy}, codewords[{current_codeword_idx}][{current_bit_idx}] = {final_codewords[current_codeword_idx][current_bit_idx]}")
296311
# 空白のセルのみ処理する
297312
if current_codeword_idx == len(final_codewords):
298313
# codewordsを配置しきった場合はremainder_bitsがあれば配置する
@@ -303,7 +318,6 @@ def _put_data(self, data):
303318
# codewordsを配置する
304319
self._qr[cy][x] = Color.BLACK if final_codewords[current_codeword_idx][current_bit_idx] == '1' else Color.WHITE
305320
mask_area[cy][x] = True
306-
# qr[cy][x] = chr(ord('A') + current_codeword_idx)
307321
current_bit_idx += 1
308322
if current_bit_idx == 8:
309323
current_bit_idx = 0
@@ -340,10 +354,6 @@ def _split_into_blocks(self, codewords, blocks_definition):
340354
rs_codewords_num = block_definition['c'] - block_definition['k']
341355
g = GeneratorPolynomials[rs_codewords_num]
342356

343-
# print('----------')
344-
# print(f"D{data_idx} to D{data_idx + data_codewords_num - 1}")
345-
# print(f"E{error_idx} to D{error_idx + rs_codewords_num - 1}")
346-
347357
codewords_in_block = codewords[data_idx : data_idx + data_codewords_num]
348358
rs_codewords_in_block = compute_reed_solomon(codewords_in_block, g, rs_codewords_num)
349359

@@ -353,8 +363,6 @@ def _split_into_blocks(self, codewords, blocks_definition):
353363
data_idx += data_codewords_num
354364
error_idx += rs_codewords_num
355365

356-
# print(f"codewords in block = {codewords_in_block}, len = {len(codewords_in_block)}")
357-
# print(f"rs_codewords in block = {rs_codewords_in_block}, len = {len(rs_codewords_in_block)}")
358366
return data_codewords_per_block, rs_codewords_per_block
359367

360368

@@ -378,7 +386,6 @@ def _apply_mask(self, mask_area):
378386
self._qr[y][x] = Color.WHITE
379387
elif self._qr[y][x] == Color.WHITE:
380388
self._qr[y][x] = Color.BLACK
381-
# qr[y][x] = 'B' if mask(x, y) else 'W'
382389

383390

384391
@staticmethod

0 commit comments

Comments
 (0)