1616import sys
1717import typing as t
1818
19+ __version__ : str = "0.2.0"
1920
20- __version__ = "0.2.0"
2121
22-
23- Transform = t .Callable [[str , t .Mapping [str , str ]], t .List [str ]]
22+ Transform = t .Callable [[str , t .Mapping [str , str ]], list [str ]]
2423
2524
2625@dataclasses .dataclass
@@ -30,9 +29,9 @@ class TableCfg:
3029
3130
3231class Cfg (t .TypedDict ):
33- database : t . Dict [str , str ]
34- misc : t . Dict [str , str ]
35- tables : t . Dict [str , TableCfg ]
32+ database : dict [str , str ]
33+ misc : dict [str , str ]
34+ tables : dict [str , TableCfg ]
3635
3736
3837FUNC_REF_PATTERN = re .compile (
@@ -43,11 +42,11 @@ class Cfg(t.TypedDict):
4342 (?P<object>[a-z_][a-z0-9_]*(?:\.[a-z_][a-z0-9_]*)*)
4443 $
4544 """ ,
46- re .I | re .X ,
45+ re .IGNORECASE | re .VERBOSE ,
4746)
4847
4948
50- def match (name : str ) -> t . Tuple [str , str ]:
49+ def match (name : str ) -> tuple [str , str ]:
5150 matches = FUNC_REF_PATTERN .match (name )
5251 if not matches :
5352 raise ValueError (f"Malformed callable '{ name } '" )
@@ -65,18 +64,16 @@ class MalformedNetstringError(Exception):
6564 pass
6665
6766
68- def read_netstring (fp : t .IO [str ]) -> t .Optional [str ]:
69- """
70- Reads a single netstring.
71- """
67+ def read_netstring (fp : t .IO [str ]) -> str | None :
68+ """Reads a single netstring."""
7269 ns = ""
7370 while True :
7471 c = fp .read (1 )
7572 if c == "" :
7673 return None
7774 if c == ":" :
7875 break
79- if len (ns ) > 10 :
76+ if len (ns ) > 10 : # noqa: PLR2004
8077 raise MalformedNetstringError
8178 if c == "0" and ns == "" :
8279 # We can't allow leading zeros.
@@ -98,7 +95,7 @@ def read_netstring(fp: t.IO[str]) -> t.Optional[str]:
9895 return result
9996
10097
101- def write_netstring (fp : t .IO [str ], response : str ):
98+ def write_netstring (fp : t .IO [str ], response : str ) -> None :
10299 fp .write (f"{ len (response )} :{ response } ," )
103100 fp .flush ()
104101
@@ -110,7 +107,7 @@ def process_local(local_part: str, cfg: t.Mapping[str, str]) -> str:
110107 return local_part .lower ()
111108
112109
113- def split (arg : str , cfg : t .Mapping [str , str ]) -> t . List [str ]:
110+ def split (arg : str , cfg : t .Mapping [str , str ]) -> list [str ]:
114111 parts = arg .split ("@" , 1 )
115112 parts [0 ] = process_local (parts [0 ], cfg )
116113 parts [1 ] = parts [1 ].lower ()
@@ -119,10 +116,10 @@ def split(arg: str, cfg: t.Mapping[str, str]) -> t.List[str]:
119116
120117def parse_config (fp : t .IO [str ]) -> Cfg :
121118 transforms = {
122- "all" : lambda arg , cfg : [arg ],
123- "lowercase" : lambda arg , cfg : [arg .lower ()],
119+ "all" : lambda arg , _ : [arg ],
120+ "lowercase" : lambda arg , _ : [arg .lower ()],
124121 "local" : lambda arg , cfg : [process_local (arg .split ("@" , 1 )[0 ], cfg )],
125- "domain" : lambda arg , cfg : [arg .split ("@" , 1 )[1 ].lower ()],
122+ "domain" : lambda arg , _ : [arg .split ("@" , 1 )[1 ].lower ()],
126123 "split" : split ,
127124 }
128125
@@ -156,7 +153,7 @@ def parse_config(fp: t.IO[str]) -> Cfg:
156153 )
157154
158155
159- def get_int (cfg : t .Mapping [str , str ], key : str ) -> t . Optional [ int ] :
156+ def get_int (cfg : t .Mapping [str , str ], key : str ) -> int | None :
160157 return int (cfg [key ]) if key in cfg else None
161158
162159
@@ -167,7 +164,7 @@ def serve_client(
167164 timeout : int ,
168165 tables : t .Mapping [str , TableCfg ],
169166 cfg : t .Mapping [str , str ],
170- ):
167+ ) -> None :
171168 max_requests = get_int (cfg , "max_requests" )
172169 try :
173170 while True :
@@ -202,17 +199,15 @@ def serve_client(
202199 if result is None :
203200 write_netstring (fh_out , "NOTFOUND " )
204201 else :
205- write_netstring (fh_out , f"OK { str ( result [0 ]) } " )
202+ write_netstring (fh_out , f"OK { result [0 ]!s } " )
206203 except MalformedNetstringError :
207204 write_netstring (fh_out , "PERM malformed netstring" )
208205 except Exception as exc :
209- write_netstring (fh_out , f"PERM { str ( exc ) } " )
206+ write_netstring (fh_out , f"PERM { exc !s } " )
210207
211208
212- def connect (settings : t .Dict [str , str ]):
213- """
214- Connect to a database.
215- """
209+ def connect (settings : dict [str , str ]):
210+ """Connect to a database."""
216211 driver = importlib .import_module (settings .pop ("driver" , "sqlite3" ))
217212 return driver .connect (** settings )
218213
@@ -239,7 +234,7 @@ def make_parser() -> argparse.ArgumentParser:
239234 return parser
240235
241236
242- def main ():
237+ def main () -> int :
243238 args = make_parser ().parse_args ()
244239
245240 with contextlib .closing (args .config ):
0 commit comments