From 9ed085e1a02f77bad24510dee9e3d4992917ddff Mon Sep 17 00:00:00 2001 From: GeoffreyCoulaud Date: Fri, 30 Jun 2023 13:25:01 +0200 Subject: [PATCH] Silently skip sources with bad locations --- src/importer/importer.py | 15 +++++++++------ src/importer/sources/source.py | 27 +++++++-------------------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/src/importer/importer.py b/src/importer/importer.py index 0c7b309..0f909c9 100644 --- a/src/importer/importer.py +++ b/src/importer/importer.py @@ -26,6 +26,7 @@ from src import shared from src.errors.error_producer import ErrorProducer from src.errors.friendly_error import FriendlyError from src.game import Game +from src.importer.sources.location import UnresolvableLocationError from src.importer.sources.source import Source from src.store.managers.async_manager import AsyncManager from src.store.pipeline import Pipeline @@ -125,16 +126,18 @@ class Importer(ErrorProducer): source: Source source, *_rest = data - # Early exit if not installed + # Early exit if not available or not installed if not source.is_available: - logging.info("Source %s skipped, not installed", source.id) + logging.info("Source %s skipped, not available", source.id) + return + try: + iterator = iter(source) + except UnresolvableLocationError: + logging.info("Source %s skipped, bad location", source.id) return - logging.info("Scanning source %s", source.id) - - # Initialize source iteration - iterator = iter(source) # Get games from source + logging.info("Scanning source %s", source.id) while True: # Handle exceptions raised when iterating try: diff --git a/src/importer/sources/source.py b/src/importer/sources/source.py index 71adaab..11f4eb1 100644 --- a/src/importer/sources/source.py +++ b/src/importer/sources/source.py @@ -22,9 +22,8 @@ from abc import abstractmethod from collections.abc import Iterable, Iterator from typing import Any, Generator, Optional -from src.errors.friendly_error import FriendlyError from src.game import Game -from src.importer.sources.location import Location, UnresolvableLocationError +from src.importer.sources.location import Location # Type of the data returned by iterating on a Source SourceIterationResult = None | Game | tuple[Game, tuple[Any]] @@ -100,27 +99,15 @@ class Source(Iterable): """The executable format used to construct game executables""" def __iter__(self) -> SourceIterator: - """Get an iterator for the source""" - for location_name in ( - locations := { - "data": "Data", - "cache": "Cache", - "config": "Configuration", - }.keys() - ): + """ + Get an iterator for the source + :raises UnresolvableLocationError: Not iterable if any of the locations are unresolvable + """ + for location_name in ("data", "cache", "config"): location = getattr(self, f"{location_name}_location", None) if location is None: continue - try: - location.resolve() - except UnresolvableLocationError as error: - raise FriendlyError( - # The variables are the type of location (eg. cache) and the source's name (eg. Steam) - "Invalid {} Location for {{}}".format(locations[location_name]), - "Pick a new one or disable the source in preferences", - (self.name,), - (self.name,), - ) from error + location.resolve() return self.iterator_class(self)