22from itertools import chain
33from json import dumps as json_dumps
44from sys import stdout
5+ from typing import Callable , Dict , Iterable , TextIO
56
6- from ._getdents import (
7+ from . import (
78 DT_BLK ,
89 DT_CHR ,
910 DT_DIR ,
1213 DT_REG ,
1314 DT_SOCK ,
1415 DT_UNKNOWN ,
16+ DirectoryEntry ,
1517)
1618
1719
20+ Formatter = Callable [[Iterable [DirectoryEntry ], TextIO ], None ]
1821HEADER = ('inode' , 'type' , 'name' )
19- FORMATTERS = {}
22+ FORMATTERS : Dict [ str , Formatter ] = {}
2023TYPE_NAMES = {
2124 DT_BLK : 'blk' ,
2225 DT_CHR : 'chr' ,
2932}
3033
3134
32- def formatter (name , registry = FORMATTERS ):
33- def deco (fn ):
35+ def formatter (
36+ name : str ,
37+ registry : Dict [str , Formatter ] = FORMATTERS ,
38+ ) -> Callable [[Formatter ], Formatter ]:
39+ def deco (fn : Formatter ) -> Formatter :
3440 registry [name ] = fn
3541 return fn
3642 return deco
3743
3844
3945@formatter ('plain' )
40- def format_plain (directory_entries , file = stdout ):
46+ def format_plain (
47+ directory_entries : Iterable [DirectoryEntry ],
48+ file : TextIO = stdout ,
49+ ) -> None :
4150 for inode , type , name in directory_entries :
4251 print (name , file = file )
4352
4453
4554class Echo :
46- def write (self , value ) :
55+ def write (self , value : str ) -> str :
4756 return value
4857
4958
50- @formatter ('csv' )
51- def format_csv (directory_entries , file = stdout , headers = False ):
59+ def _format_csv (
60+ directory_entries : Iterable [DirectoryEntry ],
61+ file : TextIO = stdout ,
62+ headers : bool = False ,
63+ ) -> None :
5264 writer = csv_writer (Echo ())
5365
5466 for first in directory_entries :
@@ -62,12 +74,23 @@ def format_csv(directory_entries, file=stdout, headers=False):
6274 )
6375
6476
77+ @formatter ('csv' )
78+ def format_csv (
79+ directory_entries : Iterable [DirectoryEntry ],
80+ file : TextIO = stdout ,
81+ ) -> None :
82+ return _format_csv (directory_entries , file , False )
83+
84+
6585@formatter ('csv-headers' )
66- def format_csv_headers (directory_entries , file = stdout ):
67- return format_csv (directory_entries , file = file , headers = True )
86+ def format_csv_headers (
87+ directory_entries : Iterable [DirectoryEntry ],
88+ file : TextIO = stdout ,
89+ ) -> None :
90+ return _format_csv (directory_entries , file , True )
6891
6992
70- def json_encode (inode , type , name ) :
93+ def json_encode (inode : int , type : int , name : str ) -> str :
7194 return json_dumps ({
7295 'inode' : inode ,
7396 'type' : TYPE_NAMES [type ],
@@ -76,7 +99,10 @@ def json_encode(inode, type, name):
7699
77100
78101@formatter ('json' )
79- def format_json (directory_entries , file = stdout ):
102+ def format_json (
103+ directory_entries : Iterable [DirectoryEntry ],
104+ file : TextIO = stdout ,
105+ ) -> None :
80106 for inode , type , name in directory_entries :
81107 print (
82108 '[\n ' , json_encode (inode , type , name ),
@@ -93,6 +119,9 @@ def format_json(directory_entries, file=stdout):
93119
94120
95121@formatter ('json-stream' )
96- def format_json_stream (directory_entries , file = stdout ):
122+ def format_json_stream (
123+ directory_entries : Iterable [DirectoryEntry ],
124+ file : TextIO = stdout ,
125+ ) -> None :
97126 for inode , type , name in directory_entries :
98127 print (json_encode (inode , type , name ), file = file )
0 commit comments