1
0
mirror of https://github.com/gryf/fs-uae-wrapper.git synced 2025-12-19 12:28:12 +01:00

Introduced new configuration variable $WRAPPER

Calculation of file path may be performed in two different places -
first is the original location of the config file, second is on copied
one. Adding new option WRAPPER will take the same role as $CONFIG,
except it will be only parsed on copied configuration file.

An alternative would be to check existence in both places, but I'd like
to have it explicit.
This commit is contained in:
2017-01-08 19:36:30 +01:00
parent 388a8cc835
commit 00e3cf9801
4 changed files with 59 additions and 26 deletions

View File

@@ -98,6 +98,23 @@ If no ``wrapper`` option would be passed either as an config option or
command line argument, all command line options will be passed to the fs-uae command line argument, all command line options will be passed to the fs-uae
executable as-is. executable as-is.
There is also new config variable introduced: ``$WRAPPER`` which have the same
role as ``$CONFIG``, but apply for copied config. For instance - in module
archive there are filesystem extracted to new location - to access this
filesystem relatively to the copied configuration file it is enough to provide
a config option:
.. code:: ini
[config]
wrapper = archive
...
hard_drive_0 = $WRAPPER/my_hardrive
which means, that we are expecting to have system files on ``my_hardrive`` in
directory, where configuration will be copied.
Modules Modules
======= =======

View File

@@ -45,8 +45,8 @@ 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._normalize_options()
self._set_assets_paths() self._set_assets_paths()
return True return True
@@ -144,7 +144,7 @@ class Base(object):
def _get_saves_dir(self): def _get_saves_dir(self):
""" """
Return path to save state directory or None in cases: Return path to save state directory or None in cases:
- there is no save state dir set relative to config file - there is no save state dir set relative to copied config file
- save state dir is set globally - save state dir is set globally
- save state dir is set relative to the config file - save state dir is set relative to the config file
- save state dir doesn't exists - save state dir doesn't exists
@@ -153,9 +153,9 @@ class Base(object):
if not self.all_options.get('save_states_dir'): if not self.all_options.get('save_states_dir'):
return None return None
if self.all_options['save_states_dir'].startswith('$CONFIG') and \ if self.all_options['save_states_dir'].startswith('$WRAPPER') and \
'..' not in self.all_options['save_states_dir']: '..' not in self.all_options['save_states_dir']:
save = self.all_options['save_states_dir'].replace('$CONFIG/', '') save = self.all_options['save_states_dir'].replace('$WRAPPER/', '')
else: else:
return None return None
@@ -171,45 +171,49 @@ class Base(object):
def _normalize_options(self): def _normalize_options(self):
""" """
Search and replace values for options which starts with $CONFIG with Search and replace values for options which starts with $CONFIG with
absolute path for all options, except: absolute path for all options.
- save_states_dir
Configuration file will be placed in new directory, therefore it is Configuration file will be placed in new directory, therefore it is
needed to calculate new paths so that emulator can find assets. needed to calculate new paths so that emulator can find assets.
""" """
exclude_list = ['save_states_dir'] options = ['wrapper_archive', 'accelerator_rom', 'base_dir',
include_list = ['wrapper_archive', 'accelerator_rom', 'base_dir', 'cdrom_drive_0', 'cdroms_dir', 'controllers_dir',
'cdrom_drive_0', 'cdroms_dir', 'controllers_dir', 'cpuboard_flash_ext_file', 'cpuboard_flash_file',
'cpuboard_flash_ext_file', 'cpuboard_flash_file', 'floppies_dir', 'floppy_overlays_dir', 'fmv_rom',
'floppies_dir', 'floppy_overlays_dir', 'fmv_rom', 'graphics_card_rom', 'hard_drives_dir', 'kickstart_file',
'graphics_card_rom', 'hard_drives_dir', 'kickstarts_dir', 'logs_dir', 'save_states_dir',
'kickstart_file', 'kickstarts_dir', 'logs_dir', 'screenshots_output_dir']
'screenshots_output_dir', 'state_dir']
for num in range(20): for num in range(20):
include_list.append('cdrom_image_%d' % num) options.append('cdrom_image_%d' % num)
include_list.append('floppy_image_%d' % num) options.append('floppy_image_%d' % num)
for num in range(4): for num in range(4):
include_list.append('floppy_drive_%d' % num) options.append('floppy_drive_%d' % num)
for num in range(10): for num in range(10):
include_list.append('hard_drive_%d' % num) options.append('hard_drive_%d' % num)
changed_options = {} changed_options = {}
for key, val in utils.get_config(self.conf_file).items(): for key, val in utils.get_config(self.conf_file).items():
if key in exclude_list:
continue
if key not in include_list: if key not in options:
continue continue
if val.startswith('/'): if val.startswith('/'):
continue continue
if val.startswith('~'):
continue
if val.startswith('$HOME'): if val.startswith('$HOME'):
continue continue
if val.startswith('$WRAPPER'):
changed_options[key] = val.replace('$WRAPPER', self.dir)
continue
if val.startswith('$CONFIG'): if val.startswith('$CONFIG'):
abspath = utils.interpolate_variables(val, self.conf_file) abspath = utils.interpolate_variables(val, self.conf_file)
changed_options[key] = abspath changed_options[key] = abspath

View File

@@ -7,7 +7,7 @@ from setuptools import setup
setup(name='fs-uae-wrapper', setup(name='fs-uae-wrapper',
packages=['fs_uae_wrapper'], packages=['fs_uae_wrapper'],
version='0.7.1', version='0.8',
description='Automate archives and state for fs-uae', description='Automate archives and state for fs-uae',
author='Roman Dobosz', author='Roman Dobosz',
author_email='gryf73@gmail.com', author_email='gryf73@gmail.com',

View File

@@ -80,6 +80,18 @@ class TestBase(TestCase):
bobj._normalize_options() bobj._normalize_options()
self.assertDictEqual(bobj.fsuae_options, {}) self.assertDictEqual(bobj.fsuae_options, {})
get_config.return_value = {'cdroms_dir': '$WRAPPER/path'}
bobj.fsuae_options = utils.CmdOption()
bobj.dir = self.dirname
bobj._normalize_options()
self.assertDictEqual(bobj.fsuae_options,
{'cdroms_dir': os.path.join(bobj.dir, 'path')})
get_config.return_value = {'cdroms_dir': '~/path'}
bobj.fsuae_options = utils.CmdOption()
bobj._normalize_options()
self.assertDictEqual(bobj.fsuae_options, {})
def test_set_assets_paths(self): def test_set_assets_paths(self):
bobj = base.Base('Config.fs-uae', utils.CmdOption(), {}) bobj = base.Base('Config.fs-uae', utils.CmdOption(), {})
@@ -201,13 +213,13 @@ class TestBase(TestCase):
bobj.all_options['save_states_dir'] = '/some/path' bobj.all_options['save_states_dir'] = '/some/path'
self.assertIsNone(bobj._get_saves_dir()) self.assertIsNone(bobj._get_saves_dir())
bobj.all_options['save_states_dir'] = '$CONFIG/../saves' bobj.all_options['save_states_dir'] = '$WRAPPER/../saves'
self.assertIsNone(bobj._get_saves_dir()) self.assertIsNone(bobj._get_saves_dir())
bobj.all_options['save_states_dir'] = '/foo/$CONFIG/saves' bobj.all_options['save_states_dir'] = '/foo/$WRAPPER/saves'
self.assertIsNone(bobj._get_saves_dir()) self.assertIsNone(bobj._get_saves_dir())
bobj.all_options['save_states_dir'] = '$CONFIG/saves' bobj.all_options['save_states_dir'] = '$WRAPPER/saves'
self.assertIsNone(bobj._get_saves_dir()) self.assertIsNone(bobj._get_saves_dir())
path = os.path.join(self.dirname, 'saves') path = os.path.join(self.dirname, 'saves')
@@ -219,7 +231,7 @@ class TestBase(TestCase):
os.mkdir(path) os.mkdir(path)
self.assertEqual(bobj._get_saves_dir(), 'saves') self.assertEqual(bobj._get_saves_dir(), 'saves')
bobj.all_options['save_states_dir'] = '$CONFIG/saves/' bobj.all_options['save_states_dir'] = '$WRAPPER/saves/'
self.assertEqual(bobj._get_saves_dir(), 'saves') self.assertEqual(bobj._get_saves_dir(), 'saves')
@mock.patch('fs_uae_wrapper.path.which') @mock.patch('fs_uae_wrapper.path.which')