Compare commits

..

No commits in common. "4a2bd301c6847cd9df2532c1457a22cbf26ff64d" and "5fa7e7bde95bf278a33926aae18feedcf12006f6" have entirely different histories.

4 changed files with 13 additions and 65 deletions

View File

@ -2,23 +2,9 @@ import argparse
import sys import sys
from pathlib import Path from pathlib import Path
from maildirclean.filedir import delete_all_from_selected_email
from .maildir import MailDir, TopSender, parse_maildir from .maildir import MailDir, TopSender, parse_maildir
class InputError(Exception):
"""Exception raised for custom error scenarios.
Attributes:
message -- explanation of the error
"""
def __init__(self):
self.message = "Please enter a valid number or 'q' to quit"
super().__init__(self.message)
def parse_arguments() -> argparse.Namespace: def parse_arguments() -> argparse.Namespace:
"""Parse command line arguments """Parse command line arguments
@ -38,15 +24,6 @@ def parse_arguments() -> argparse.Namespace:
default=5, default=5,
help="Number of top senders to display (default: 5)", help="Number of top senders to display (default: 5)",
) )
parser.add_argument(
"--no-confirm",
dest="confirm",
action="store_false",
default=True,
help="Skip confirmation prompts",
)
parser.add_argument( parser.add_argument(
"--verbose", "-v", action="store_true", help="Enable verbose output" "--verbose", "-v", action="store_true", help="Enable verbose output"
) )
@ -101,19 +78,14 @@ def run_loop(args: argparse.Namespace, maildir_path: str | Path):
) )
print(output) print(output)
if not user_input_loop(top_senders, maildir, args.confirm): if not user_input_loop(top_senders, maildir):
break break
def user_input_loop(top_senders: list[TopSender], maildir: MailDir, confirm) -> bool: def user_input_loop(top_senders: list[TopSender], maildir: MailDir) -> bool:
user_input = input("> ").strip() user_input = input("> ").strip()
while handle_user_input(user_input, top_senders, maildir):
while True: user_input = input("> ").strip()
try:
return handle_user_input(user_input, top_senders, maildir, confirm)
except InputError as ex:
print(ex.message)
user_input = input("> ").strip()
def parse_selections(user_input, max_selection): def parse_selections(user_input, max_selection):
@ -174,14 +146,15 @@ def parse_selections(user_input, max_selection):
return selections return selections
def handle_user_input(user_input, top_senders, maildir, confirm) -> bool: def handle_user_input(user_input, top_senders, maildir):
if user_input.lower() == "q": if user_input.lower() == "q":
return False return False
try: try:
selections = parse_selections(user_input, len(top_senders)) selections = parse_selections(user_input, len(top_senders))
selected_senders = [top_senders[selection - 1] for selection in selections] for selection in selections:
delete_all_from_selected_email(selected_senders, maildir, confirm) selected_sender = top_senders[selection - 1]
print(f"Selected {selected_sender.email}")
return True return True
except ValueError: except ValueError:
raise InputError print("Please enter a valid number or 'q' to quit")

View File

@ -5,19 +5,9 @@ import os
from maildirclean.maildir import MailDir, TopSender from maildirclean.maildir import MailDir, TopSender
def delete_all_from_selected_email( def delete_all_from_selected_email(selected_senders: list[TopSender], maildir: MailDir):
selected_senders: list[TopSender], maildir: MailDir, confirm=True
):
for sender in selected_senders: for sender in selected_senders:
emails = maildir.get_paths_for_email(sender.email) delete_files(maildir.get_paths_for_email(sender.email))
if confirm:
print(
f"Deleting {len(emails)} addressed from sender {sender.email}\nConfirm (y)"
)
if input("> ").strip() not in ["y", "Y", "yes", "Yes"]:
print(f"Cancelling delete")
continue
delete_files(emails)
maildir.remove_email(sender.email) maildir.remove_email(sender.email)

View File

@ -121,7 +121,7 @@ class MailDir:
return senders return senders
def get_paths_for_email(self, email: str) -> list[str]: def get_paths_for_email(self, email: str) -> list[str]:
return self._df.loc[self._df.email == email, "path"].to_list() return self._df.loc[self._df == email, "path"].to_list()
def remove_email(self, email: str): def remove_email(self, email: str):
self._df.drop(self._df[self._df["email"] == email].index, inplace=True) self._df.drop(self._df[self._df["email"] == email].index, inplace=True)

View File

@ -1,20 +1,5 @@
from fixtures import * from fixtures import *
from maildirclean.filedir import delete_all_from_selected_email, delete_files from maildirclean.filedir import delete_files
from maildirclean.maildir import TopSender, parse_maildir
def test_deleted_from_selected_email(sample_email_dir):
maildir = parse_maildir(sample_email_dir)
delete_all_from_selected_email(
[TopSender("test@something.org", [""], 2)], maildir, confirm=False
)
assert len(maildir._df) == 1
assert maildir._df.iloc[0].email == "not_a_test@something.org"
files = list(Path(sample_email_dir).glob("*"))
assert len(files) == 1
assert files[0] == Path(sample_email_dir) / "1"
def test_delete_files(sample_email_dir): def test_delete_files(sample_email_dir):