# Test enums
assert SelectionMode.SINGLE.value == "single"
assert FileColumn.NAME.value == "name"
print("Enum tests passed!")Config
Configuration dataclasses and enums for the file browser.
Enums
Enumeration types for browser configuration options.
SelectionMode
def SelectionMode(
args:VAR_POSITIONAL, kwds:VAR_KEYWORD
):
File selection modes.
FileColumn
def FileColumn(
args:VAR_POSITIONAL, kwds:VAR_KEYWORD
):
Available columns for list view.
ViewConfig
Configuration for how directory contents are displayed.
ViewConfig
def ViewConfig(
columns:List=<factory>, default_sort:FileColumn=<FileColumn.NAME: 'name'>, sort_folders_first:bool=True,
allow_sort_toggle:bool=True
)->None:
View display configuration.
# Test ViewConfig defaults
view_config = ViewConfig()
assert FileColumn.NAME in view_config.columns
assert view_config.sort_folders_first == True
assert view_config.allow_sort_toggle == True
# Test custom config
custom_view = ViewConfig(
columns=[FileColumn.NAME, FileColumn.TYPE],
)
assert len(custom_view.columns) == 2
print("ViewConfig tests passed!")FilterConfig
Configuration for filtering which files are displayed.
FilterConfig
def FilterConfig(
allowed_extensions:Optional=None, show_directories:bool=True, show_hidden:bool=False,
show_system_files:bool=False, custom_filter:Optional=None
)->None:
Filtering configuration.
# Test FilterConfig
filter_config = FilterConfig()
# Test default (no filter)
file1 = FileInfo(name="test.txt", path="/test.txt", is_directory=False, extension="txt")
assert filter_config.matches(file1) == True
# Test hidden file filtering
hidden_file = FileInfo(name=".hidden", path="/.hidden", is_directory=False)
assert filter_config.matches(hidden_file) == False # Hidden files off by default
filter_with_hidden = FilterConfig(show_hidden=True)
assert filter_with_hidden.matches(hidden_file) == True
# Test extension filtering
ext_filter = FilterConfig(allowed_extensions=[".py", ".txt"])
py_file = FileInfo(name="script.py", path="/script.py", is_directory=False, extension="py")
js_file = FileInfo(name="script.js", path="/script.js", is_directory=False, extension="js")
folder = FileInfo(name="folder", path="/folder", is_directory=True)
assert ext_filter.matches(py_file) == True
assert ext_filter.matches(js_file) == False
assert ext_filter.matches(folder) == True # Directories always pass extension filter
# Test directory filtering
no_dirs = FilterConfig(show_directories=False)
assert no_dirs.matches(folder) == False
assert no_dirs.matches(py_file) == True
# Test custom filter
def size_filter(f: FileInfo) -> bool:
return f.size is None or f.size < 1000
custom_filter = FilterConfig(custom_filter=size_filter)
small_file = FileInfo(name="small.txt", path="/small.txt", is_directory=False, size=100)
large_file = FileInfo(name="large.txt", path="/large.txt", is_directory=False, size=10000)
assert custom_filter.matches(small_file) == True
assert custom_filter.matches(large_file) == False
print("FilterConfig tests passed!")FilterConfig tests passed!
FileBrowserCallbacks
Optional callbacks for customizing browser behavior.
FileBrowserCallbacks
def FileBrowserCallbacks(
on_navigate:Optional=None, on_select:Optional=None, on_selection_change:Optional=None, on_open:Optional=None,
validate_selection:Optional=None, validate_navigation:Optional=None
)->None:
Event callbacks for customization.
# Test FileBrowserCallbacks
navigated_paths = []
selected_files = []
def track_navigate(path: str):
navigated_paths.append(path)
def track_select(path: str):
selected_files.append(path)
def validate_py_only(path: str) -> Tuple[bool, str]:
if path.endswith('.py'):
return (True, "")
return (False, "Only .py files allowed")
callbacks = FileBrowserCallbacks(
on_navigate=track_navigate,
on_select=track_select,
validate_selection=validate_py_only
)
# Test callbacks work
callbacks.on_navigate("/home/user")
callbacks.on_select("/home/user/file.txt")
assert navigated_paths == ["/home/user"]
assert selected_files == ["/home/user/file.txt"]
# Test validation
valid, msg = callbacks.validate_selection("/test.py")
assert valid == True
valid, msg = callbacks.validate_selection("/test.txt")
assert valid == False
assert "Only .py files" in msg
print("FileBrowserCallbacks tests passed!")FileBrowserCallbacks tests passed!
FileBrowserConfig
Main configuration for the file browser component.
FileBrowserConfig
def FileBrowserConfig(
provider:Optional=None, start_path:Optional=None, selection_mode:SelectionMode=<SelectionMode.SINGLE: 'single'>,
selectable_types:Literal='files', max_selections:Optional=None, view:ViewConfig=<factory>,
filter:FilterConfig=<factory>, show_path_bar:bool=True, show_path_input:bool=False, show_breadcrumbs:bool=True,
bookmarks:Optional=None, show_bookmarks:bool=False, container_id:str='file-browser',
content_id:str='file-browser-content', path_bar_id:str='file-browser-path',
listing_id:str='file-browser-listing', vc_prefix:str=''
)->None:
Main configuration for file browser.
# Test FileBrowserConfig
config = FileBrowserConfig()
# Test defaults
assert config.selection_mode == SelectionMode.SINGLE
assert config.selectable_types == "files"
assert config.show_path_bar == True
assert config.container_id == "file-browser"
assert config.vc_prefix == ""
assert isinstance(config.view, ViewConfig)
assert isinstance(config.filter, FilterConfig)
# Test can_select
file = FileInfo(name="test.txt", path="/test.txt", is_directory=False)
folder = FileInfo(name="folder", path="/folder", is_directory=True)
# Default: files only
assert config.can_select(file) == True
assert config.can_select(folder) == False
# Directories only
dir_config = FileBrowserConfig(selectable_types="directories")
assert dir_config.can_select(file) == False
assert dir_config.can_select(folder) == True
# Both
both_config = FileBrowserConfig(selectable_types="both")
assert both_config.can_select(file) == True
assert both_config.can_select(folder) == True
# No selection
no_select = FileBrowserConfig(selection_mode=SelectionMode.NONE)
assert no_select.can_select(file) == False
assert no_select.can_select(folder) == False
# Test with custom IDs and vc_prefix
custom_config = FileBrowserConfig(
container_id="my-browser",
content_id="my-content",
filter=FilterConfig(allowed_extensions=[".db"]),
bookmarks=[("Home", "/home"), ("Downloads", "/downloads")],
vc_prefix="fb",
)
assert custom_config.container_id == "my-browser"
assert custom_config.filter.allowed_extensions == [".db"]
assert len(custom_config.bookmarks) == 2
assert custom_config.vc_prefix == "fb"
print("FileBrowserConfig tests passed!")