From 71dbb8c557d43cba9d290674a332e7ecd1650261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Sun, 9 Jun 2024 12:25:46 +0200 Subject: [PATCH] Refactoring of game features for better management. (#149) * Refactoring following uibase change for game features. * Switch to ruff for linting and formatting. * Bump stubs to 2.5.1a0. --- .github/workflows/linters.yml | 6 +- basic_features/basic_mod_data_checker.py | 6 +- basic_features/basic_save_game_info.py | 5 +- basic_game.py | 31 +- epic_utils.py | 5 +- games/game_blackandwhite2.py | 17 +- games/game_bladeandsorcery.py | 6 +- games/game_cyberpunk2077.py | 14 +- games/game_da2.py | 4 +- games/game_daggerfallunity.py | 2 +- games/game_dao.py | 4 +- games/game_darkestdungeon.py | 4 +- games/game_darkmessiahofmightandmagic.py | 4 +- games/game_divinityoriginalsin.py | 6 +- games/game_divinityoriginalsinee.py | 8 +- games/game_dungeonsiege1.py | 2 +- games/game_dungeonsiege2.py | 2 +- games/game_gta-3-de.py | 2 +- games/game_gta-san-andreas-de.py | 4 +- games/game_gta-vice-city-de.py | 4 +- games/game_kerbalspaceprogram.py | 8 +- games/game_mountandblade2.py | 2 +- games/game_nfshs.py | 1 - games/game_stalkeranomaly.py | 6 +- games/game_stardewvalley.py | 2 +- games/game_subnautica.py | 26 +- games/game_tdu.py | 1 - games/game_tdu2.py | 1 - games/game_thps3.py | 1 - games/game_thps4.py | 1 - games/game_thug.py | 1 - games/game_thug2.py | 1 - games/game_tmuf.py | 1 - games/game_valheim.py | 110 +++---- games/game_vampirebloodlines.py | 6 +- games/game_witcher2.py | 9 +- games/game_witcher3.py | 4 +- games/game_zeusandposeidon.py | 2 +- origin_utils.py | 8 +- poetry.lock | 384 +++-------------------- pyproject.toml | 74 ++--- 41 files changed, 218 insertions(+), 567 deletions(-) diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index 381473d..711a3a7 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -12,13 +12,13 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.11 + python-version: 3.12 - uses: abatilo/actions-poetry@v2 - name: Install run: | cd basic_games - poetry install + poetry --no-root install - name: Lint run: | cd basic_games - poetry run poe lint-all + poetry run poe lint diff --git a/basic_features/basic_mod_data_checker.py b/basic_features/basic_mod_data_checker.py index 44e799c..408deac 100644 --- a/basic_features/basic_mod_data_checker.py +++ b/basic_features/basic_mod_data_checker.py @@ -160,11 +160,11 @@ class BasicModDataChecker(mobase.ModDataChecker): _regex_patterns: RegexPatterns """The regex patterns derived from the file (glob) patterns.""" - def __init__(self, file_patterns: GlobPatterns = GlobPatterns()): + def __init__(self, file_patterns: GlobPatterns | None = None): super().__init__() - self._file_patterns = file_patterns - self._regex_patterns = RegexPatterns(file_patterns) + self._file_patterns = file_patterns or GlobPatterns() + self._regex_patterns = RegexPatterns(self._file_patterns) def dataLooksValid( self, filetree: mobase.IFileTree diff --git a/basic_features/basic_save_game_info.py b/basic_features/basic_save_game_info.py index 8021388..7ba3094 100644 --- a/basic_features/basic_save_game_info.py +++ b/basic_features/basic_save_game_info.py @@ -80,7 +80,10 @@ class BasicGameSaveGameInfoWidget(mobase.ISaveGameInfoWidget): """ super().__init__(parent) - self._get_preview = get_preview or (lambda p: None) + def _no_preview(p: Path) -> None: + return None + + self._get_preview = get_preview or _no_preview self._get_metadata = get_metadata or get_filedate_metadata self._max_width = max_width or 320 diff --git a/basic_game.py b/basic_game.py index 0557355..ae2c0c0 100644 --- a/basic_game.py +++ b/basic_game.py @@ -83,13 +83,13 @@ class BasicGameMapping(Generic[_T]): if self._apply_fn is not None: try: value = self._apply_fn(value) - except: # noqa + except Exception as err: raise ValueError( "Basic game plugin from {} has an invalid {} property.".format( game._fromName, # pyright: ignore[reportPrivateUsage] self._exposed_name, ) - ) + ) from err self._default = lambda game: value # type: ignore elif default is not None: self._default = default # type: ignore @@ -360,19 +360,6 @@ class BasicGameMappings: ) -_GameFeature = ( - mobase.BSAInvalidation - | mobase.DataArchives - | mobase.GamePlugins - | mobase.LocalSavegames - | mobase.ModDataChecker - | mobase.ModDataContent - | mobase.SaveGameInfo - | mobase.ScriptExtender - | mobase.UnmanagedMods -) - - class BasicGame(mobase.IPluginGame): """This class implements some methods from mobase.IPluginGame to make it easier to create game plugins without having to implement @@ -408,9 +395,6 @@ class BasicGame(mobase.IPluginGame): # Path to the game, as set by MO2: _gamePath: str - # The feature map: - _featureMap: dict[type[_GameFeature], _GameFeature] - def __init__(self): super(BasicGame, self).__init__() @@ -418,10 +402,12 @@ class BasicGame(mobase.IPluginGame): self._fromName = self.__class__.__name__ self._gamePath = "" - self._featureMap = {} self._mappings: BasicGameMappings = BasicGameMappings(self) + def _register_feature(self, feature: mobase.GameFeature) -> bool: + return self._organizer.gameFeatures().registerFeature(self, feature, 0, True) + # Specific to BasicGame: def is_steam(self) -> bool: return self._mappings.steamAPPId.has_value() @@ -442,7 +428,9 @@ class BasicGame(mobase.IPluginGame): def init(self, organizer: mobase.IOrganizer) -> bool: self._organizer = organizer - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo() + + self._register_feature(BasicGameSaveGameInfo()) + if self._mappings.originWatcherExecutables.get(): from .origin_utils import OriginWatcher @@ -655,6 +643,3 @@ class BasicGame(mobase.IPluginGame): def savesDirectory(self) -> QDir: return self._mappings.savesDirectory.get() - - def _featureList(self): - return self._featureMap diff --git a/epic_utils.py b/epic_utils.py index 6612a57..67762cf 100644 --- a/epic_utils.py +++ b/epic_utils.py @@ -26,8 +26,9 @@ def find_epic_games() -> Iterable[tuple[str, Path]]: try: with open(manifest_file_path, encoding="utf-8") as manifest_file: manifest_file_data = json.load(manifest_file) - yield manifest_file_data["AppName"], Path( - manifest_file_data["InstallLocation"] + yield ( + manifest_file_data["AppName"], + Path(manifest_file_data["InstallLocation"]), ) except (json.JSONDecodeError, KeyError): print( diff --git a/games/game_blackandwhite2.py b/games/game_blackandwhite2.py index 768b6dc..0cc955e 100644 --- a/games/game_blackandwhite2.py +++ b/games/game_blackandwhite2.py @@ -191,10 +191,8 @@ class BlackAndWhite2SaveGame(BasicGameSaveGame): # to UNIX time and offset localtime self.lastsave = int( ( - ( - struct.unpack("q", self.readInf(info, "date"))[0] / 10000 - - 11644473600000 - ) + struct.unpack("q", self.readInf(info, "date"))[0] / 10000 + - 11644473600000 ) - (time.localtime().tm_gmtoff * 1000) ) @@ -262,12 +260,11 @@ class BlackAndWhite2Game(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: BasicGame.init(self, organizer) - self._featureMap[mobase.ModDataChecker] = BlackAndWhite2ModDataChecker() - self._featureMap[mobase.LocalSavegames] = BasicLocalSavegames( - self.savesDirectory() - ) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - get_metadata=getMetadata, max_width=400 + + self._register_feature(BlackAndWhite2ModDataChecker()) + self._register_feature(BasicLocalSavegames(self.savesDirectory())) + self._register_feature( + BasicGameSaveGameInfo(get_metadata=getMetadata, max_width=400) ) return True diff --git a/games/game_bladeandsorcery.py b/games/game_bladeandsorcery.py index 6e0569c..6d7187e 100644 --- a/games/game_bladeandsorcery.py +++ b/games/game_bladeandsorcery.py @@ -26,7 +26,7 @@ class BaSSaveGame(BasicGameSaveGame): h, m, s = save_data["playTime"].split(":") self._elapsed = (int(h), int(m), float(s)) f_stat = self._filepath.stat() - self._created = f_stat.st_ctime + self._created = f_stat.st_birthtime self._modified = f_stat.st_mtime def getName(self) -> str: @@ -83,8 +83,8 @@ class BaSGame(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: BasicGame.init(self, organizer) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - get_metadata=bas_parse_metadata, max_width=400 + self._register_feature( + BasicGameSaveGameInfo(get_metadata=bas_parse_metadata, max_width=400) ) return True diff --git a/games/game_cyberpunk2077.py b/games/game_cyberpunk2077.py index 6e1b689..8bdf686 100644 --- a/games/game_cyberpunk2077.py +++ b/games/game_cyberpunk2077.py @@ -314,14 +314,14 @@ class Cyberpunk2077Game(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) - self._featureMap[mobase.LocalSavegames] = BasicLocalSavegames( - self.savesDirectory() + self._register_feature(BasicLocalSavegames(self.savesDirectory())) + self._register_feature( + BasicGameSaveGameInfo( + lambda p: Path(p or "", "screenshot.png"), + parse_cyberpunk_save_metadata, + ) ) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - lambda p: Path(p or "", "screenshot.png"), - parse_cyberpunk_save_metadata, - ) - self._featureMap[mobase.ModDataChecker] = CyberpunkModDataChecker() + self._register_feature(CyberpunkModDataChecker()) self._modlist_files = ModListFileManager[Literal["archive", "redmod"]]( organizer, diff --git a/games/game_da2.py b/games/game_da2.py index 045055d..9d481e7 100644 --- a/games/game_da2.py +++ b/games/game_da2.py @@ -29,7 +29,7 @@ class DA2Game(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - lambda s: s.parent.joinpath("screen.dds") + self._register_feature( + BasicGameSaveGameInfo(lambda s: s.parent.joinpath("screen.dds")) ) return True diff --git a/games/game_daggerfallunity.py b/games/game_daggerfallunity.py index a6983dd..a51242d 100644 --- a/games/game_daggerfallunity.py +++ b/games/game_daggerfallunity.py @@ -38,7 +38,7 @@ class DaggerfallUnityModDataChecker(mobase.ModDataChecker): class DaggerfallUnityGame(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) - self._featureMap[mobase.ModDataChecker] = DaggerfallUnityModDataChecker() + self._register_feature(DaggerfallUnityModDataChecker()) return True Name = "Daggerfall Unity Support Plugin" diff --git a/games/game_dao.py b/games/game_dao.py index 458b96a..531b173 100644 --- a/games/game_dao.py +++ b/games/game_dao.py @@ -25,7 +25,7 @@ class DAOriginsGame(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - lambda s: s.parent.joinpath("screen.dds") + self._register_feature( + BasicGameSaveGameInfo(lambda s: s.parent.joinpath("screen.dds")) ) return True diff --git a/games/game_darkestdungeon.py b/games/game_darkestdungeon.py index 2ddc227..7e04148 100644 --- a/games/game_darkestdungeon.py +++ b/games/game_darkestdungeon.py @@ -125,7 +125,7 @@ class DarkestDungeonSaveGame(BasicGameSaveGame): "Meta2 has wrong number of bytes: " + str(meta2DataLength) ) meta2List: list[tuple[int, int, int]] = [] - for x in range(numMeta2Entries): + for _ in range(numMeta2Entries): entryHash = int.from_bytes(fp.read(4), "little") offset = int.from_bytes(fp.read(4), "little") fieldInfo = int.from_bytes(fp.read(4), "little") @@ -175,7 +175,7 @@ class DarkestDungeonGame(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) - self._featureMap[mobase.ModDataChecker] = DarkestDungeonModDataChecker() + self._register_feature(DarkestDungeonModDataChecker()) return True def executables(self): diff --git a/games/game_darkmessiahofmightandmagic.py b/games/game_darkmessiahofmightandmagic.py index d1e1a51..3941d82 100644 --- a/games/game_darkmessiahofmightandmagic.py +++ b/games/game_darkmessiahofmightandmagic.py @@ -43,7 +43,5 @@ class DarkMessiahOfMightAndMagicGame(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - self._read_save_tga - ) + self._register_feature(BasicGameSaveGameInfo(self._read_save_tga)) return True diff --git a/games/game_divinityoriginalsin.py b/games/game_divinityoriginalsin.py index 0aed02b..435846e 100644 --- a/games/game_divinityoriginalsin.py +++ b/games/game_divinityoriginalsin.py @@ -31,7 +31,9 @@ class DivinityOriginalSinGame(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - lambda s: s.with_suffix(".png") # Not confirmed + self._register_feature( + BasicGameSaveGameInfo( + lambda s: s.with_suffix(".png") # Not confirmed + ) ) return True diff --git a/games/game_divinityoriginalsinee.py b/games/game_divinityoriginalsinee.py index 994a7e4..1c03e55 100644 --- a/games/game_divinityoriginalsinee.py +++ b/games/game_divinityoriginalsinee.py @@ -89,12 +89,8 @@ class DivinityOriginalSinEnhancedEditionGame(BasicGame, mobase.IPluginFileMapper def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - lambda s: s.with_suffix(".png") - ) - self._featureMap[mobase.ModDataChecker] = ( - DivinityOriginalSinEnhancedEditionModDataChecker() - ) + self._register_feature(BasicGameSaveGameInfo(lambda s: s.with_suffix(".png"))) + self._register_feature(DivinityOriginalSinEnhancedEditionModDataChecker()) return True def mappings(self) -> list[mobase.Mapping]: diff --git a/games/game_dungeonsiege1.py b/games/game_dungeonsiege1.py index 7c3a040..723be45 100644 --- a/games/game_dungeonsiege1.py +++ b/games/game_dungeonsiege1.py @@ -74,7 +74,7 @@ class DungeonSiegeIGame(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.ModDataChecker] = DungeonSiegeIModDataChecker() + self._register_feature(DungeonSiegeIModDataChecker()) return True def executables(self): diff --git a/games/game_dungeonsiege2.py b/games/game_dungeonsiege2.py index 76c365c..b076fd5 100644 --- a/games/game_dungeonsiege2.py +++ b/games/game_dungeonsiege2.py @@ -74,7 +74,7 @@ class DungeonSiegeIIGame(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.ModDataChecker] = DungeonSiegeIIModDataChecker() + self._register_feature(DungeonSiegeIIModDataChecker()) return True def executables(self): diff --git a/games/game_gta-3-de.py b/games/game_gta-3-de.py index 09bc6ff..8c38b0b 100644 --- a/games/game_gta-3-de.py +++ b/games/game_gta-3-de.py @@ -44,7 +44,7 @@ class GTA3DefinitiveEditionGame(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) - self._featureMap[mobase.ModDataChecker] = GTA3DefinitiveEditionModDataChecker() + self._register_feature(GTA3DefinitiveEditionModDataChecker()) return True def executables(self): diff --git a/games/game_gta-san-andreas-de.py b/games/game_gta-san-andreas-de.py index 836e440..41cdb3d 100644 --- a/games/game_gta-san-andreas-de.py +++ b/games/game_gta-san-andreas-de.py @@ -44,9 +44,7 @@ class GTASanAndreasDefinitiveEditionGame(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) - self._featureMap[mobase.ModDataChecker] = ( - GTASanAndreasDefinitiveEditionModDataChecker() - ) + self._register_feature(GTASanAndreasDefinitiveEditionModDataChecker()) return True def executables(self): diff --git a/games/game_gta-vice-city-de.py b/games/game_gta-vice-city-de.py index 1da152b..ca90368 100644 --- a/games/game_gta-vice-city-de.py +++ b/games/game_gta-vice-city-de.py @@ -44,9 +44,7 @@ class GTAViceCityDefinitiveEditionGame(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) - self._featureMap[mobase.ModDataChecker] = ( - GTAViceCitysDefinitiveEditionModDataChecker() - ) + self._register_feature(GTAViceCitysDefinitiveEditionModDataChecker()) return True def executables(self): diff --git a/games/game_kerbalspaceprogram.py b/games/game_kerbalspaceprogram.py index f9f5848..71dbdcc 100644 --- a/games/game_kerbalspaceprogram.py +++ b/games/game_kerbalspaceprogram.py @@ -43,9 +43,11 @@ class KerbalSpaceProgramGame(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - lambda s: str( - Path(s).parent.joinpath("banners").joinpath(f"{Path(s).stem}.png") + self._register_feature( + BasicGameSaveGameInfo( + lambda s: str( + Path(s).parent.joinpath("banners").joinpath(f"{Path(s).stem}.png") + ) ) ) return True diff --git a/games/game_mountandblade2.py b/games/game_mountandblade2.py index e710840..bdbf9bf 100644 --- a/games/game_mountandblade2.py +++ b/games/game_mountandblade2.py @@ -54,7 +54,7 @@ class MountAndBladeIIGame(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.ModDataChecker] = MountAndBladeIIModDataChecker() + self._register_feature(MountAndBladeIIModDataChecker()) return True def executables(self): diff --git a/games/game_nfshs.py b/games/game_nfshs.py index 6ac5eca..8d07901 100644 --- a/games/game_nfshs.py +++ b/games/game_nfshs.py @@ -7,7 +7,6 @@ from ..basic_game import BasicGame class NFSHSGame(BasicGame): - Name = "Need for Speed: High Stakes Support Plugin" Author = "uwx" Version = "1.0.0" diff --git a/games/game_stalkeranomaly.py b/games/game_stalkeranomaly.py index 0b83477..25d60fd 100644 --- a/games/game_stalkeranomaly.py +++ b/games/game_stalkeranomaly.py @@ -238,9 +238,9 @@ class StalkerAnomalyGame(BasicGame, mobase.IPluginFileMapper): def init(self, organizer: mobase.IOrganizer): BasicGame.init(self, organizer) - self._featureMap[mobase.ModDataChecker] = StalkerAnomalyModDataChecker() - self._featureMap[mobase.ModDataContent] = StalkerAnomalyModDataContent() - self._featureMap[mobase.SaveGameInfo] = StalkerAnomalySaveGameInfo() + self._register_feature(StalkerAnomalyModDataChecker()) + self._register_feature(StalkerAnomalyModDataContent()) + self._register_feature(StalkerAnomalySaveGameInfo()) organizer.onAboutToRun(lambda _str: self.aboutToRun(_str)) return True diff --git a/games/game_stardewvalley.py b/games/game_stardewvalley.py index 70db9cd..fe19582 100644 --- a/games/game_stardewvalley.py +++ b/games/game_stardewvalley.py @@ -42,7 +42,7 @@ class StardewValleyGame(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.ModDataChecker] = StardewValleyModDataChecker() + self._register_feature(StardewValleyModDataChecker()) return True def executables(self): diff --git a/games/game_subnautica.py b/games/game_subnautica.py index 2ed5751..d9463be 100644 --- a/games/game_subnautica.py +++ b/games/game_subnautica.py @@ -21,9 +21,7 @@ from ..basic_game import BasicGame class SubnauticaModDataChecker(BasicModDataChecker): use_qmods: bool = False - def __init__( - self, patterns: GlobPatterns = GlobPatterns(), use_qmods: bool = False - ): + def __init__(self, patterns: GlobPatterns | None = None, use_qmods: bool = False): super().__init__( GlobPatterns( unfold=["BepInExPack_Subnautica"], @@ -48,7 +46,7 @@ class SubnauticaModDataChecker(BasicModDataChecker): "CustomCraft2SML": "QMods/" if use_qmods else "BepInEx/plugins/", "CustomCraft3": "QMods/" if use_qmods else "BepInEx/plugins/", }, - ).merge(patterns), + ).merge(patterns or GlobPatterns()), ) self.use_qmods = use_qmods @@ -126,8 +124,8 @@ class SubnauticaGame(BasicGame, mobase.IPluginFileMapper): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) self._set_mod_data_checker() - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - lambda s: Path(s or "", "screenshot.jpg") + self._register_feature( + BasicGameSaveGameInfo(lambda s: Path(s or "", "screenshot.jpg")) ) organizer.onPluginSettingChanged(self._settings_change_callback) @@ -136,13 +134,15 @@ class SubnauticaGame(BasicGame, mobase.IPluginFileMapper): def _set_mod_data_checker( self, extra_patterns: GlobPatterns | None = None, use_qmod: bool | None = None ): - self._featureMap[mobase.ModDataChecker] = SubnauticaModDataChecker( - patterns=(GlobPatterns() if extra_patterns is None else extra_patterns), - use_qmods=( - bool(self._organizer.pluginSetting(self.name(), "use_qmods")) - if use_qmod is None - else use_qmod - ), + self._register_feature( + SubnauticaModDataChecker( + patterns=(GlobPatterns() if extra_patterns is None else extra_patterns), + use_qmods=( + bool(self._organizer.pluginSetting(self.name(), "use_qmods")) + if use_qmod is None + else use_qmod + ), + ) ) def _settings_change_callback( diff --git a/games/game_tdu.py b/games/game_tdu.py index e8d9871..53deaea 100644 --- a/games/game_tdu.py +++ b/games/game_tdu.py @@ -7,7 +7,6 @@ from ..basic_game import BasicGame class TDUGame(BasicGame): - Name = "Test Drive Unlimited Support Plugin" Author = "uwx" Version = "1.0.0" diff --git a/games/game_tdu2.py b/games/game_tdu2.py index 83b0862..fdffd43 100644 --- a/games/game_tdu2.py +++ b/games/game_tdu2.py @@ -7,7 +7,6 @@ from ..basic_game import BasicGame class TDU2Game(BasicGame): - Name = "Test Drive Unlimited 2 Support Plugin" Author = "uwx" Version = "1.0.0" diff --git a/games/game_thps3.py b/games/game_thps3.py index 80ab9ad..b9dbc69 100644 --- a/games/game_thps3.py +++ b/games/game_thps3.py @@ -7,7 +7,6 @@ from ..basic_game import BasicGame class THPS3Game(BasicGame): - Name = "Tony Hawk's Pro Skater 3 Support Plugin" Author = "uwx" Version = "1.0.0" diff --git a/games/game_thps4.py b/games/game_thps4.py index f53f025..406bb62 100644 --- a/games/game_thps4.py +++ b/games/game_thps4.py @@ -7,7 +7,6 @@ from ..basic_game import BasicGame class THPS4Game(BasicGame): - Name = "Tony Hawk's Pro Skater 4 Support Plugin" Author = "uwx" Version = "1.0.0" diff --git a/games/game_thug.py b/games/game_thug.py index cd8e1eb..17f046f 100644 --- a/games/game_thug.py +++ b/games/game_thug.py @@ -7,7 +7,6 @@ from ..basic_game import BasicGame class THPS4Game(BasicGame): - Name = "Tony Hawk's Underground Support Plugin" Author = "uwx" Version = "1.0.0" diff --git a/games/game_thug2.py b/games/game_thug2.py index 1836722..187d30f 100644 --- a/games/game_thug2.py +++ b/games/game_thug2.py @@ -9,7 +9,6 @@ from ..basic_game import BasicGame class THPS4Game(BasicGame): - Name = "Tony Hawk's Underground 2 Support Plugin" Author = "uwx" Version = "1.0.0" diff --git a/games/game_tmuf.py b/games/game_tmuf.py index 387d518..394a367 100644 --- a/games/game_tmuf.py +++ b/games/game_tmuf.py @@ -9,7 +9,6 @@ from ..basic_game import BasicGame class TmufGame(BasicGame): - Name = "Trackmania United Forever Support Plugin" Author = "uwx" Version = "1.0.0" diff --git a/games/game_valheim.py b/games/game_valheim.py index 3334998..9750475 100644 --- a/games/game_valheim.py +++ b/games/game_valheim.py @@ -306,63 +306,63 @@ class ValheimGame(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) - self._featureMap[mobase.ModDataChecker] = BasicModDataChecker( - GlobPatterns( - unfold=[ - "BepInExPack_Valheim", - ], - valid=[ - "meta.ini", # Included in installed mod folder. - "BepInEx", - "doorstop_libs", - "unstripped_corlib", - "doorstop_config.ini", - "start_game_bepinex.sh", - "start_server_bepinex.sh", - "winhttp.dll", - "changelog.txt", - # - "InSlimVML", - "valheim_Data", - "inslimvml.ini", - # - "unstripped_managed", - # - "AdvancedBuilder", - ], - delete=[ - "*.txt", - "*.md", - "README", - "icon.png", - "license", - "manifest.json", - "*.dll.mdb", - "*.pdb", - ], - move={ - "*_VML.dll": "InSlimVML/Mods/", - # - "plugins": "BepInEx/", - "Jotunn": "BepInEx/plugins/", - "*.dll": "BepInEx/plugins/", - "*.xml": "BepInEx/plugins/", - "config": "BepInEx/", - "*.cfg": "BepInEx/config/", - # - "CustomTextures": "BepInEx/plugins/", - "*.png": "BepInEx/plugins/CustomTextures/", - # - "Builds": "AdvancedBuilder/", - "*.vbuild": "AdvancedBuilder/Builds/", - # - "*.assets": "valheim_Data/", - }, + self._register_feature( + BasicModDataChecker( + GlobPatterns( + unfold=[ + "BepInExPack_Valheim", + ], + valid=[ + "meta.ini", # Included in installed mod folder. + "BepInEx", + "doorstop_libs", + "unstripped_corlib", + "doorstop_config.ini", + "start_game_bepinex.sh", + "start_server_bepinex.sh", + "winhttp.dll", + "changelog.txt", + # + "InSlimVML", + "valheim_Data", + "inslimvml.ini", + # + "unstripped_managed", + # + "AdvancedBuilder", + ], + delete=[ + "*.txt", + "*.md", + "README", + "icon.png", + "license", + "manifest.json", + "*.dll.mdb", + "*.pdb", + ], + move={ + "*_VML.dll": "InSlimVML/Mods/", + # + "plugins": "BepInEx/", + "Jotunn": "BepInEx/plugins/", + "*.dll": "BepInEx/plugins/", + "*.xml": "BepInEx/plugins/", + "config": "BepInEx/", + "*.cfg": "BepInEx/config/", + # + "CustomTextures": "BepInEx/plugins/", + "*.png": "BepInEx/plugins/CustomTextures/", + # + "Builds": "AdvancedBuilder/", + "*.vbuild": "AdvancedBuilder/Builds/", + # + "*.assets": "valheim_Data/", + }, + ) ) ) - self._featureMap[mobase.LocalSavegames] = BasicLocalSavegames( - self.savesDirectory() - ) + self._register_feature(BasicLocalSavegames(self.savesDirectory())) self._overwrite_sync = OverwriteSync(organizer=self._organizer, game=self) self._register_event_handler() return True diff --git a/games/game_vampirebloodlines.py b/games/game_vampirebloodlines.py index b5e84ff..2a2a30f 100644 --- a/games/game_vampirebloodlines.py +++ b/games/game_vampirebloodlines.py @@ -73,10 +73,8 @@ class VampireTheMasqueradeBloodlinesGame(BasicGame): def init(self, organizer: mobase.IOrganizer) -> bool: super().init(organizer) - self._featureMap[mobase.ModDataChecker] = VampireModDataChecker() - self._featureMap[mobase.LocalSavegames] = BasicLocalSavegames( - self.savesDirectory() - ) + self._register_feature(VampireModDataChecker()) + self._register_feature(BasicLocalSavegames(self.savesDirectory())) return True def initializeProfile(self, directory: QDir, settings: mobase.ProfileSetting): diff --git a/games/game_witcher2.py b/games/game_witcher2.py index d7c41f9..1268ee9 100644 --- a/games/game_witcher2.py +++ b/games/game_witcher2.py @@ -18,7 +18,6 @@ class Witcher2SaveGame(BasicGameSaveGame): class Witcher2Game(BasicGame): - Name = "Witcher 2 Support Plugin" Author = "DefinitelyNotSade" Version = "1.0.0" @@ -38,9 +37,11 @@ class Witcher2Game(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - lambda s: Path(str(s.parent) + "\\" + s.stem + "_640x360").with_suffix( - ".bmp" + self._register_feature( + BasicGameSaveGameInfo( + lambda s: Path(str(s.parent) + "\\" + s.stem + "_640x360").with_suffix( + ".bmp" + ) ) ) return True diff --git a/games/game_witcher3.py b/games/game_witcher3.py index e5991ef..1bc5e8e 100644 --- a/games/game_witcher3.py +++ b/games/game_witcher3.py @@ -37,9 +37,7 @@ class Witcher3Game(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.SaveGameInfo] = BasicGameSaveGameInfo( - lambda s: s.with_suffix(".png") - ) + self._register_feature(BasicGameSaveGameInfo(lambda s: s.with_suffix(".png"))) return True def iniFiles(self): diff --git a/games/game_zeusandposeidon.py b/games/game_zeusandposeidon.py index 9a1b090..33a8c5a 100644 --- a/games/game_zeusandposeidon.py +++ b/games/game_zeusandposeidon.py @@ -66,5 +66,5 @@ class ZeusAndPoseidonGame(BasicGame): def init(self, organizer: mobase.IOrganizer): super().init(organizer) - self._featureMap[mobase.ModDataChecker] = ZeusAndPoseidonModDataChecker() + self._register_feature(ZeusAndPoseidonModDataChecker()) return True diff --git a/origin_utils.py b/origin_utils.py index 793cf44..da050e8 100644 --- a/origin_utils.py +++ b/origin_utils.py @@ -5,8 +5,8 @@ import os import threading import time +from collections.abc import Sequence from pathlib import Path -from typing import Dict, List from urllib import parse import psutil @@ -20,7 +20,7 @@ class OriginWatcher: DRM to launch Origin as needed. """ - def __init__(self, executables: List[str] = []): + def __init__(self, executables: Sequence[str] = []): self.executables = list(map(lambda s: s.lower(), executables)) def spawn_origin_watcher(self) -> bool: @@ -62,7 +62,7 @@ class OriginWatcher: time.sleep(1) -def find_games() -> Dict[str, Path]: +def find_games() -> dict[str, Path]: """ Find the list of Origin games installed. @@ -70,7 +70,7 @@ def find_games() -> Dict[str, Path]: A mapping from Origin manifest IDs to install locations for available Origin games. """ - games: Dict[str, Path] = {} + games: dict[str, Path] = {} program_data_path = os.path.expandvars("%PROGRAMDATA%") local_content_path = Path(program_data_path).joinpath("Origin", "LocalContent") diff --git a/poetry.lock b/poetry.lock index 1a62302..f6dd499 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,137 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. - -[[package]] -name = "black" -version = "24.2.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-24.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29"}, - {file = "black-24.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430"}, - {file = "black-24.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f"}, - {file = "black-24.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a"}, - {file = "black-24.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd"}, - {file = "black-24.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2"}, - {file = "black-24.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92"}, - {file = "black-24.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23"}, - {file = "black-24.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b"}, - {file = "black-24.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9"}, - {file = "black-24.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693"}, - {file = "black-24.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982"}, - {file = "black-24.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4"}, - {file = "black-24.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218"}, - {file = "black-24.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0"}, - {file = "black-24.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d"}, - {file = "black-24.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8"}, - {file = "black-24.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8"}, - {file = "black-24.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540"}, - {file = "black-24.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31"}, - {file = "black-24.2.0-py3-none-any.whl", hash = "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6"}, - {file = "black-24.2.0.tar.gz", hash = "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "flake8" -version = "7.0.0" -description = "the modular source code checker: pep8 pyflakes and co" -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, - {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, -] - -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.11.0,<2.12.0" -pyflakes = ">=3.2.0,<3.3.0" - -[[package]] -name = "flake8-black" -version = "0.3.6" -description = "flake8 plugin to call black as a code style validator" -optional = false -python-versions = ">=3.7" -files = [ - {file = "flake8-black-0.3.6.tar.gz", hash = "sha256:0dfbca3274777792a5bcb2af887a4cad72c72d0e86c94e08e3a3de151bb41c34"}, - {file = "flake8_black-0.3.6-py3-none-any.whl", hash = "sha256:fe8ea2eca98d8a504f22040d9117347f6b367458366952862ac3586e7d4eeaca"}, -] - -[package.dependencies] -black = ">=22.1.0" -flake8 = ">=3" - -[package.extras] -develop = ["build", "twine"] - -[[package]] -name = "flake8-pyproject" -version = "1.2.3" -description = "Flake8 plug-in loading the configuration from pyproject.toml" -optional = false -python-versions = ">= 3.6" -files = [ - {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, -] - -[package.dependencies] -Flake8 = ">=5" - -[package.extras] -dev = ["pyTest", "pyTest-cov"] - -[[package]] -name = "isort" -version = "5.13.2" -description = "A Python utility / library to sort Python imports." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, - {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, -] - -[package.extras] -colors = ["colorama (>=0.4.6)"] +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "lzokay" @@ -161,108 +28,26 @@ files = [ [package.extras] test = ["pytest"] -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - [[package]] name = "mobase-stubs" -version = "2.5.0.dev15" +version = "2.5.1a0" description = "PEP561 stub files for the mobase Python API." optional = false -python-versions = ">=3.11,<4.0" +python-versions = "<4.0,>=3.12" files = [ - {file = "mobase_stubs-2.5.0.dev15-py3-none-any.whl", hash = "sha256:990b04541e5e8aa8161cc84d6d2740489d6b1aad79ee21be7b684ea7c19a7c9d"}, - {file = "mobase_stubs-2.5.0.dev15.tar.gz", hash = "sha256:eb7af4f4bbcb7af79aa4f04c3a04abd8bef6252fcd3d751bb89713c2ef65886e"}, -] - -[[package]] -name = "mypy" -version = "1.8.0" -description = "Optional static typing for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, - {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, - {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, - {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, - {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, - {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, - {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, - {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, - {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, - {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, - {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, - {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, - {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, - {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, - {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, - {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, - {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, - {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, - {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -typing-extensions = ">=4.1.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -install-types = ["pip"] -mypyc = ["setuptools (>=50)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, + {file = "mobase_stubs-2.5.1a0-py3-none-any.whl", hash = "sha256:bcaecfae038b890d82280fc518f7e44f38d22d35801a8ba7ffa480f7756d6823"}, + {file = "mobase_stubs-2.5.1a0.tar.gz", hash = "sha256:a8dc5574336ed3b1f673288447781f705a078472cf8808e05a36f129c81c8e20"}, ] [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.9.0" description = "Node.js virtual environment builder" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, -] - -[package.dependencies] -setuptools = "*" - -[[package]] -name = "packaging" -version = "23.2" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "nodeenv-1.9.0-py2.py3-none-any.whl", hash = "sha256:508ecec98f9f3330b636d4448c0f1a56fc68017c68f1e7857ebc52acf0eb879a"}, + {file = "nodeenv-1.9.0.tar.gz", hash = "sha256:07f144e90dae547bf0d4ee8da0ee42664a42a04e02ed68e06324348dafe4bdb1"}, ] [[package]] @@ -276,32 +61,6 @@ files = [ {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, ] -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - -[[package]] -name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] - [[package]] name = "poethepoet" version = "0.23.0" @@ -348,56 +107,34 @@ files = [ [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] -[[package]] -name = "pycodestyle" -version = "2.11.1" -description = "Python style guide checker" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, - {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, -] - -[[package]] -name = "pyflakes" -version = "3.2.0" -description = "passive checker of Python programs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, - {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, -] - [[package]] name = "pyqt6" -version = "6.6.1" +version = "6.7.0" description = "Python bindings for the Qt cross platform application toolkit" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" files = [ - {file = "PyQt6-6.6.1-cp38-abi3-macosx_10_14_universal2.whl", hash = "sha256:6b43878d0bbbcf8b7de165d305ec0cb87113c8930c92de748a11c473a6db5085"}, - {file = "PyQt6-6.6.1-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5aa0e833cb5a79b93813f8181d9f145517dd5a46f4374544bcd1e93a8beec537"}, - {file = "PyQt6-6.6.1-cp38-abi3-win_amd64.whl", hash = "sha256:03a656d5dc5ac31b6a9ad200f7f4f7ef49fa00ad7ce7a991b9bb691617141d12"}, - {file = "PyQt6-6.6.1.tar.gz", hash = "sha256:9f158aa29d205142c56f0f35d07784b8df0be28378d20a97bcda8bd64ffd0379"}, + {file = "PyQt6-6.7.0-cp38-abi3-macosx_10_14_universal2.whl", hash = "sha256:919ffb01020ece42209228bf94b4f2c156a6b77cc5a69a90a05e358b0333750b"}, + {file = "PyQt6-6.7.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e294f025f94493ee12b66efd6893fab309c9063172bb8a5b184f84dfc1ebcc49"}, + {file = "PyQt6-6.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:9d8865fb6357dba032002c4554a9648e88f2b4706c929cc51fba58edafad91fc"}, + {file = "PyQt6-6.7.0.tar.gz", hash = "sha256:3d31b2c59dc378ee26e16586d9469842483588142fc377280aad22aaf2fa6235"}, ] [package.dependencies] -PyQt6-Qt6 = ">=6.6.0" +PyQt6-Qt6 = ">=6.7.0,<6.8.0" PyQt6-sip = ">=13.6,<14" [[package]] name = "pyqt6-qt6" -version = "6.6.1" +version = "6.7.1" description = "The subset of a Qt installation needed by PyQt6." optional = false python-versions = "*" files = [ - {file = "PyQt6_Qt6-6.6.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:0409aa09b8dae90d5f00ba2d9761e671dfbc54ab169cff8f4cdfecd7f664fd0f"}, - {file = "PyQt6_Qt6-6.6.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8dcac0bd9df13d63deafb6a61969b832c34467da4a28d2b7abf78066bfce22e6"}, - {file = "PyQt6_Qt6-6.6.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:e7df8851c93886412d890d0ecc62b39f42521861ee7a80982136d65903e1f2c5"}, - {file = "PyQt6_Qt6-6.6.1-py3-none-win_amd64.whl", hash = "sha256:41f1ed3eadc00540c205a0e897ae0e0fffc21b896e575214f7c5b9c86d2037d1"}, + {file = "PyQt6_Qt6-6.7.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:29622b5dd38740b4b6962e0c88d082d08fa10b64542ef5d911b04214aad70150"}, + {file = "PyQt6_Qt6-6.7.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbcfe66a57199c6a26542b8b9b2f2ee59d974db36293de335a1251f24c4fe917"}, + {file = "PyQt6_Qt6-6.7.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:9fbab2a96d72d77d16021e259ef86a1a3c87adb0e7eebcc92df0d39f3fdf7e27"}, + {file = "PyQt6_Qt6-6.7.1-py3-none-win_amd64.whl", hash = "sha256:590a2f30d15892b5259e6a17ecc0a755675b1b49f553d964e195e90094b44120"}, ] [[package]] @@ -432,13 +169,13 @@ files = [ [[package]] name = "pyright" -version = "1.1.350" +version = "1.1.365" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.350-py3-none-any.whl", hash = "sha256:f1dde6bcefd3c90aedbe9dd1c573e4c1ddbca8c74bf4fa664dd3b1a599ac9a66"}, - {file = "pyright-1.1.350.tar.gz", hash = "sha256:a8ba676de3a3737ea4d8590604da548d4498cc5ee9ee00b1a403c6db987916c6"}, + {file = "pyright-1.1.365-py3-none-any.whl", hash = "sha256:194d767a039f9034376b7ec8423841880ac6efdd061f3e283b4ad9fcd484a659"}, + {file = "pyright-1.1.365.tar.gz", hash = "sha256:d7e69000939aed4bf823707086c30c84c005bdd39fac2dfb370f0e5be16c2ef2"}, ] [package.dependencies] @@ -450,46 +187,30 @@ dev = ["twine (>=3.4.1)"] [[package]] name = "ruff" -version = "0.2.1" +version = "0.2.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dd81b911d28925e7e8b323e8d06951554655021df8dd4ac3045d7212ac4ba080"}, - {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dc586724a95b7d980aa17f671e173df00f0a2eef23f8babbeee663229a938fec"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92db7101ef5bfc18e96777ed7bc7c822d545fa5977e90a585accac43d22f18a"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13471684694d41ae0f1e8e3a7497e14cd57ccb7dd72ae08d56a159d6c9c3e30e"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a11567e20ea39d1f51aebd778685582d4c56ccb082c1161ffc10f79bebe6df35"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:00a818e2db63659570403e44383ab03c529c2b9678ba4ba6c105af7854008105"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be60592f9d218b52f03384d1325efa9d3b41e4c4d55ea022cd548547cc42cd2b"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbd2288890b88e8aab4499e55148805b58ec711053588cc2f0196a44f6e3d855"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ef052283da7dec1987bba8d8733051c2325654641dfe5877a4022108098683"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7022d66366d6fded4ba3889f73cd791c2d5621b2ccf34befc752cb0df70f5fad"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0a725823cb2a3f08ee743a534cb6935727d9e47409e4ad72c10a3faf042ad5ba"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0034d5b6323e6e8fe91b2a1e55b02d92d0b582d2953a2b37a67a2d7dedbb7acc"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5cb5526d69bb9143c2e4d2a115d08ffca3d8e0fddc84925a7b54931c96f5c02"}, - {file = "ruff-0.2.1-py3-none-win32.whl", hash = "sha256:6b95ac9ce49b4fb390634d46d6ece32ace3acdd52814671ccaf20b7f60adb232"}, - {file = "ruff-0.2.1-py3-none-win_amd64.whl", hash = "sha256:e3affdcbc2afb6f5bd0eb3130139ceedc5e3f28d206fe49f63073cb9e65988e0"}, - {file = "ruff-0.2.1-py3-none-win_arm64.whl", hash = "sha256:efababa8e12330aa94a53e90a81eb6e2d55f348bc2e71adbf17d9cad23c03ee6"}, - {file = "ruff-0.2.1.tar.gz", hash = "sha256:3b42b5d8677cd0c72b99fcaf068ffc62abb5a19e71b4a3b9cfa50658a0af02f1"}, + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6"}, + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9"}, + {file = "ruff-0.2.2-py3-none-win32.whl", hash = "sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325"}, + {file = "ruff-0.2.2-py3-none-win_amd64.whl", hash = "sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d"}, + {file = "ruff-0.2.2-py3-none-win_arm64.whl", hash = "sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd"}, + {file = "ruff-0.2.2.tar.gz", hash = "sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d"}, ] -[[package]] -name = "setuptools" -version = "69.1.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, - {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - [[package]] name = "tomli" version = "2.0.1" @@ -503,24 +224,13 @@ files = [ [[package]] name = "types-psutil" -version = "5.9.5.20240205" +version = "5.9.5.20240516" description = "Typing stubs for psutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-psutil-5.9.5.20240205.tar.gz", hash = "sha256:51df36a361aa597bf483dcc5b58f2ab7aa87452a36d2da97c90994d6a81ef743"}, - {file = "types_psutil-5.9.5.20240205-py3-none-any.whl", hash = "sha256:3ec9bd8b95a64fe1269241d3ffb74b94a45df2d0391da1402423cd33f29745ca"}, -] - -[[package]] -name = "typing-extensions" -version = "4.9.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "types-psutil-5.9.5.20240516.tar.gz", hash = "sha256:bb296f59fc56458891d0feb1994717e548a1bcf89936a2877df8792b822b4696"}, + {file = "types_psutil-5.9.5.20240516-py3-none-any.whl", hash = "sha256:83146ded949a10167d9895e567b3b71e53ebc5e23fd8363eab62b3c76cce7b89"}, ] [[package]] @@ -536,5 +246,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "^3.11" -content-hash = "be7515f51347a5ee8fea1f9f3d23c1aa78b2589044b5cbe63475bac9ca6ffb17" +python-versions = "^3.12" +content-hash = "6c2d56d43494ed09c81cc569e453e8a2791a739491d547b458c3f5581d94710c" diff --git a/pyproject.toml b/pyproject.toml index 8496cfc..1246321 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,23 +9,18 @@ license = "MIT" readme = "README.md" [tool.poetry.dependencies] -python = "^3.11" -psutil = "^5.9" +python = "^3.12" +psutil = "^5.8.0" vdf = "3.4" lzokay = "1.1.5" +pyqt6 = "6.7.0" [tool.poetry.group.dev.dependencies] -mobase-stubs = { version = "^2.5.0.dev15", allow-prereleases = true } -pyqt6 = "^6.6.1" -pyright = "^1.1.350" -flake8 = "^7.0.0" -flake8-pyproject = "^1.2.3" +mobase-stubs = { version = "^2.5.1a0", allow-prereleases = true } +pyqt6 = "^6.7.0" +pyright = "^1.1.365" ruff = "^0.2.1" -mypy = "^1.8.0" -isort = "^5.13.2" -black = "^24.2.0" -flake8-black = "^0.3.6" -types-psutil = "^5.9.5.20240205" +types-psutil = "^5.9.5.20240516" poethepoet = "^0.23.0" [build-system] @@ -33,50 +28,27 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.poe.tasks] -lint-black = "black --check --diff ." -lint-isort = "isort -c ." -lint-mypy = "mypy ." -lint-ruff = "ruff ." +format-imports = "ruff check --select I . --fix" +format-ruff = "ruff format ." +format.sequence = ["format-imports", "format-ruff"] +lint-ruff = "ruff check ." +lint-ruff-format = "ruff format --check ." lint-pyright = "pyright ." -lint-all.sequence = [ - "lint-black", - "lint-isort", - "lint-mypy", - "lint-ruff", - "lint-pyright", -] -lint-all.ignore_fail = "return_non_zero" - -[tool.flake8] -max-line-length = 88 -extend-ignore = ["E203"] - -[tool.isort] -profile = "black" -multi_line_output = 3 -skip_gitignore = true - -[tool.mypy] -warn_return_any = true -warn_unused_configs = true -check_untyped_defs = true -exclude = ["lib", "games/quarantine"] -platform = "win32" - -[[tool.mypy.overrides]] -module = "vdf.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "lzokay.*" -ignore_missing_imports = true +lint.sequence = ["lint-ruff", "lint-ruff-format", "lint-pyright"] +lint.ignore_fail = "return_non_zero" [tool.ruff] -line-length = 88 -target-version = "py311" +target-version = "py310" + +[tool.ruff.lint] +extend-select = ["B", "Q", "I"] + +[tool.ruff.lint.isort] +known-first-party = ['tas'] [tool.pyright] exclude = ["lib", "**/.*", "venv"] typeCheckingMode = "strict" -pythonPlatform = "Windows" +reportMissingTypeStubs = true reportMissingModuleSource = false +pythonPlatform = "Windows"