Fixes bug 1416703 by implementing the ability to provide a function to do the conversion.

bzr-revno: 2508
This commit is contained in:
Philip Ridout 2015-02-21 17:55:15 +00:00 committed by Tim Bentley
commit 98a521021c
2 changed files with 60 additions and 8 deletions

View File

@ -25,7 +25,6 @@ This class contains the core default settings.
import datetime import datetime
import logging import logging
import os import os
import sys
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
@ -45,6 +44,21 @@ if is_linux():
X11_BYPASS_DEFAULT = False X11_BYPASS_DEFAULT = False
def recent_files_conv(value):
"""
If the value is not a list convert it to a list
:param value: Value to convert
:return: value as a List
"""
if isinstance(value, list):
return value
elif isinstance(value, str):
return [value]
elif isinstance(value, bytes):
return [value.decode()]
return []
class Settings(QtCore.QSettings): class Settings(QtCore.QSettings):
""" """
Class to wrap QSettings. Class to wrap QSettings.
@ -66,10 +80,9 @@ class Settings(QtCore.QSettings):
The first entry is the *old key*; it will be removed. The first entry is the *old key*; it will be removed.
The second entry is the *new key*; we will add it to the config. If this is just an empty string, we just remove The second entry is the *new key*; we will add it to the config. If this is just an empty string, we just remove
the old key. the old key. The last entry is a list containing two-pair tuples. If the list is empty, no conversion is made.
If the first value is callable i.e. a function, the function will be called with the old setting's value.
The last entry is a list containing two-pair tuples. If the list is empty, no conversion is made. Otherwise each Otherwise each pair describes how to convert the old setting's value::
pair describes how to convert the old setting's value::
(SlideLimits.Wrap, True) (SlideLimits.Wrap, True)
@ -334,7 +347,7 @@ class Settings(QtCore.QSettings):
('general/language', 'core/language', []), ('general/language', 'core/language', []),
('general/last version test', 'core/last version test', []), ('general/last version test', 'core/last version test', []),
('general/loop delay', 'core/loop delay', []), ('general/loop delay', 'core/loop delay', []),
('general/recent files', 'core/recent files', []), ('general/recent files', 'core/recent files', [(recent_files_conv, None)]),
('general/save prompt', 'core/save prompt', []), ('general/save prompt', 'core/save prompt', []),
('general/screen blank', 'core/screen blank', []), ('general/screen blank', 'core/screen blank', []),
('general/show splash', 'core/show splash', []), ('general/show splash', 'core/show splash', []),
@ -359,7 +372,7 @@ class Settings(QtCore.QSettings):
:param default_values: A dict with setting keys and their default values. :param default_values: A dict with setting keys and their default values.
""" """
Settings.__default_settings__ = dict(list(default_values.items()) + list(Settings.__default_settings__.items())) Settings.__default_settings__.update(default_values)
@staticmethod @staticmethod
def set_filename(ini_file): def set_filename(ini_file):
@ -416,7 +429,9 @@ class Settings(QtCore.QSettings):
for new, old in rules: for new, old in rules:
# If the value matches with the condition (rule), then use the provided value. This is used to # If the value matches with the condition (rule), then use the provided value. This is used to
# convert values. E. g. an old value 1 results in True, and 0 in False. # convert values. E. g. an old value 1 results in True, and 0 in False.
if old == old_value: if callable(new):
old_value = new(old_value)
elif old == old_value:
old_value = new old_value = new
break break
self.setValue(new_key, old_value) self.setValue(new_key, old_value)

View File

@ -25,6 +25,8 @@ Package to test the openlp.core.lib.settings package.
from unittest import TestCase from unittest import TestCase
from openlp.core.common import Settings from openlp.core.common import Settings
from openlp.core.common.settings import recent_files_conv
from tests.functional import patch
from tests.helpers.testmixin import TestMixin from tests.helpers.testmixin import TestMixin
@ -45,6 +47,25 @@ class TestSettings(TestCase, TestMixin):
""" """
self.destroy_settings() self.destroy_settings()
def recent_files_conv_test(self):
"""
Test that recent_files_conv, converts various possible types of values correctly.
"""
# GIVEN: A list of possible value types and the expected results
possible_values = [(['multiple', 'values'], ['multiple', 'values']),
(['single value'], ['single value']),
('string value', ['string value']),
(b'bytes value', ['bytes value']),
([], []),
(None, [])]
# WHEN: Calling recent_files_conv with the possible values
for value, expected_result in possible_values:
actual_result = recent_files_conv(value)
# THEN: The actual result should be the same as the expected result
self.assertEqual(actual_result, expected_result)
def settings_basic_test(self): def settings_basic_test(self):
""" """
Test the Settings creation and its default usage Test the Settings creation and its default usage
@ -120,3 +141,19 @@ class TestSettings(TestCase, TestMixin):
# THEN: An exception with the non-existing key should be thrown # THEN: An exception with the non-existing key should be thrown
self.assertEqual(str(cm.exception), "'core/does not exists'", 'We should get an exception') self.assertEqual(str(cm.exception), "'core/does not exists'", 'We should get an exception')
def extend_default_settings_test(self):
"""
Test that the extend_default_settings method extends the default settings
"""
# GIVEN: A patched __default_settings__ dictionary
with patch.dict(Settings.__default_settings__,
{'test/setting 1': 1, 'test/setting 2': 2, 'test/setting 3': 3}, True):
# WHEN: Calling extend_default_settings
Settings.extend_default_settings({'test/setting 3': 4, 'test/extended 1': 1, 'test/extended 2': 2})
# THEN: The _default_settings__ dictionary_ should have the new keys
self.assertEqual(
Settings.__default_settings__, {'test/setting 1': 1, 'test/setting 2': 2, 'test/setting 3': 4,
'test/extended 1': 1, 'test/extended 2': 2})