Compare commits
No commits in common. "4a2bd301c6847cd9df2532c1457a22cbf26ff64d" and "5fa7e7bde95bf278a33926aae18feedcf12006f6" have entirely different histories.
4a2bd301c6
...
5fa7e7bde9
@ -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")
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user