44"""
55from __future__ import annotations
66
7+ from typing import TYPE_CHECKING
78from typing import Collection
9+ from typing import Literal
810
911from barcode .base import Barcode
1012from barcode .charsets import code39
1315from barcode .errors import IllegalCharacterError
1416from barcode .errors import NumberOfDigitsError
1517
18+ if TYPE_CHECKING :
19+ from barcode .writer import BaseWriter
20+
1621__docformat__ = "restructuredtext en"
1722
1823# Sizes
@@ -66,12 +71,13 @@ def calculate_checksum(self):
6671 return k
6772 return None
6873
69- def build (self ):
74+ def build (self ) -> list [ str ] :
7075 chars = [code39 .EDGE ]
7176 for char in self .code :
7277 chars .append (code39 .MAP [char ][1 ])
7378 chars .append (code39 .EDGE )
74- return [code39 .MIDDLE .join (chars )]
79+ result = code39 .MIDDLE .join (chars )
80+ return [result ]
7581
7682 def render (self , writer_options = None , text = None ):
7783 options = {"module_width" : MIN_SIZE , "quiet_zone" : MIN_QUIET_ZONE }
@@ -135,8 +141,12 @@ class Code128(Barcode):
135141 """
136142
137143 name = "Code 128"
144+ _charset : Literal ["A" , "B" , "C" ]
145+ code : str
146+ writer : BaseWriter
147+ buffer : str
138148
139- def __init__ (self , code , writer = None ) -> None :
149+ def __init__ (self , code : str , writer = None ) -> None :
140150 self .code = code
141151 self .writer = writer or self .default_writer ()
142152 self ._charset = "B"
@@ -147,13 +157,15 @@ def __str__(self) -> str:
147157 return self .code
148158
149159 @property
150- def encoded (self ):
160+ def encoded (self ) -> list [ int ] :
151161 return self ._build ()
152162
153- def get_fullcode (self ):
163+ def get_fullcode (self ) -> str :
154164 return self .code
155165
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 } " )
157169 if which == "A" :
158170 code = self ._convert ("TO_A" )
159171 elif which == "B" :
@@ -163,11 +175,11 @@ def _new_charset(self, which):
163175 self ._charset = which
164176 return [code ]
165177
166- def _maybe_switch_charset (self , pos ) :
178+ def _maybe_switch_charset (self , pos : int ) -> list [ int ] :
167179 char = self .code [pos ]
168180 next_ = self .code [pos : pos + 10 ]
169181
170- def look_next ():
182+ def look_next () -> bool :
171183 digits = 0
172184 for c in next_ :
173185 if c .isdigit ():
@@ -176,7 +188,7 @@ def look_next():
176188 break
177189 return digits > 3
178190
179- codes = []
191+ codes : list [ int ] = []
180192 if self ._charset == "C" and not char .isdigit ():
181193 if char in code128 .B :
182194 codes = self ._new_charset ("B" )
@@ -197,7 +209,7 @@ def look_next():
197209 codes = self ._new_charset ("B" )
198210 return codes
199211
200- def _convert (self , char ):
212+ def _convert (self , char : str ):
201213 if self ._charset == "A" :
202214 return code128 .A [char ]
203215 if self ._charset == "B" :
@@ -212,22 +224,23 @@ def _convert(self, char):
212224 self ._buffer = ""
213225 return value
214226 return None
215- return None
216- return None
227+ raise RuntimeError (
228+ f"Character { char } could not be converted in charset { self ._charset } ."
229+ )
217230
218- def _try_to_optimize (self , encoded ) :
231+ def _try_to_optimize (self , encoded : list [ int ]) -> list [ int ] :
219232 if encoded [1 ] in code128 .TO :
220233 encoded [:2 ] = [code128 .TO [encoded [1 ]]]
221234 return encoded
222235
223- def _calculate_checksum (self , encoded ) :
236+ def _calculate_checksum (self , encoded : list [ int ]) -> int :
224237 cs = [encoded [0 ]]
225238 for i , code_num in enumerate (encoded [1 :], start = 1 ):
226239 cs .append (i * code_num )
227240 return sum (cs ) % 103
228241
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 ]]
231244 for i , char in enumerate (self .code ):
232245 encoded .extend (self ._maybe_switch_charset (i ))
233246 code_num = self ._convert (char )
@@ -240,7 +253,7 @@ def _build(self):
240253 self ._buffer = ""
241254 return self ._try_to_optimize (encoded )
242255
243- def build (self ):
256+ def build (self ) -> list [ str ] :
244257 encoded = self ._build ()
245258 encoded .append (self ._calculate_checksum (encoded ))
246259 code = ""
0 commit comments