potodo/potodo/interactive.py

114 lines
3.7 KiB
Python
Raw Normal View History

2020-11-26 14:05:45 +00:00
import webbrowser
from pathlib import Path
2020-11-26 14:05:45 +00:00
from typing import Callable
2020-10-12 15:03:06 +00:00
from typing import cast
from typing import List
2020-08-25 06:59:46 +00:00
2020-08-24 19:31:13 +00:00
from simple_term_menu import TerminalMenu
2020-08-25 06:59:46 +00:00
2020-08-24 19:31:13 +00:00
IS_CURSOR_CYCLING = True
IS_SCREEN_CLEARED = True
2020-10-12 15:09:15 +00:00
def _directory_list_menu(directory_list: List[str]) -> int:
2020-08-24 19:31:13 +00:00
final_dir_list = directory_list
2020-09-14 08:54:40 +00:00
if "[q] Quit" not in final_dir_list:
final_dir_list.append("[q] Quit")
2020-08-24 19:31:13 +00:00
directory_list_menu = TerminalMenu(
menu_entries=final_dir_list,
title="Choose a directory",
cycle_cursor=IS_CURSOR_CYCLING,
clear_screen=IS_SCREEN_CLEARED,
# preview_command="",
# preview_size=0,
2020-09-14 08:54:40 +00:00
show_search_hint=True,
2020-10-12 12:52:58 +00:00
show_shortcut_hints=True,
2020-08-24 19:31:13 +00:00
)
selected_directory = directory_list_menu.show()
2020-10-12 12:52:58 +00:00
return cast(int, selected_directory)
2020-08-24 19:31:13 +00:00
2020-10-12 15:09:15 +00:00
def _file_list_menu(directory: str, file_list: List[str]) -> int:
2020-10-12 15:03:06 +00:00
if "[;] Back" not in file_list:
file_list.append("[;] Back")
file_list.append("[q] Quit")
2020-08-24 19:31:13 +00:00
file_list_menu = TerminalMenu(
2020-10-12 15:03:06 +00:00
menu_entries=file_list,
title=f"Choose a file from {directory}",
2020-08-24 19:31:13 +00:00
cycle_cursor=IS_CURSOR_CYCLING,
clear_screen=IS_SCREEN_CLEARED,
# preview_command="",
# preview_size=0,
2020-09-14 08:54:40 +00:00
show_search_hint=True,
2020-10-12 12:52:58 +00:00
show_shortcut_hints=True,
2020-08-24 19:31:13 +00:00
)
selected_file = file_list_menu.show()
2020-10-12 12:52:58 +00:00
return cast(int, selected_file)
2020-10-12 12:52:58 +00:00
def _confirmation_menu(choosen_file: str, directory: str) -> int:
confimation_menu = TerminalMenu(
title=f"Are you sure you want to choose {directory}/{choosen_file}?"
2020-08-25 06:59:46 +00:00
f" (This will open a web browser tab to open a new issue)",
menu_entries=["YES", "NO", "[;] Back", "[q] Quit"],
cycle_cursor=IS_CURSOR_CYCLING,
clear_screen=IS_SCREEN_CLEARED,
2020-09-14 08:54:40 +00:00
show_search_hint=True,
2020-10-12 12:52:58 +00:00
show_shortcut_hints=True,
)
choice = confimation_menu.show()
2020-10-12 12:52:58 +00:00
return cast(int, choice)
def get_dir_list(repo_path: Path, ignore_matches: Callable[[str], bool]) -> List[str]:
return list(
set(
[
file.parent.name
for file in repo_path.rglob("*.po")
if not ignore_matches(str(file))
]
)
)
def get_files_from_dir(
directory: str, repo_path: Path, ignore_matches: Callable[[str], bool]
) -> List[str]:
path = Path(str(repo_path) + "/" + directory)
return [file.name for file in path.rglob("*.po") if not ignore_matches(str(file))]
2020-10-24 20:44:11 +00:00
def interactive_output(path: Path, ignore_matches: Callable[[str], bool]) -> None:
directory_options = get_dir_list(repo_path=path, ignore_matches=ignore_matches)
2020-10-24 20:44:11 +00:00
while True:
selected_dir = _directory_list_menu(directory_options)
if selected_dir == (len(directory_options) - 1):
exit(0)
directory = directory_options[selected_dir]
file_options = get_files_from_dir(
directory=directory, repo_path=path, ignore_matches=ignore_matches
2020-10-24 20:44:11 +00:00
)
# TODO: Add stats on files and also add reservations
selected_file = _file_list_menu(directory, file_options)
if selected_file == (len(file_options) + 1):
exit(0)
elif selected_file == len(file_options):
continue
file = file_options[selected_file]
final_choice = _confirmation_menu(file, directory)
if final_choice == 3:
exit(0)
elif final_choice == 2:
continue
else:
break
if final_choice == 0:
webbrowser.open(
f"https://git.afpy.org/AFPy/python-docs-fr/issues/new?title=Je%20travaille%20sur%20"
2020-10-24 20:44:11 +00:00
f"{directory}/{file}"
f"&body=%0A%0A%0A---%0AThis+issue+was+created+using+potodo+interactive+mode."
)
else:
exit()