4
4
"""
5
5
from __future__ import annotations
6
6
7
+ from typing import TYPE_CHECKING
7
8
from typing import Collection
9
+ from typing import Literal
8
10
9
11
from barcode .base import Barcode
10
12
from barcode .charsets import code39
13
15
from barcode .errors import IllegalCharacterError
14
16
from barcode .errors import NumberOfDigitsError
15
17
18
+ if TYPE_CHECKING :
19
+ from barcode .writer import BaseWriter
20
+
16
21
__docformat__ = "restructuredtext en"
17
22
18
23
# Sizes
@@ -66,12 +71,13 @@ def calculate_checksum(self):
66
71
return k
67
72
return None
68
73
69
- def build (self ):
74
+ def build (self ) -> list [ str ] :
70
75
chars = [code39 .EDGE ]
71
76
for char in self .code :
72
77
chars .append (code39 .MAP [char ][1 ])
73
78
chars .append (code39 .EDGE )
74
- return [code39 .MIDDLE .join (chars )]
79
+ result = code39 .MIDDLE .join (chars )
80
+ return [result ]
75
81
76
82
def render (self , writer_options = None , text = None ):
77
83
options = {"module_width" : MIN_SIZE , "quiet_zone" : MIN_QUIET_ZONE }
@@ -135,8 +141,12 @@ class Code128(Barcode):
135
141
"""
136
142
137
143
name = "Code 128"
144
+ _charset : Literal ["A" , "B" , "C" ]
145
+ code : str
146
+ writer : BaseWriter
147
+ buffer : str
138
148
139
- def __init__ (self , code , writer = None ) -> None :
149
+ def __init__ (self , code : str , writer = None ) -> None :
140
150
self .code = code
141
151
self .writer = writer or self .default_writer ()
142
152
self ._charset = "B"
@@ -147,13 +157,15 @@ def __str__(self) -> str:
147
157
return self .code
148
158
149
159
@property
150
- def encoded (self ):
160
+ def encoded (self ) -> list [ int ] :
151
161
return self ._build ()
152
162
153
- def get_fullcode (self ):
163
+ def get_fullcode (self ) -> str :
154
164
return self .code
155
165
156
- def _new_charset (self , which ):
166
+ def _new_charset (self , which : Literal ["A" , "B" , "C" ]) -> list [int ]:
167
+ if which == self ._charset :
168
+ raise ValueError (f"Already in charset { which } " )
157
169
if which == "A" :
158
170
code = self ._convert ("TO_A" )
159
171
elif which == "B" :
@@ -163,11 +175,11 @@ def _new_charset(self, which):
163
175
self ._charset = which
164
176
return [code ]
165
177
166
- def _maybe_switch_charset (self , pos ) :
178
+ def _maybe_switch_charset (self , pos : int ) -> list [ int ] :
167
179
char = self .code [pos ]
168
180
next_ = self .code [pos : pos + 10 ]
169
181
170
- def look_next ():
182
+ def look_next () -> bool :
171
183
digits = 0
172
184
for c in next_ :
173
185
if c .isdigit ():
@@ -176,7 +188,7 @@ def look_next():
176
188
break
177
189
return digits > 3
178
190
179
- codes = []
191
+ codes : list [ int ] = []
180
192
if self ._charset == "C" and not char .isdigit ():
181
193
if char in code128 .B :
182
194
codes = self ._new_charset ("B" )
@@ -197,7 +209,7 @@ def look_next():
197
209
codes = self ._new_charset ("B" )
198
210
return codes
199
211
200
- def _convert (self , char ):
212
+ def _convert (self , char : str ):
201
213
if self ._charset == "A" :
202
214
return code128 .A [char ]
203
215
if self ._charset == "B" :
@@ -212,22 +224,23 @@ def _convert(self, char):
212
224
self ._buffer = ""
213
225
return value
214
226
return None
215
- return None
216
- return None
227
+ raise RuntimeError (
228
+ f"Character { char } could not be converted in charset { self ._charset } ."
229
+ )
217
230
218
- def _try_to_optimize (self , encoded ) :
231
+ def _try_to_optimize (self , encoded : list [ int ]) -> list [ int ] :
219
232
if encoded [1 ] in code128 .TO :
220
233
encoded [:2 ] = [code128 .TO [encoded [1 ]]]
221
234
return encoded
222
235
223
- def _calculate_checksum (self , encoded ) :
236
+ def _calculate_checksum (self , encoded : list [ int ]) -> int :
224
237
cs = [encoded [0 ]]
225
238
for i , code_num in enumerate (encoded [1 :], start = 1 ):
226
239
cs .append (i * code_num )
227
240
return sum (cs ) % 103
228
241
229
- def _build (self ):
230
- encoded = [code128 .START_CODES [self ._charset ]]
242
+ def _build (self ) -> list [ int ] :
243
+ encoded : list [ int ] = [code128 .START_CODES [self ._charset ]]
231
244
for i , char in enumerate (self .code ):
232
245
encoded .extend (self ._maybe_switch_charset (i ))
233
246
code_num = self ._convert (char )
@@ -240,7 +253,7 @@ def _build(self):
240
253
self ._buffer = ""
241
254
return self ._try_to_optimize (encoded )
242
255
243
- def build (self ):
256
+ def build (self ) -> list [ str ] :
244
257
encoded = self ._build ()
245
258
encoded .append (self ._calculate_checksum (encoded ))
246
259
code = ""
0 commit comments