Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
Source code for brainsets.utils.dir_utils
import os
import pathlib
import shutil
from collections import defaultdict
import logging
from rich import print
from rich.filesize import decimal
from rich.markup import escape
from rich.prompt import Confirm , Prompt
from rich.text import Text
from rich.tree import Tree
[docs]
def find_files_by_extension ( folder_path , extension ):
for root , dirs , files in os . walk ( folder_path ):
for file in files :
if file . endswith ( extension ):
yield os . path . join ( root , file )
[docs]
def make_directory ( path , prompt_if_exists = False ):
if not os . path . exists ( path ):
os . makedirs ( path )
logging . info ( "New directory [u] {} [/u] created." . format ( path ))
else :
logging . info ( "Directory [u] {} [/u] already exists." . format ( path ))
if not prompt_if_exists :
return
rm_dir = Confirm . ask (
"Do you want to delete the folder? "
"[bold red blink]This will permanently remove its contents.[/bold red blink]" ,
default = False ,
)
if rm_dir :
shutil . rmtree ( path )
os . makedirs ( path )
logging . info ( "New directory [u] {} [/u] created." . format ( path ))
else :
# kill process
logging . info ( "Killing process." )
exit ()
[docs]
def get_dir_tree ( path ):
tree = Tree (
f ":open_file_folder: [link file:// { path } ] { path } " ,
guide_style = "bold bright_blue" ,
)
walk_directory ( pathlib . Path ( path ), tree )
return tree
[docs]
def walk_directory ( directory : pathlib . Path , tree : Tree ) -> None :
paths = sorted (
pathlib . Path ( directory ) . iterdir (),
key = lambda path : ( path . is_file (), path . name . lower ()),
)
for path in paths :
# Remove hidden files
if path . name . startswith ( "." ):
continue
if path . is_dir ():
style = "dim" if path . name . startswith ( "__" ) else ""
branch = tree . add (
f "[bold magenta]:open_file_folder: [link file:// { path } ] { escape ( path . name ) } " ,
style = style ,
guide_style = style ,
)
walk_directory ( path , branch )
else :
text_filename = Text ( path . name , "green" )
text_filename . highlight_regex ( r "\..*$" , "bold red" )
text_filename . stylize ( f "link file:// { path } " )
file_size = path . stat () . st_size
text_filename . append ( f " ( { decimal ( file_size ) } )" , "blue" )
try :
create_time = path . stat () . st_birthtime
text_filename . append ( f " ( { create_time } )" , "blue" )
except :
pass
icon = defaultdict (
lambda : "📄 " ,
py = "🐍 " ,
cfg = "🛠 " ,
pt = "🔥 " ,
nwb = "🧠 " ,
npy = "🐍 " ,
mat = "📊 " ,
)[ path . suffix [ 1 :]]
tree . add ( Text ( icon ) + text_filename )