summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Reiter <reiter.christoph@gmail.com>2018-04-17 12:47:34 +0200
committerChristoph Reiter <reiter.christoph@gmail.com>2018-04-17 12:51:05 +0200
commitca20535e993b888f22795a471988ebeb50c492d0 (patch)
tree4001eb474782bd0270cf57cf94d7950b39a3013f
parentc1da8edf4d18b6a1fa17ca55f4163af44ea95bbb (diff)
downloadpygobject-ca20535e993b888f22795a471988ebeb50c492d0.tar.gz
Gio.Settings: support range types in __setitem__. Fixes #134
-rw-r--r--gi/overrides/Gio.py7
-rw-r--r--tests/org.gnome.test.gschema.xml4
-rw-r--r--tests/test_gio.py27
3 files changed, 36 insertions, 2 deletions
diff --git a/gi/overrides/Gio.py b/gi/overrides/Gio.py
index 3cdc7b18..75a128e3 100644
--- a/gi/overrides/Gio.py
+++ b/gi/overrides/Gio.py
@@ -145,6 +145,13 @@ class Settings(Gio.Settings):
allowed = v.unpack()
if value not in allowed:
raise ValueError('value %s is not an allowed enum (%s)' % (value, allowed))
+ elif type_ == 'range':
+ tuple_ = v.get_child_value(0)
+ type_str = tuple_.get_child_value(0).get_type_string()
+ min_, max_ = tuple_.unpack()
+ if value < min_ or value > max_:
+ raise ValueError(
+ 'value %s not in range (%s - %s)' % (value, min_, max_))
else:
raise NotImplementedError('Cannot handle allowed type range class ' + str(type_))
diff --git a/tests/org.gnome.test.gschema.xml b/tests/org.gnome.test.gschema.xml
index eb9aab8c..0c1e5c4a 100644
--- a/tests/org.gnome.test.gschema.xml
+++ b/tests/org.gnome.test.gschema.xml
@@ -21,6 +21,10 @@
<key name="test-enum" enum="org.gnome.test.FruitType">
<default>'banana'</default>
</key>
+ <key name="test-range" type="i">
+ <range min="7" max="65535"/>
+ <default>123</default>
+ </key>
</schema>
<schema id="org.gnome.nopathtest">
diff --git a/tests/test_gio.py b/tests/test_gio.py
index 6ad5b116..b5fcdf3c 100644
--- a/tests/test_gio.py
+++ b/tests/test_gio.py
@@ -7,6 +7,8 @@ import os
import unittest
import warnings
+import pytest
+
import gi.overrides
from gi import PyGIWarning
from gi.repository import GLib, Gio
@@ -67,7 +69,13 @@ class TestGSettings(unittest.TestCase):
def test_iter(self):
assert list(self.settings) == [
'test-tuple', 'test-array', 'test-boolean', 'test-string',
- 'test-enum']
+ 'test-enum', 'test-range']
+
+ def test_get_set(self):
+ for key in self.settings:
+ old_value = self.settings[key]
+ self.settings[key] = old_value
+ assert self.settings[key] == old_value
def test_native(self):
self.assertTrue('test-array' in self.settings.list_keys())
@@ -87,6 +95,9 @@ class TestGSettings(unittest.TestCase):
v = self.settings.get_value('test-tuple')
self.assertEqual(v.unpack(), (1, 2))
+ v = self.settings.get_value('test-range')
+ assert v.unpack() == 123
+
# set a value
self.settings.set_string('test-string', 'World')
self.assertEqual(self.settings.get_string('test-string'), 'World')
@@ -104,7 +115,7 @@ class TestGSettings(unittest.TestCase):
self.assertEqual(with_path['np-int'], 42)
def test_dictionary_api(self):
- self.assertEqual(len(self.settings), 5)
+ self.assertEqual(len(self.settings), 6)
self.assertTrue('test-array' in self.settings)
self.assertTrue('test-array' in self.settings.keys())
self.assertFalse('nonexisting' in self.settings)
@@ -135,6 +146,18 @@ class TestGSettings(unittest.TestCase):
self.assertRaises(ValueError, self.settings.__setitem__, 'test-enum', 'plum')
self.assertRaises(KeyError, self.settings.__setitem__, 'unknown', 'moo')
+ def test_set_range(self):
+ self.settings['test-range'] = 7
+ assert self.settings['test-range'] == 7
+ self.settings['test-range'] = 65535
+ assert self.settings['test-range'] == 65535
+
+ with pytest.raises(ValueError, match=".*7 - 65535.*"):
+ self.settings['test-range'] = 7 - 1
+
+ with pytest.raises(ValueError, match=".*7 - 65535.*"):
+ self.settings['test-range'] = 65535 + 1
+
def test_empty(self):
empty = Gio.Settings.new_with_path('org.gnome.empty', '/tests/')
self.assertEqual(len(empty), 0)