mirror of
https://github.com/gryf/fs-uae-wrapper.git
synced 2025-12-19 12:28:12 +01:00
Normalize paths for config options
Removing _kickstart_option in favor of _normalize_options method to detect and replace relative paths with absolute ones. Dictionary with changed options lands as a commandline switches for fs-uae during execution.
This commit is contained in:
@@ -24,7 +24,6 @@ class Archive(base.ArchiveBase):
|
|||||||
"""
|
"""
|
||||||
Main function which accepts configuration file for FS-UAE
|
Main function which accepts configuration file for FS-UAE
|
||||||
It will do as follows:
|
It will do as follows:
|
||||||
- set needed full path for asset files
|
|
||||||
- extract archive file
|
- extract archive file
|
||||||
- copy configuration
|
- copy configuration
|
||||||
- run the emulation
|
- run the emulation
|
||||||
@@ -41,10 +40,6 @@ class Archive(base.ArchiveBase):
|
|||||||
if not self._copy_conf():
|
if not self._copy_conf():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
kick_opts = self._kickstart_option()
|
|
||||||
if kick_opts:
|
|
||||||
self.fsuae_options.update(kick_opts)
|
|
||||||
|
|
||||||
if not self._run_emulator(self.fsuae_options.list()):
|
if not self._run_emulator(self.fsuae_options.list()):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ class Base(object):
|
|||||||
if not self._validate_options():
|
if not self._validate_options():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
self._normalize_options()
|
||||||
self.dir = tempfile.mkdtemp()
|
self.dir = tempfile.mkdtemp()
|
||||||
self._set_assets_paths()
|
self._set_assets_paths()
|
||||||
|
|
||||||
@@ -55,33 +56,6 @@ class Base(object):
|
|||||||
shutil.rmtree(self.dir)
|
shutil.rmtree(self.dir)
|
||||||
return
|
return
|
||||||
|
|
||||||
def _kickstart_option(self):
|
|
||||||
"""
|
|
||||||
This is kind of hack - since we potentially can have a relative path
|
|
||||||
to kickstart directory, there is a need for getting this option from
|
|
||||||
configuration files (which unfortunately can be spanned all over the
|
|
||||||
different places, see https://fs-uae.net/configuration-files) and
|
|
||||||
check whether or not one of 'kickstarts_dir', 'kickstart_file' or
|
|
||||||
'kickstart_ext_file' options are set. In either case if one of those
|
|
||||||
options are set and are relative, they should be set to absolute path,
|
|
||||||
so that kickstart files can be found by relocated configuration file.
|
|
||||||
"""
|
|
||||||
|
|
||||||
conf = utils.get_config(self.conf_file)
|
|
||||||
|
|
||||||
kick = {}
|
|
||||||
|
|
||||||
for key in ('kickstart_file', 'kickstart_ext_file', 'kickstarts_dir'):
|
|
||||||
val = conf.get(key)
|
|
||||||
if val:
|
|
||||||
if not os.path.isabs(val):
|
|
||||||
val = utils.interpolate_variables(val, self.conf_file)
|
|
||||||
kick[key] = os.path.abspath(val)
|
|
||||||
else:
|
|
||||||
kick[key] = val
|
|
||||||
|
|
||||||
return kick
|
|
||||||
|
|
||||||
def _set_assets_paths(self):
|
def _set_assets_paths(self):
|
||||||
"""
|
"""
|
||||||
Set full paths for archive file (without extension) and for save state
|
Set full paths for archive file (without extension) and for save state
|
||||||
@@ -193,6 +167,35 @@ class Base(object):
|
|||||||
|
|
||||||
return save
|
return save
|
||||||
|
|
||||||
|
def _normalize_options(self):
|
||||||
|
"""
|
||||||
|
Search and replace values for options which starts with $CONFIG with
|
||||||
|
absolute path for all options, except:
|
||||||
|
- save_states_dir
|
||||||
|
|
||||||
|
Configuration file will be placed in new directory, therefore it is
|
||||||
|
needed to calculate new paths so that emulator can find assets.
|
||||||
|
"""
|
||||||
|
exclude_list = ['save_states_dir']
|
||||||
|
conf_abs_dir = os.path.dirname(os.path.abspath(self.conf_file))
|
||||||
|
changed_options = {}
|
||||||
|
|
||||||
|
for key, val in utils.get_config(self.conf_file).items():
|
||||||
|
if val.startswith('/'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if key in exclude_list:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if val.startswith('$CONFIG'):
|
||||||
|
abspath = os.path.abspath(val.replace('$CONFIG', conf_abs_dir))
|
||||||
|
changed_options[key] = abspath
|
||||||
|
continue
|
||||||
|
|
||||||
|
changed_options[key] = os.path.abspath(val)
|
||||||
|
|
||||||
|
self.fsuae_options.update(changed_options)
|
||||||
|
|
||||||
def _validate_options(self):
|
def _validate_options(self):
|
||||||
"""Validate mandatory options"""
|
"""Validate mandatory options"""
|
||||||
if 'wrapper' not in self.all_options:
|
if 'wrapper' not in self.all_options:
|
||||||
|
|||||||
@@ -39,10 +39,6 @@ class CD32(base.ArchiveBase):
|
|||||||
if not method():
|
if not method():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
kick_opts = self._kickstart_option()
|
|
||||||
if kick_opts:
|
|
||||||
self.fsuae_options.update(kick_opts)
|
|
||||||
|
|
||||||
if not self._run_emulator(self.fsuae_options.list()):
|
if not self._run_emulator(self.fsuae_options.list()):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
@@ -39,10 +39,6 @@ class SaveState(base.Base):
|
|||||||
if not self._copy_conf():
|
if not self._copy_conf():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
kick_opts = self._kickstart_option()
|
|
||||||
if kick_opts:
|
|
||||||
self.fsuae_options.update(kick_opts)
|
|
||||||
|
|
||||||
if not self._run_emulator(self.fsuae_options.list()):
|
if not self._run_emulator(self.fsuae_options.list()):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
@@ -46,18 +46,15 @@ class TestArchive(TestCase):
|
|||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._save_save')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._save_save')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._get_saves_dir')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._get_saves_dir')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._run_emulator')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._run_emulator')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._kickstart_option')
|
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._copy_conf')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._copy_conf')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._load_save')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._load_save')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._extract')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._extract')
|
||||||
def test_run(self, extract, load_save, copy_conf, kick_option,
|
def test_run(self, extract, load_save, copy_conf, run_emulator,
|
||||||
run_emulator, get_save_dir, save_state, make_arch, which,
|
get_save_dir, save_state, make_arch, which, mkdtemp):
|
||||||
mkdtemp):
|
|
||||||
|
|
||||||
extract.return_value = False
|
extract.return_value = False
|
||||||
load_save.return_value = False
|
load_save.return_value = False
|
||||||
copy_conf.return_value = False
|
copy_conf.return_value = False
|
||||||
kick_option.return_value = False
|
|
||||||
run_emulator.return_value = False
|
run_emulator.return_value = False
|
||||||
get_save_dir.return_value = False
|
get_save_dir.return_value = False
|
||||||
save_state.return_value = False
|
save_state.return_value = False
|
||||||
@@ -82,10 +79,6 @@ class TestArchive(TestCase):
|
|||||||
copy_conf.return_value = True
|
copy_conf.return_value = True
|
||||||
self.assertFalse(arch.run())
|
self.assertFalse(arch.run())
|
||||||
|
|
||||||
kick_option.return_value = {'foo': 'bar'}
|
|
||||||
self.assertFalse(arch.run())
|
|
||||||
self.assertDictEqual(arch.fsuae_options, {'foo': 'bar'})
|
|
||||||
|
|
||||||
run_emulator.return_value = True
|
run_emulator.return_value = True
|
||||||
self.assertFalse(arch.run())
|
self.assertFalse(arch.run())
|
||||||
|
|
||||||
|
|||||||
@@ -48,27 +48,32 @@ class TestBase(TestCase):
|
|||||||
self.assertFalse(os.path.exists(self.dirname))
|
self.assertFalse(os.path.exists(self.dirname))
|
||||||
|
|
||||||
@mock.patch('fs_uae_wrapper.utils.get_config')
|
@mock.patch('fs_uae_wrapper.utils.get_config')
|
||||||
def test_kickstart_option(self, get_config):
|
def test_normalize_options(self, get_config):
|
||||||
|
|
||||||
bobj = base.Base('Config.fs-uae', utils.CmdOption(), {})
|
bobj = base.Base('Config.fs-uae', utils.CmdOption(), {})
|
||||||
get_config.return_value = {'foo': 'bar'}
|
|
||||||
self.assertDictEqual(bobj._kickstart_option(), {})
|
|
||||||
|
|
||||||
get_config.return_value = {'kickstarts_dir': '/some/path'}
|
get_config.return_value = {'kickstarts_dir': '/some/path'}
|
||||||
self.assertDictEqual(bobj._kickstart_option(),
|
bobj._normalize_options()
|
||||||
{'kickstarts_dir': '/some/path'})
|
self.assertDictEqual(bobj.fsuae_options, {})
|
||||||
|
|
||||||
os.chdir(self.dirname)
|
os.chdir(self.dirname)
|
||||||
get_config.return_value = {'kickstarts_dir': '../some/path'}
|
get_config.return_value = {'foo': 'bar'}
|
||||||
|
bobj._normalize_options()
|
||||||
|
self.assertDictEqual(bobj.fsuae_options,
|
||||||
|
{'foo': os.path.join(self.dirname, 'bar')})
|
||||||
|
|
||||||
|
get_config.return_value = {'floppies_dir': '../some/path'}
|
||||||
|
bobj.fsuae_options = utils.CmdOption()
|
||||||
result = os.path.abspath(os.path.join(self.dirname, '../some/path'))
|
result = os.path.abspath(os.path.join(self.dirname, '../some/path'))
|
||||||
self.assertDictEqual(bobj._kickstart_option(),
|
bobj._normalize_options()
|
||||||
{'kickstarts_dir': result})
|
self.assertDictEqual(bobj.fsuae_options, {'floppies_dir': result})
|
||||||
|
|
||||||
bobj.conf_file = os.path.join(self.dirname, 'Config.fs-uae')
|
bobj.conf_file = os.path.join(self.dirname, 'Config.fs-uae')
|
||||||
get_config.return_value = {'kickstarts_dir': '$CONFIG/../path'}
|
get_config.return_value = {'cdroms_dir': '$CONFIG/../path'}
|
||||||
|
bobj.fsuae_options = utils.CmdOption()
|
||||||
result = os.path.abspath(os.path.join(self.dirname, '../path'))
|
result = os.path.abspath(os.path.join(self.dirname, '../path'))
|
||||||
self.assertDictEqual(bobj._kickstart_option(),
|
bobj._normalize_options()
|
||||||
{'kickstarts_dir': result})
|
self.assertDictEqual(bobj.fsuae_options, {'cdroms_dir': result})
|
||||||
|
|
||||||
def test_set_assets_paths(self):
|
def test_set_assets_paths(self):
|
||||||
|
|
||||||
@@ -240,6 +245,12 @@ class TestBase(TestCase):
|
|||||||
'wrapper_archiver': '7z'}
|
'wrapper_archiver': '7z'}
|
||||||
self.assertTrue(bobj._validate_options())
|
self.assertTrue(bobj._validate_options())
|
||||||
|
|
||||||
|
which.return_value = None
|
||||||
|
bobj.all_options = {'wrapper': 'dummy',
|
||||||
|
'wrapper_save_state': '1',
|
||||||
|
'wrapper_archiver': '7z'}
|
||||||
|
self.assertFalse(bobj._validate_options())
|
||||||
|
|
||||||
@mock.patch('fs_uae_wrapper.path.which')
|
@mock.patch('fs_uae_wrapper.path.which')
|
||||||
def test_run_clean(self, which):
|
def test_run_clean(self, which):
|
||||||
|
|
||||||
|
|||||||
@@ -16,17 +16,15 @@ class TestCD32(TestCase):
|
|||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._save_save')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._save_save')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._get_saves_dir')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._get_saves_dir')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._run_emulator')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._run_emulator')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._kickstart_option')
|
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._copy_conf')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._copy_conf')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._load_save')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._load_save')
|
||||||
@mock.patch('fs_uae_wrapper.base.ArchiveBase._extract')
|
@mock.patch('fs_uae_wrapper.base.ArchiveBase._extract')
|
||||||
def test_run(self, extract, load_save, copy_conf, kick_option,
|
def test_run(self, extract, load_save, copy_conf, run_emulator,
|
||||||
run_emulator, get_save_dir, save_state, which, mkdtemp):
|
get_save_dir, save_state, which, mkdtemp):
|
||||||
|
|
||||||
extract.return_value = False
|
extract.return_value = False
|
||||||
copy_conf.return_value = False
|
copy_conf.return_value = False
|
||||||
load_save.return_value = False
|
load_save.return_value = False
|
||||||
kick_option.return_value = {}
|
|
||||||
run_emulator.return_value = False
|
run_emulator.return_value = False
|
||||||
get_save_dir.return_value = False
|
get_save_dir.return_value = False
|
||||||
save_state.return_value = False
|
save_state.return_value = False
|
||||||
@@ -50,10 +48,6 @@ class TestCD32(TestCase):
|
|||||||
load_save.return_value = True
|
load_save.return_value = True
|
||||||
self.assertFalse(acd32.run())
|
self.assertFalse(acd32.run())
|
||||||
|
|
||||||
kick_option.return_value = {'foo': 'bar'}
|
|
||||||
self.assertFalse(acd32.run())
|
|
||||||
self.assertDictEqual(acd32.fsuae_options, {'foo': 'bar'})
|
|
||||||
|
|
||||||
run_emulator.return_value = True
|
run_emulator.return_value = True
|
||||||
self.assertTrue(acd32.run())
|
self.assertTrue(acd32.run())
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from fs_uae_wrapper import savestate
|
|||||||
from fs_uae_wrapper import utils
|
from fs_uae_wrapper import utils
|
||||||
|
|
||||||
|
|
||||||
class TestArchive(TestCase):
|
class TestSaveState(TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.dirname = mkdtemp()
|
self.dirname = mkdtemp()
|
||||||
@@ -31,14 +31,12 @@ class TestArchive(TestCase):
|
|||||||
@mock.patch('fs_uae_wrapper.base.Base._save_save')
|
@mock.patch('fs_uae_wrapper.base.Base._save_save')
|
||||||
@mock.patch('fs_uae_wrapper.base.Base._get_saves_dir')
|
@mock.patch('fs_uae_wrapper.base.Base._get_saves_dir')
|
||||||
@mock.patch('fs_uae_wrapper.base.Base._run_emulator')
|
@mock.patch('fs_uae_wrapper.base.Base._run_emulator')
|
||||||
@mock.patch('fs_uae_wrapper.base.Base._kickstart_option')
|
|
||||||
@mock.patch('fs_uae_wrapper.base.Base._copy_conf')
|
@mock.patch('fs_uae_wrapper.base.Base._copy_conf')
|
||||||
@mock.patch('fs_uae_wrapper.base.Base._load_save')
|
@mock.patch('fs_uae_wrapper.base.Base._load_save')
|
||||||
def test_run(self, load_save, copy_conf, kick_option, run_emulator,
|
def test_run(self, load_save, copy_conf, run_emulator, get_save_dir,
|
||||||
get_save_dir, save_state, which, mkdtemp):
|
save_state, which, mkdtemp):
|
||||||
|
|
||||||
copy_conf.return_value = False
|
copy_conf.return_value = False
|
||||||
kick_option.return_value = False
|
|
||||||
run_emulator.return_value = False
|
run_emulator.return_value = False
|
||||||
get_save_dir.return_value = False
|
get_save_dir.return_value = False
|
||||||
save_state.return_value = False
|
save_state.return_value = False
|
||||||
@@ -58,10 +56,6 @@ class TestArchive(TestCase):
|
|||||||
copy_conf.return_value = True
|
copy_conf.return_value = True
|
||||||
self.assertFalse(arch.run())
|
self.assertFalse(arch.run())
|
||||||
|
|
||||||
kick_option.return_value = {'foo': 'bar'}
|
|
||||||
self.assertFalse(arch.run())
|
|
||||||
self.assertDictEqual(arch.fsuae_options, {'foo': 'bar'})
|
|
||||||
|
|
||||||
run_emulator.return_value = True
|
run_emulator.return_value = True
|
||||||
self.assertTrue(arch.run())
|
self.assertTrue(arch.run())
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user