From a99547a2cb62dbc3944eabca8d5939946d5f507c Mon Sep 17 00:00:00 2001 From: Wouter Wijsman Date: Mon, 19 Sep 2022 23:32:34 +0200 Subject: [PATCH] Make Download into a dataclass --- minigalaxy/download_manager.py | 6 ++-- minigalaxy/entity/__init__.py | 0 minigalaxy/{ => entity}/download.py | 48 ++++++++++++----------------- minigalaxy/entity/download_type.py | 9 ++++++ minigalaxy/ui/gametile.py | 4 +-- minigalaxy/ui/gametilelist.py | 4 +-- minigalaxy/ui/information.py | 2 +- tests/test_download.py | 2 +- 8 files changed, 39 insertions(+), 36 deletions(-) create mode 100644 minigalaxy/entity/__init__.py rename minigalaxy/{ => entity}/download.py (60%) create mode 100644 minigalaxy/entity/download_type.py diff --git a/minigalaxy/download_manager.py b/minigalaxy/download_manager.py index 84cfd228..7d2537a2 100644 --- a/minigalaxy/download_manager.py +++ b/minigalaxy/download_manager.py @@ -6,7 +6,8 @@ Example: >>> import os ->>> from minigalaxy.download import Download, DownloadType +>>> from minigalaxy.entity.download import Download +>>> from minigalaxy.entity.download_type import DownloadType >>> from minigalaxy.download_manager import DownloadManager >>> def your_function(): >>> image_url = "https://www.gog.com/bundles/gogwebsitestaticpages/images/icon_section1-header.png" @@ -25,7 +26,8 @@ from requests import Session from requests.exceptions import RequestException from minigalaxy.constants import DOWNLOAD_CHUNK_SIZE, MINIMUM_RESUME_SIZE, GAME_DOWNLOAD_THREADS, UI_DOWNLOAD_THREADS -from minigalaxy.download import Download, DownloadType +from minigalaxy.entity.download import Download +from minigalaxy.entity.download_type import DownloadType import minigalaxy.logger # noqa: F401 module_logger = logging.getLogger("minigalaxy.download_manager") diff --git a/minigalaxy/entity/__init__.py b/minigalaxy/entity/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/minigalaxy/download.py b/minigalaxy/entity/download.py similarity index 60% rename from minigalaxy/download.py rename to minigalaxy/entity/download.py index b279b19c..8847e4d8 100644 --- a/minigalaxy/download.py +++ b/minigalaxy/entity/download.py @@ -1,16 +1,12 @@ -from enum import Enum +from dataclasses import dataclass +from typing import Callable, Optional from zipfile import BadZipFile - -# Enums were added in Python 3.4 -class DownloadType(Enum): - ICON = 1 - THUMBNAIL = 2 - GAME = 3 - GAME_UPDATE = 4 - GAME_DLC = 5 +from minigalaxy.entity.download_type import DownloadType +from minigalaxy.game import Game +@dataclass class Download: """ A class to easily download from URLs and save the file. @@ -25,42 +21,38 @@ class Download: >>> download = Download(image_url, thumbnail, DownloadType.THUMBNAIL, finish_func=lambda x: print("Done downloading {}!".format(x))) # noqa: E501 >>> your_function() # doctest: +SKIP """ - def __init__(self, url, save_location, download_type=None, finish_func=None, - progress_func=None, cancel_func=None, number=1, - out_of_amount=1, game=None): - self.url = url - self.save_location = save_location - self.__finish_func = finish_func - self.__progress_func = progress_func - self.__cancel_func = cancel_func - self.number = number - self.out_of_amount = out_of_amount - self.game = game - # Type of object, e.g. icon, thumbnail, game, dlc, - self.download_type = download_type + url: str + save_location: str + download_type: Optional[DownloadType] = None + finish_func: Optional[Callable[[str], None]] = None + progress_func: Optional[Callable[[int], None]] = None + cancel_func: Optional[Callable[[], None]] = None + number: int = 1 + out_of_amount: int = 1 + game: Optional[Game] = None def set_progress(self, percentage: int) -> None: "Set the download progress of the Download" - if self.__progress_func: + if self.progress_func: if self.out_of_amount > 1: # Change the percentage based on which number we are progress_start = 100 / self.out_of_amount * (self.number - 1) percentage = progress_start + percentage / self.out_of_amount percentage = int(percentage) - self.__progress_func(percentage) + self.progress_func(percentage) def finish(self): """ finish is called when the download has completed If a finish_func was specified when the Download was created, call the function """ - if self.__finish_func: + if self.finish_func: try: - self.__finish_func(self.save_location) + self.finish_func(self.save_location) except (FileNotFoundError, BadZipFile): self.cancel() def cancel(self): "Cancel the download, calling a cancel_func if one was specified" - if self.__cancel_func: - self.__cancel_func() + if self.cancel_func: + self.cancel_func() diff --git a/minigalaxy/entity/download_type.py b/minigalaxy/entity/download_type.py new file mode 100644 index 00000000..1b4a7093 --- /dev/null +++ b/minigalaxy/entity/download_type.py @@ -0,0 +1,9 @@ +from enum import Enum + + +class DownloadType(Enum): + ICON = 1 + THUMBNAIL = 2 + GAME = 3 + GAME_UPDATE = 4 + GAME_DLC = 5 diff --git a/minigalaxy/ui/gametile.py b/minigalaxy/ui/gametile.py index 66574b9a..f8fe4694 100644 --- a/minigalaxy/ui/gametile.py +++ b/minigalaxy/ui/gametile.py @@ -5,7 +5,6 @@ import re import time import urllib.parse -from enum import Enum from minigalaxy.config import Config from minigalaxy.entity.state import State @@ -13,7 +12,8 @@ from minigalaxy.logger import logger from minigalaxy.translation import _ from minigalaxy.paths import CACHE_DIR, THUMBNAIL_DIR, ICON_DIR, UI_DIR -from minigalaxy.download import Download, DownloadType +from minigalaxy.entity.download_type import DownloadType +from minigalaxy.entity.download import Download from minigalaxy.download_manager import DownloadManager from minigalaxy.launcher import start_game from minigalaxy.installer import uninstall_game, install_game, check_diskspace diff --git a/minigalaxy/ui/gametilelist.py b/minigalaxy/ui/gametilelist.py index 5e01e7f7..09fb8146 100644 --- a/minigalaxy/ui/gametilelist.py +++ b/minigalaxy/ui/gametilelist.py @@ -5,7 +5,6 @@ import re import time import urllib.parse -from enum import Enum from minigalaxy.config import Config from minigalaxy.entity.state import State @@ -13,7 +12,8 @@ from minigalaxy.logger import logger from minigalaxy.translation import _ from minigalaxy.paths import CACHE_DIR, THUMBNAIL_DIR, ICON_DIR, UI_DIR -from minigalaxy.download import Download, DownloadType +from minigalaxy.entity.download_type import DownloadType +from minigalaxy.entity.download import Download from minigalaxy.download_manager import DownloadManager from minigalaxy.launcher import start_game from minigalaxy.installer import uninstall_game, install_game, check_diskspace diff --git a/minigalaxy/ui/information.py b/minigalaxy/ui/information.py index 58b8ce45..28a6a29a 100644 --- a/minigalaxy/ui/information.py +++ b/minigalaxy/ui/information.py @@ -6,7 +6,7 @@ from minigalaxy.paths import UI_DIR, THUMBNAIL_DIR, COVER_DIR from minigalaxy.translation import _ from minigalaxy.config import Config -from minigalaxy.download import Download +from minigalaxy.entity.download import Download from minigalaxy.download_manager import DownloadManager from minigalaxy.ui.gtk import Gtk, GLib, Gio, GdkPixbuf diff --git a/tests/test_download.py b/tests/test_download.py index b6145959..c3db1de4 100644 --- a/tests/test_download.py +++ b/tests/test_download.py @@ -1,7 +1,7 @@ from unittest import TestCase from unittest.mock import MagicMock, Mock -from minigalaxy.download import Download +from minigalaxy.entity.download import Download class TestDownload(TestCase):