diff --git a/fs_uae_wrapper/plain.py b/fs_uae_wrapper/plain.py index d1efb7b..3853773 100644 --- a/fs_uae_wrapper/plain.py +++ b/fs_uae_wrapper/plain.py @@ -28,7 +28,7 @@ class Plain(object): return -def run(config_file, fs_uae_options, _): +def run(config_file, fs_uae_options, _, unused): """Run fs-uae with provided config file and options""" runner = Plain() diff --git a/fs_uae_wrapper/wrapper.py b/fs_uae_wrapper/wrapper.py index 64b83dd..3d2bd45 100644 --- a/fs_uae_wrapper/wrapper.py +++ b/fs_uae_wrapper/wrapper.py @@ -6,26 +6,26 @@ emulator, if appropriate option is enabled. import importlib import os import sys +try: + import configparser +except ImportError: + import ConfigParser as configparser WRAPPER_KEY = 'wrapper' -def get_wrapper_from_conf(conf): - """ - Process config file only for 'wrapper' option. Specific wrapper modules - can reread the file, looking for specific for wrapper module options. - """ - with open(conf) as fobj: - for line in fobj.readlines(): - if WRAPPER_KEY in line and '=' in line: - key, val = parse_option(line) - if key == WRAPPER_KEY: - break - else: - val = None +def get_config_options(conf): + """Read config file and return options as a dict""" + parser = configparser.SafeConfigParser() + try: + parser.read(conf) + except configparser.ParsingError: + # Configuration syntax is wrong + return None - return val + return {key: val for section in parser.sections() + for key, val in parser.items(section)} def parse_option(string): @@ -101,9 +101,15 @@ def run(): ' for usage\n') sys.exit(1) + configuration = get_config_options(config_file) + + if configuration is None: + sys.stderr.write('Error: Configuration file have syntax issues\n') + sys.exit(2) + wrapper_module = wrapper_options.get(WRAPPER_KEY) if not wrapper_module: - wrapper_module = get_wrapper_from_conf(config_file) + wrapper_module = configuration.get(WRAPPER_KEY) if not wrapper_module: wrapper = importlib.import_module('fs_uae_wrapper.plain') @@ -114,9 +120,9 @@ def run(): except ImportError: sys.stderr.write("Error: provided wrapper module: `%s' doesn't " "exists.\n" % wrapper_module) - sys.exit(2) + sys.exit(3) - wrapper.run(config_file, fs_uae_options, wrapper_options) + wrapper.run(config_file, fs_uae_options, wrapper_options, configuration) if __name__ == "__main__": diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 217a7b5..8056da4 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -28,7 +28,7 @@ class TestWrapper(TestCase): os.unlink(self.fname) sys.argv = self._argv[:] - def test_get_wrapper_from_conf_positive(self): + def test_get_config_options(self): configs = ["[conf]\nwrapper=foo\n", "[conf]\n wrapper =foo\n", @@ -39,32 +39,38 @@ class TestWrapper(TestCase): with open(self.fname, 'w') as fobj: fobj.write(cfg) - val = wrapper.get_wrapper_from_conf(self.fname) - self.assertEqual(val, 'foo') + val = wrapper.get_config_options(self.fname) + self.assertDictEqual(val, {'wrapper': 'foo'}) - def test_get_wrapper_from_conf_negative(self): + with open(self.fname, 'w') as fobj: + fobj.write("[conf]\nwraper=foo\n") + conf = wrapper.get_config_options(self.fname) + self.assertDictEqual(conf, {'wraper': 'foo'}) - configs = ["[conf]\nwraper=foo\n", - "[conf]\nwrapper\n", - "[conf]\nfullscreen = 1\n"] + with open(self.fname, 'w') as fobj: + fobj.write("[conf]\nwrapper\n") + conf = wrapper.get_config_options(self.fname) + self.assertIsNone(conf) - for cfg in configs: - with open(self.fname, 'w') as fobj: - fobj.write(cfg) + with open(self.fname, 'w') as fobj: + fobj.write("[conf]\nfullscreen = 1\n") + conf = wrapper.get_config_options(self.fname) + self.assertDictEqual(conf, {'fullscreen': '1'}) - val = wrapper.get_wrapper_from_conf(self.fname) - self.assertIsNone(val) + with open(self.fname, 'w') as fobj: + fobj.write("[conf]\nwrapper= = = something went wrong\n") + conf = wrapper.get_config_options(self.fname) + self.assertDictEqual(conf, {'wrapper': '= = something went wrong'}) - configs2 = [("[conf]\nwrapper= = = something went wrong\n", - "= = something went wrong"), - ("[conf]\nwrapper = = \n", "="), - ("[conf]\nwrapper = \n", "")] - for cfg, result in configs2: - with open(self.fname, 'w') as fobj: - fobj.write(cfg) + with open(self.fname, 'w') as fobj: + fobj.write("[conf]\nwrapper = = \n") + conf = wrapper.get_config_options(self.fname) + self.assertDictEqual(conf, {'wrapper': '='}) - val = wrapper.get_wrapper_from_conf(self.fname) - self.assertEqual(val, result) + with open(self.fname, 'w') as fobj: + fobj.write("[conf]\nwrapper = \n") + conf = wrapper.get_config_options(self.fname) + self.assertDictEqual(conf, {'wrapper': ''}) @mock.patch('fs_uae_wrapper.plain.run') def test_run(self, mock_plain_run): @@ -94,6 +100,14 @@ class TestWrapper(TestCase): sys.argv.append('--wrapper=dummy_wrapper') self.assertRaises(SystemExit, wrapper.run) + def test_run_wrong_conf(self): + + os.chdir(self.dirname) + with open('Config.fs-uae', 'w') as fobj: + fobj.write('foo\n') + + self.assertRaises(SystemExit, wrapper.run) + def test_parse_option(self): # commandline origin