Code style and formatting

Signed-off-by: Antoine Mazeas <antoine@karthanis.net>
This commit is contained in:
Antoine Mazeas 2023-01-18 08:17:10 +01:00 committed by Mathieu Comandon
parent 9b9631f66f
commit b167143453
3 changed files with 137 additions and 123 deletions

View file

@ -391,7 +391,7 @@ If the game makes use of Steam data, the value should be
``$STEAM:appid:path/to/data``. This will check that the data is available
or install it otherwise.
If the game of file is hosted on moddb.com, it is necessary to understand that
If the game or file is hosted on moddb.com, it is necessary to understand that
the platform rotates the actual download links every few hours, making it
impractical to set these links as source url in installers. Lutris has
routines to overcome this limitation (with blessing from moddb.com). When

View file

@ -1,31 +1,41 @@
"""Helper functions to assist downloading files from ModDB"""
import re
import types
from lutris.util.log import logger
MODDB_FQDN = 'https://www.moddb.com'
MODDB_URL_MATCHER = '^https://(www\.)?moddb\.com'
MODDB_MIRROR_URL_MATCHER = '^https://(www\.)?moddb\.com/downloads/mirror'
MODDB_URL_MATCHER = r"^https://(www\.)?moddb\.com"
MODDB_MIRROR_URL_MATCHER = r"^https://(www\.)?moddb\.com/downloads/mirror"
def is_moddb_url(url):
return re.match(MODDB_URL_MATCHER, url.lower()) is not None
def _try_import_moddb_library():
try:
lib = __import__('moddb')
return lib
except ImportError as ierr:
except ImportError:
# no logging works here for some reason
return None
class ModDB:
def __init__(self, parse_page_method: types.MethodType=None, moddb_lib: types.ModuleType=_try_import_moddb_library()):
def __init__(
self,
parse_page_method: types.MethodType = None,
moddb_lib: types.ModuleType = _try_import_moddb_library()):
if moddb_lib is None:
logger.warn('The moddb library is not available, though the installer is attempting to install a file hosted on moddb.com. The moddb.com URLs will not be transformed, and rather passed as-is.')
logger.warning(
'The moddb library is not available, though the installer'
' is attempting to install a file hosted on moddb.com. The'
' moddb.com URLs will not be transformed, and rather passed as-is.')
self.moddb_lib = moddb_lib
self.parse = parse_page_method
if self.parse is None and self.moddb_lib is not None:
self.parse = self.moddb_lib.parse_page
self.parse = self.moddb_lib.parse_page
def transform_url(self, moddb_permalink_url):
# no-op in case the lib did not load
@ -34,7 +44,8 @@ class ModDB:
if not is_moddb_url(moddb_permalink_url):
raise RuntimeError('Provided URL must be from moddb.com')
return MODDB_FQDN + self._autoselect_moddb_mirror(self._get_html_and_resolve_mirrors_list(moddb_permalink_url))._url
return MODDB_FQDN + self._autoselect_moddb_mirror(
self._get_html_and_resolve_mirrors_list(moddb_permalink_url))._url
def _autoselect_moddb_mirror(self, mirrors_list):
# dumb autoselect for now: rank mirrors by capacity (lower is better), pick first (lowest load)
@ -46,7 +57,10 @@ class ModDB:
# while downloading a file instead of a web page
# with no obvious reason to the user as to why
if self._is_moddb_mirror_url(moddb_permalink_url):
raise RuntimeError('Provided URL points directly to a moddb.com mirror. This is an incorrect configuration, please refer to installers.rst for details.')
raise RuntimeError(
'Provided URL points directly to a moddb.com mirror.'
' This is an incorrect configuration, please refer to'
' installers.rst for details.')
moddb_obj = self.parse(moddb_permalink_url)
if not isinstance(moddb_obj, self.moddb_lib.pages.File):

View file

@ -4,142 +4,142 @@ from lutris.util.moddb import ModDB, is_moddb_url
class ModDBHelperTests(unittest.TestCase):
def setUp(self):
self.mirrors_list = []
self.page_type = self.ModDBFileObj
self.helper_obj = ModDB(self.parse)
def setUp(self):
self.mirrors_list = []
self.page_type = self.ModDBFileObj
self.helper_obj = ModDB(self.parse)
def with_mirror(self, url: str, capacity: float):
self.mirrors_list.append(moddb.boxes.Mirror(url = url, capacity = capacity))
return self
def with_mirror(self, url: str, capacity: float):
self.mirrors_list.append(moddb.boxes.Mirror(url=url, capacity=capacity))
return self
def with_page_type(self, page_type):
self.page_type = page_type
def with_page_type(self, page_type):
self.page_type = page_type
def parse(self, url):
return self.page_type(self.page_type, self.mirrors_list)
def parse(self, url):
return self.page_type(self.page_type, self.mirrors_list)
class ModDBFileObj(moddb.pages.File):
def __init__(self, page_type, mirrors_list):
self.mirrors_list = mirrors_list
def get_mirrors(self):
return self.mirrors_list
class ModDBFileObj(moddb.pages.File):
def __init__(self, page_type, mirrors_list):
self.mirrors_list = mirrors_list
class ModDBSomeOtherObj:
def __init__(self, page_type, mirrors_list):
pass
def get_mirrors(self):
return self.mirrors_list
## ctor
def test_ctor_default_method(self):
hlpr = ModDB()
self.assertEqual(hlpr.parse, moddb.parse_page)
class ModDBSomeOtherObj:
def __init__(self, page_type, mirrors_list):
pass
def test_ctor_custom_method(self):
def custom():
pass
hlpr = ModDB(custom)
self.assertEqual(hlpr.parse, custom)
# ctor
def test_ctor_default_method(self):
hlpr = ModDB()
self.assertEqual(hlpr.parse, moddb.parse_page)
## missing moddb lib handling
def test_transform_url_missing_lib_noop(self):
moddb_url = 'https://www.moddb.com/downloads/mirror/somethingsomething'
hlpr = ModDB(moddb_lib=None)
transformed = hlpr.transform_url(moddb_url)
self.assertEqual(transformed, moddb_url)
def test_ctor_custom_method(self):
def custom():
pass
hlpr = ModDB(custom)
self.assertEqual(hlpr.parse, custom)
## transform_url
def test_transform_url_url_is_mirror_with_www_throws(self):
moddb_url = 'https://www.moddb.com/downloads/mirror/somethingsomething'
with self.assertRaises(RuntimeError):
# missing moddb lib handling
def test_transform_url_missing_lib_noop(self):
moddb_url = 'https://www.moddb.com/downloads/mirror/somethingsomething'
hlpr = ModDB(moddb_lib=None)
transformed = hlpr.transform_url(moddb_url)
self.assertEqual(transformed, moddb_url)
# transform_url
def test_transform_url_url_is_mirror_with_www_throws(self):
moddb_url = 'https://www.moddb.com/downloads/mirror/somethingsomething'
with self.assertRaises(RuntimeError):
self.helper_obj.transform_url(moddb_url)
def test_transform_url_url_is_mirror_no_www_throws(self):
moddb_url = 'https://moddb.com/downloads/mirror/somethingsomething'
with self.assertRaises(RuntimeError):
self.helper_obj.transform_url(moddb_url)
def test_transform_url_url_match_happy_path(self):
self \
.with_mirror("/first_url", 12.4)
moddb_url = 'https://moddb.com'
transformed = self.helper_obj.transform_url(moddb_url)
self.assertEqual(transformed, 'https://www.moddb.com/first_url')
def test_transform_url_url_is_mirror_no_www_throws(self):
moddb_url = 'https://moddb.com/downloads/mirror/somethingsomething'
with self.assertRaises(RuntimeError):
def test_transform_url_url_not_match_throws(self):
self \
.with_mirror("/first_url", 12.4)
moddb_url = 'https://not_moddb.com'
with self.assertRaises(RuntimeError):
self.helper_obj.transform_url(moddb_url)
def test_transform_url_page_type_correct_happy_path(self):
self \
.with_mirror("/first_url", 12.4) \
.with_page_type(self.ModDBFileObj)
moddb_url = 'https://moddb.com'
transformed = self.helper_obj.transform_url(moddb_url)
self.assertEqual(transformed, 'https://www.moddb.com/first_url')
def test_transform_url_url_match_happy_path(self):
self \
.with_mirror("/first_url", 12.4)
def test_transform_url_page_type_incorrect_throws(self):
self \
.with_mirror("/first_url", 12.4) \
.with_page_type(self.ModDBSomeOtherObj)
moddb_url = 'https://moddb.com'
with self.assertRaises(RuntimeError):
self.helper_obj.transform_url(moddb_url)
moddb_url = 'https://moddb.com'
transformed = self.helper_obj.transform_url(moddb_url)
self.assertEqual(transformed, 'https://www.moddb.com/first_url')
def test_transform_url_url_not_match_throws(self):
self \
.with_mirror("/first_url", 12.4)
moddb_url = 'https://not_moddb.com'
with self.assertRaises(RuntimeError):
def test_transform_url_single_mirror_happy_path(self):
self \
.with_mirror("/first_url", 12.4)
moddb_url = 'https://moddb.com'
transformed = self.helper_obj.transform_url(moddb_url)
self.assertEqual(transformed, 'https://www.moddb.com/first_url')
def test_transform_url_page_type_correct_happy_path(self):
self \
.with_mirror("/first_url", 12.4) \
.with_page_type(self.ModDBFileObj)
moddb_url = 'https://moddb.com'
transformed = self.helper_obj.transform_url(moddb_url)
self.assertEqual(transformed, 'https://www.moddb.com/first_url')
def test_transform_url_page_type_incorrect_throws(self):
self \
.with_mirror("/first_url", 12.4) \
.with_page_type(self.ModDBSomeOtherObj)
moddb_url = 'https://moddb.com'
with self.assertRaises(RuntimeError):
def test_transform_url_multiple_mirror_select_lowest_capacity(self):
self \
.with_mirror("/first_url", 12.4) \
.with_mirror("/second_url", 57.4) \
.with_mirror("/lowest_load", 0)
moddb_url = 'https://moddb.com'
transformed = self.helper_obj.transform_url(moddb_url)
self.assertEqual(transformed, 'https://www.moddb.com/lowest_load')
def test_transform_url_single_mirror_happy_path(self):
self \
.with_mirror("/first_url", 12.4)
moddb_url = 'https://moddb.com'
transformed = self.helper_obj.transform_url(moddb_url)
self.assertEqual(transformed, 'https://www.moddb.com/first_url')
def test_transform_url_no_mirrors_throws(self):
moddb_url = 'https://moddb.com'
with self.assertRaises(RuntimeError):
self.helper_obj.transform_url(moddb_url)
def test_transform_url_multiple_mirror_select_lowest_capacity(self):
self \
.with_mirror("/first_url", 12.4) \
.with_mirror("/second_url", 57.4) \
.with_mirror("/lowest_load", 0)
moddb_url = 'https://moddb.com'
transformed = self.helper_obj.transform_url(moddb_url)
self.assertEqual(transformed, 'https://www.moddb.com/lowest_load')
# is_moddb_url
def test_is_moddb_url_has_www_success(self):
url = 'https://www.moddb.com/something'
self.assertTrue(is_moddb_url(url))
def test_transform_url_no_mirrors_throws(self):
moddb_url = 'https://moddb.com'
with self.assertRaises(RuntimeError):
transformed = self.helper_obj.transform_url(moddb_url)
def test_is_moddb_url_no_slug_has_www_success(self):
url = 'https://www.moddb.com'
self.assertTrue(is_moddb_url(url))
## is_moddb_url
def test_is_moddb_url_has_www_success(self):
url = 'https://www.moddb.com/something'
self.assertTrue(is_moddb_url(url))
def test_is_moddb_url_no_slug_has_www_success(self):
url = 'https://www.moddb.com'
self.assertTrue(is_moddb_url(url))
def test_is_moddb_url_no_www_success(self):
url = 'https://moddb.com/something'
self.assertTrue(is_moddb_url(url))
def test_is_moddb_url_no_www_success(self):
url = 'https://moddb.com/something'
self.assertTrue(is_moddb_url(url))
def test_is_moddb_url_no_slug_no_www_success(self):
url = 'https://moddb.com'
self.assertTrue(is_moddb_url(url))
def test_is_moddb_url_no_slug_no_www_success(self):
url = 'https://moddb.com'
self.assertTrue(is_moddb_url(url))
def test_is_moddb_url_other_subdomain_failure(self):
url = 'https://subdomain.moddb.com/something'
self.assertFalse(is_moddb_url(url))
def test_is_moddb_url_no_slug_other_subdomain_failure(self):
url = 'https://subdomain.moddb.com'
self.assertFalse(is_moddb_url(url))
def test_is_moddb_url_other_subdomain_failure(self):
url = 'https://subdomain.moddb.com/something'
self.assertFalse(is_moddb_url(url))
def test_is_moddb_url_random_domain_failure(self):
url = 'https://somedomain.com/something'
self.assertFalse(is_moddb_url(url))
def test_is_moddb_url_no_slug_random_domain_failure(self):
url = 'https://somedomain.com'
self.assertFalse(is_moddb_url(url))
def test_is_moddb_url_no_slug_other_subdomain_failure(self):
url = 'https://subdomain.moddb.com'
self.assertFalse(is_moddb_url(url))
def test_is_moddb_url_random_domain_failure(self):
url = 'https://somedomain.com/something'
self.assertFalse(is_moddb_url(url))
def test_is_moddb_url_no_slug_random_domain_failure(self):
url = 'https://somedomain.com'
self.assertFalse(is_moddb_url(url))