From 2e171c9ce1c9cd682c8cc09c8284ca434b95f3c0 Mon Sep 17 00:00:00 2001 From: Eduardo Barrancos Date: Tue, 12 Mar 2024 23:40:58 +0000 Subject: [PATCH] Create delete duplicate rule --- .gitignore | 3 ++- file_sorter/file.py | 21 ++++++++------------- file_sorter/file_actions.py | 27 +++++++++++++++++++++++++++ file_sorter/file_sorter.py | 7 +++++-- file_sorter/rules.py | 8 +++++++- 5 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 file_sorter/file_actions.py diff --git a/.gitignore b/.gitignore index f63aef3..c279a05 100644 --- a/.gitignore +++ b/.gitignore @@ -53,4 +53,5 @@ cover/ # Project specific settings.json -logs/* \ No newline at end of file +logs/* +testing/* \ No newline at end of file diff --git a/file_sorter/file.py b/file_sorter/file.py index beaa081..d26611b 100644 --- a/file_sorter/file.py +++ b/file_sorter/file.py @@ -9,7 +9,7 @@ def __init__( depth: int, file_type: str): self.name = name - self.path = path + self.full_path = path self.depth = depth self.file_type = file_type @@ -18,29 +18,24 @@ def __str__(self) -> str: def __repr__(self) -> str: return self.__str__() + + def full_name(self) -> str: + return self.name + '.' + self.file_type def is_duplicate(self) -> bool: if len(self.name) < 3: return False return re.search("\([1-9]+[0-9]*\)$", self.name) is not None + + def delete(self) -> None: + os.remove(self.full_path) def build_file( root: str, name : str, depth: str): return File( - name, + name.split('.')[0], os.path.join(root, name), depth, name.split('.')[-1]) - -class FileAction: - def __init__(self, target_file: File) -> None: - self.target_file = target_file - - def execute() -> None: - pass - -class FileActionQueue: - def __init__(self) -> None: - self.queue = [] \ No newline at end of file diff --git a/file_sorter/file_actions.py b/file_sorter/file_actions.py new file mode 100644 index 0000000..e40d87f --- /dev/null +++ b/file_sorter/file_actions.py @@ -0,0 +1,27 @@ +from file import File +from common.logger import Logger + +class FileAction: + def __init__(self, target_file: File) -> None: + self.target_file = target_file + + def execute(self) -> None: + pass + +class DeleteFileAction(FileAction): + def execute(self) -> None: + self.target_file.delete() + Logger.info(f'Deleting {self.target_file.full_name()}') + + +class FileActionQueue: + def __init__(self) -> None: + self.queue = [] + + def queue_action(self, new_action: FileAction): + self.queue.append(new_action) + return self + + def execute_actions(self): + for action in self.queue: + action.execute() \ No newline at end of file diff --git a/file_sorter/file_sorter.py b/file_sorter/file_sorter.py index 6b9f6c7..d2200e6 100644 --- a/file_sorter/file_sorter.py +++ b/file_sorter/file_sorter.py @@ -4,7 +4,8 @@ from rules import AbstractRule import rules -from file import File, FileActionQueue +from file import File +from file_actions import FileActionQueue def build_file_list(directory_path: str, depth: int) -> Tuple[File]: files = () @@ -37,4 +38,6 @@ def run_file_sorter(directory_path: str, rules_class_name: str) -> None: queue = FileActionQueue() for file in target_files: - rules_class.invokate(file, queue) \ No newline at end of file + rules_class.invokate(file, queue) + + queue.execute_actions() \ No newline at end of file diff --git a/file_sorter/rules.py b/file_sorter/rules.py index 91c8e42..05a8df0 100644 --- a/file_sorter/rules.py +++ b/file_sorter/rules.py @@ -1,4 +1,5 @@ -from file import File, FileActionQueue +from file import File +from file_actions import FileActionQueue, DeleteFileAction class AbstractRule: def invokate(self, file: File, queue: FileActionQueue) -> None: @@ -6,6 +7,11 @@ def invokate(self, file: File, queue: FileActionQueue) -> None: """ Add your rules here """ +class DeleteDuplicateRule(AbstractRule): + def invokate(self, file: File, queue: FileActionQueue) -> None: + if file.is_duplicate(): + queue.queue_action(DeleteFileAction(file)) + class PrintName(AbstractRule): def invokate(self, file: File, queue: FileActionQueue): print(file.name)