mirror of
https://github.com/lutris/lutris
synced 2024-10-01 21:44:48 +00:00
Code style and formatting
Signed-off-by: Antoine Mazeas <antoine@karthanis.net>
This commit is contained in:
parent
9b9631f66f
commit
b167143453
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue