33from pathlib import Path
44
55from textual .app import App , ComposeResult
6+ from textual .binding import Binding
67from textual .coordinate import Coordinate
7- from textual .widgets import DataTable , Header
8+ from textual .widgets import DataTable , Footer , Header , Label
89
910
1011def get_total_size (path : Path ) -> int :
@@ -29,18 +30,32 @@ def find_venvs(base_directory: Path):
2930 last_modified = int (
3031 round ((time .time () - dir_path .stat ().st_mtime ) / (24 * 3600 ))
3132 )
32- size = format_size (get_total_size (dir_path ))
33- venvs .append ((dir_path , last_modified , size ))
33+ size = get_total_size (dir_path )
34+ size_to_show = format_size (size )
35+ venvs .append ((dir_path , last_modified , size , size_to_show ))
36+ venvs .sort (key = lambda x : x [2 ], reverse = True )
3437
3538 return venvs
3639
3740
3841class TableApp (App ):
3942 deleted_cells : Coordinate = []
43+ bytes_release : int = 0
44+ BINDINGS = [
45+ Binding (key = "ctrl+q" , action = "quit" , description = "Quit the app" ),
46+ Binding (
47+ key = "ctrl+m" ,
48+ action = "enter" ,
49+ description = "Delete the .venv selected" ,
50+ show = True ,
51+ ),
52+ ]
4053
4154 def compose (self ) -> ComposeResult :
4255 yield Header ()
56+ yield Label ("Finding .venv directories..." )
4357 yield DataTable ()
58+ yield Footer ()
4459
4560 def on_mount (self ) -> None :
4661 self .title = """KillPy"""
@@ -50,11 +65,12 @@ def on_mount(self) -> None:
5065 venvs = find_venvs (current_directory )
5166 table = self .query_one (DataTable )
5267 table .focus ()
53- table .add_columns ("Path" , "Last Modified" , "Size" )
68+ table .add_columns ("Path" , "Last Modified" , "Size" , "Size (Human Readable)" )
5469 for venv in venvs :
5570 table .add_row (* venv )
5671 table .cursor_type = "row"
5772 table .zebra_stripes = True
73+ self .query_one (Label ).update (f"Found { len (venvs )} .venv directories" )
5874
5975 def on_key (self , event ):
6076 if event .key == "enter" :
@@ -65,8 +81,12 @@ def on_key(self, event):
6581 return event
6682 row_data = table .get_row_at (cursor_cell .row )
6783 path = row_data [0 ]
84+ self .bytes_release += row_data [2 ]
6885 shutil .rmtree (path )
69- table .update_cell_at (cursor_cell , f"DELETED { row_data [0 ]} " )
86+ table .update_cell_at (cursor_cell , f"DELETED { path } " )
87+ self .query_one (Label ).update (
88+ f"{ format_size (self .bytes_release )} deleted"
89+ )
7090 self .deleted_cells .append (cursor_cell )
7191 self .bell ()
7292 return event
0 commit comments