Improved type annotations and linting using TypedDicts
This commit is contained in:
		
							parent
							
								
									5e84b81c7f
								
							
						
					
					
						commit
						f005a6fb50
					
				
					 1 changed files with 11 additions and 13 deletions
				
			
		| 
						 | 
					@ -1,25 +1,23 @@
 | 
				
			||||||
from sys import exit
 | 
					from sys import exit
 | 
				
			||||||
from os import chdir, getenv, system
 | 
					from os import chdir, getenv, system
 | 
				
			||||||
from typing import List, Dict, Union
 | 
					 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import tomllib
 | 
					import tomllib
 | 
				
			||||||
from datetime import datetime, time
 | 
					from datetime import datetime, time
 | 
				
			||||||
from apscheduler.schedulers.background import BackgroundScheduler, BlockingScheduler
 | 
					from apscheduler.schedulers.background import BackgroundScheduler
 | 
				
			||||||
from apscheduler.triggers.cron import CronTrigger
 | 
					from apscheduler.triggers.cron import CronTrigger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from wallman_classes import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Setup Logging. NOTE: Declaration as a global variable is necessary to ensure correct functionality across multiple modules.
 | 
					# Setup Logging. NOTE: Declaration as a global variable is necessary to ensure correct functionality across multiple modules.
 | 
				
			||||||
global logger
 | 
					global logger
 | 
				
			||||||
logger = logging.getLogger("wallman")
 | 
					logger = logging.getLogger("wallman")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ConfigError(Exception):
 | 
					 | 
				
			||||||
    pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class _ConfigLib:
 | 
					class _ConfigLib:
 | 
				
			||||||
    # Initializes the most important config values. TODO: Add handling for the empty config edge case
 | 
					    # Initializes the most important config values. TODO: Add handling for the empty config edge case
 | 
				
			||||||
    def __init__(self) -> None:
 | 
					    def __init__(self) -> None:
 | 
				
			||||||
        self.config_file: Dict[str, Dict[str, Union[int, str, bool, List[str]]]] = self._initialize_config() # Full config
 | 
					        self.config_file: ConfigFile = self._initialize_config() # Full config
 | 
				
			||||||
        # Dictionaries
 | 
					        # Dictionaries
 | 
				
			||||||
        self.config_general: Dict[str, Union[int, str, bool, List[str]]] = self.config_file["general"]
 | 
					        self.config_general: ConfigGeneral = self.config_file["general"]
 | 
				
			||||||
        self.config_changing_times: Dict[str, str] = self.config_file["changing_times"]
 | 
					        self.config_changing_times: Dict[str, str] = self.config_file["changing_times"]
 | 
				
			||||||
        # Values in Dicts
 | 
					        # Values in Dicts
 | 
				
			||||||
        self.config_wallpaper_sets_enabled: bool = self.config_general["enable_wallpaper_sets"]
 | 
					        self.config_wallpaper_sets_enabled: bool = self.config_general["enable_wallpaper_sets"]
 | 
				
			||||||
| 
						 | 
					@ -47,16 +45,16 @@ class _ConfigLib:
 | 
				
			||||||
            self._initialize_systray()
 | 
					            self._initialize_systray()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Read config. TODO: Add error handling for the config not found case.
 | 
					    # Read config. TODO: Add error handling for the config not found case.
 | 
				
			||||||
    def _initialize_config(self) -> Dict[str, Dict[str, Union[int, str, bool, List[str]]]]:
 | 
					    def _initialize_config(self) -> ConfigFile:
 | 
				
			||||||
        chdir(str(getenv("HOME")) + "/.config/wallman/")
 | 
					        chdir(str(getenv("HOME")) + "/.config/wallman/")
 | 
				
			||||||
        with open("wallman.toml", "rb") as config_file:
 | 
					        with open("wallman.toml", "rb") as config_file:
 | 
				
			||||||
            data: Dict[str, Dict[str, Union[int, str, bool, List[str]]]] = tomllib.load(config_file)
 | 
					            data: ConfigFile = tomllib.load(config_file) #pyright:ignore
 | 
				
			||||||
            return data
 | 
					            return data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # HACK on this to avoid double importing of wallman_systray due to variable scope. Idea: Global variable or Variable that is inherited?
 | 
					    # HACK on this to avoid double importing of wallman_systray due to variable scope. Idea: Global variable or Variable that is inherited?
 | 
				
			||||||
    def _initialize_systray(self):
 | 
					    def _initialize_systray(self):
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            import wallman_systray
 | 
					            import wallman_systray as _
 | 
				
			||||||
        except (ImportError, FileNotFoundError):
 | 
					        except (ImportError, FileNotFoundError):
 | 
				
			||||||
            self.config_systray = False
 | 
					            self.config_systray = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,6 +115,7 @@ class ConfigValidity(_ConfigLib):
 | 
				
			||||||
        super().__init__()
 | 
					        super().__init__()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _check_fallback_wallpaper(self) -> bool:
 | 
					    def _check_fallback_wallpaper(self) -> bool:
 | 
				
			||||||
 | 
					        # TODO: Make self.config_general["fallback_wallpaper"] a class-wide variable in ConfigLib
 | 
				
			||||||
        if self.config_general["fallback_wallpaper"]:
 | 
					        if self.config_general["fallback_wallpaper"]:
 | 
				
			||||||
            logger.debug("A fallback wallpaper has been defined.")
 | 
					            logger.debug("A fallback wallpaper has been defined.")
 | 
				
			||||||
            return True
 | 
					            return True
 | 
				
			||||||
| 
						 | 
					@ -213,7 +212,7 @@ class WallpaperLogic(_ConfigLib):
 | 
				
			||||||
    def __init__(self) -> None:
 | 
					    def __init__(self) -> None:
 | 
				
			||||||
        super().__init__()
 | 
					        super().__init__()
 | 
				
			||||||
        # NOTE: This looks a bit ugly. Consider pros and cons of adding this into _ConfigLib
 | 
					        # NOTE: This looks a bit ugly. Consider pros and cons of adding this into _ConfigLib
 | 
				
			||||||
        self.chosen_wallpaper_set: Union[bool, List[str]] = False
 | 
					        self.chosen_wallpaper_set: str = "fFTojkvCLIkGVlC6vUo4701djCZczmJDiyHKj4Qdj0zwkLyETsPxP88DLmY9In0I"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # NOTE: This function could be in a different file because it's not needed in the case only 1 wallpaper per set is needed.
 | 
					    # NOTE: This function could be in a different file because it's not needed in the case only 1 wallpaper per set is needed.
 | 
				
			||||||
    # Returns a list of a split string that contains a changing time from the config file
 | 
					    # Returns a list of a split string that contains a changing time from the config file
 | 
				
			||||||
| 
						 | 
					@ -222,7 +221,6 @@ class WallpaperLogic(_ConfigLib):
 | 
				
			||||||
        return unclean_times.split(":")
 | 
					        return unclean_times.split(":")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # NOTE: This could be in a different file because it's not needed in the "Only one wallpaper set" case.
 | 
					    # NOTE: This could be in a different file because it's not needed in the "Only one wallpaper set" case.
 | 
				
			||||||
    # FIXME: Use a TypedDict here
 | 
					 | 
				
			||||||
    def _choose_wallpaper_set(self) -> None:
 | 
					    def _choose_wallpaper_set(self) -> None:
 | 
				
			||||||
        from random import choice as choose_from
 | 
					        from random import choice as choose_from
 | 
				
			||||||
        self.chosen_wallpaper_set = choose_from(self.config_used_sets)
 | 
					        self.chosen_wallpaper_set = choose_from(self.config_used_sets)
 | 
				
			||||||
| 
						 | 
					@ -264,7 +262,7 @@ class WallpaperLogic(_ConfigLib):
 | 
				
			||||||
    # TODO: Add an way for the user to choose if the wallpaper should scale, fill or otherwise. This needs to be editable in the config file.
 | 
					    # TODO: Add an way for the user to choose if the wallpaper should scale, fill or otherwise. This needs to be editable in the config file.
 | 
				
			||||||
    def set_wallpaper_by_time(self) -> bool:
 | 
					    def set_wallpaper_by_time(self) -> bool:
 | 
				
			||||||
        # Ensure use of a consistent wallpaper set
 | 
					        # Ensure use of a consistent wallpaper set
 | 
				
			||||||
        if self.chosen_wallpaper_set is False:
 | 
					        if self.chosen_wallpaper_set != "fFTojkvCLIkGVlC6vUo4701djCZczmJDiyHKj4Qdj0zwkLyETsPxP88DLmY9In0I":
 | 
				
			||||||
            self._choose_wallpaper_set()
 | 
					            self._choose_wallpaper_set()
 | 
				
			||||||
        for time_range in range(self.config_total_changing_times - 1):
 | 
					        for time_range in range(self.config_total_changing_times - 1):
 | 
				
			||||||
            self.current_time_range = time_range # Store current time for better debugging output
 | 
					            self.current_time_range = time_range # Store current time for better debugging output
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue