Browse Source

Bugfix on settings_loader default values solves #308

Yann Weber 7 years ago
parent
commit
bf1ed9ff1a

+ 7
- 0
globconf.d/lodel2.ini View File

@@ -2,6 +2,13 @@
2 2
 debug = False
3 3
 sitename = noname
4 4
 datasource_connectors = dummy_datasource
5
+session_handler = filesystem_session
6
+
7
+[lodel2.datasources.default]
8
+identifier = dummy_datasource.default
9
+
10
+[lodel2.datasource.dummy_datasource.default]
11
+dummy =
5 12
 
6 13
 [lodel2.logging.stderr]
7 14
 level = ERROR

+ 1
- 1
lodel/plugins/dummy_datasource/__init__.py View File

@@ -12,7 +12,7 @@ __plugin_deps__ = []
12 12
 CONFSPEC = {
13 13
     'lodel2.datasource.dummy_datasource.*' : {
14 14
         'dummy': (  None,
15
-                    Validator('dummy'))}
15
+                    Validator('dummy', none_is_valid=True))}
16 16
 }
17 17
 
18 18
 

+ 12
- 26
lodel/settings/settings_loader.py View File

@@ -8,7 +8,8 @@ from lodel.context import LodelContext
8 8
 
9 9
 LodelContext.expose_modules(globals(), {
10 10
     'lodel.logger': 'logger',
11
-    'lodel.settings.utils': ['SettingsError', 'SettingsErrors']})
11
+    'lodel.settings.utils': ['SettingsError', 'SettingsErrors'],
12
+    'lodel.validator.validator': ['ValidationError']})
12 13
 
13 14
 ##@brief Merges and loads configuration files
14 15
 class SettingsLoader(object):
@@ -36,9 +37,9 @@ class SettingsLoader(object):
36 37
         l_dir = glob.glob(self.__conf_path+'/*.ini')
37 38
         logger.debug("SettingsLoader found those settings files : %s" % (
38 39
             ', '.join(l_dir)))
39
-
40 40
         for f_ini in l_dir:
41
-            config = configparser.ConfigParser(default_section=self.DEFAULT_SECTION, interpolation=None)
41
+            config = configparser.ConfigParser(
42
+	    	default_section = self.DEFAULT_SECTION ,interpolation=None)
42 43
             config.read(f_ini)
43 44
             for section in [s for s in config if s != self.DEFAULT_SECTION]:
44 45
                 if section not in conf:
@@ -60,39 +61,24 @@ class SettingsLoader(object):
60 61
     # @param keyname str
61 62
     # @param validator callable : takes one argument value and raises validation fail
62 63
     # @param default_value *
63
-    # @param mandatory bool
64 64
     # @return the option
65
-    def getoption(self, section, keyname, validator, default_value=None, mandatory=False):
66
-        conf = self.__conf
65
+    def getoption(self,section,keyname,validator,default_value=None):
66
+        conf=self.__conf
67 67
         if section not in conf:
68 68
             conf[section] = dict()
69 69
 
70 70
         sec = conf[section]
71
-        result = None
72 71
         if keyname in sec:
73 72
             result = sec[keyname]['value']
74
-            if result is not None:
75
-                result = result.strip()
76
-                if len(result) == 0:
77
-                    result = None
78 73
             try:
79 74
                 del self.__conf_sv[section + ':' + keyname]
80 75
             except KeyError: #allready fetched
81 76
                 pass
82
-        if result is None:
83
-            if default_value is None and mandatory:
84
-                msg = "Default value mandatory for option %s" % keyname
85
-                expt = SettingsError(msg=msg, key_id=section+'.'+keyname, \
86
-                    filename=sec[keyname]['file'])
87
-                self.__errors_list.append(expt)
88
-                return
89
-            else:
90
-                sec[keyname] = dict()
91
-                sec[keyname]['value'] = default_value
92
-                sec[keyname]['file'] = SettingsLoader.DEFAULT_FILENAME
93
-                result = default_value
94
-                logger.debug("Using default value for configuration key %s:%s" \
95
-                    % (section, keyname))
77
+        else:
78
+            #default values
79
+            sec[keyname] = dict()
80
+            result = sec[keyname]['value'] = default_value
81
+            sec[keyname]['file'] = SettingsLoader.DEFAULT_FILENAME
96 82
 
97 83
         try:
98 84
             return validator(result)
@@ -103,7 +89,7 @@ class SettingsLoader(object):
103 89
                                     key_id=section+'.'+keyname)
104 90
                 self.__errors_list.append(expt)
105 91
             else:
106
-                #expt = ValidationError("For %s.%s : %s" % (section, keyname, e))
92
+                expt = ValidationError("For %s.%s : %s" % (section, keyname, e))
107 93
                 expt2 = SettingsError(msg=str(expt), \
108 94
                                         key_id=section+'.'+keyname, \
109 95
                                         filename=sec[keyname]['file'])

+ 11
- 3
lodel/validator/validator.py View File

@@ -57,6 +57,11 @@ class Validator(MlNamedObject):
57 57
     # @return properly casted value
58 58
     # @throw ValidationError
59 59
     def __call__(self, value):
60
+        if value is None:
61
+            if self.__none_is_valid:
62
+                return None
63
+            else:
64
+                raise ValidationError('None is not a valid value')
60 65
         if self.__none_is_valid and value is None:
61 66
             return None
62 67
         try:
@@ -94,6 +99,9 @@ class Validator(MlNamedObject):
94 99
     def create_list_validator(cls, validator_name, elt_validator, description=None, separator=','):
95 100
         def list_validator(value):
96 101
             res = list()
102
+            if value is None:
103
+                return res
104
+            errors = list()
97 105
             for elt in value.split(separator):
98 106
                 elt = elt_validator(elt)
99 107
                 if len(elt) > 0:
@@ -334,7 +342,7 @@ def emfield_val(value):
334 342
     spl = value.split('.')
335 343
     if len(spl) != 2:
336 344
         msg = "Expected a value in the form CLASSNAME.FIELDNAME but got : %s"
337
-        raise SettingsValidationError(msg % value)
345
+        raise ValidationError(msg % value)
338 346
     value = tuple(spl)
339 347
     # Late validation hook
340 348
 
@@ -344,11 +352,11 @@ def emfield_val(value):
344 352
         classnames = {cls.__name__.lower(): cls for cls in dyncode.dynclasses}
345 353
         if value[0].lower() not in classnames:
346 354
             msg = "Following dynamic class do not exists in current EM : %s"
347
-            raise SettingsValidationError(msg % value[0])
355
+            raise ValidationError(msg % value[0])
348 356
         ccls = classnames[value[0].lower()]
349 357
         if value[1].lower() not in ccls.fieldnames(True):
350 358
             msg = "Following field not found in class %s : %s"
351
-            raise SettingsValidationError(msg % value)
359
+            raise ValidationError(msg % value)
352 360
     return value
353 361
 
354 362
 # @brief Validator for plugin name & optionnaly type

+ 14
- 9
tests/settings/test_settings_loader.py View File

@@ -6,6 +6,7 @@ import os.path
6 6
 from lodel.settings.utils import *
7 7
 from lodel.plugin.exceptions import *
8 8
 from lodel.settings.settings_loader import SettingsLoader
9
+from lodel.validator.validator import *
9 10
 
10 11
 
11 12
 
@@ -87,12 +88,21 @@ class SettingsLoaderTestCase(unittest.TestCase):
87 88
         """ Testing behavior of default value in getoption """
88 89
         loader = SettingsLoader('tests/settings/settings_examples/simple.conf.d')
89 90
         # for non existing keys in file
90
-        value = loader.getoption('lodel2.foo.bar', 'foofoofoo', dummy_validator, 'hello 42', False)
91
+        value = loader.getoption('lodel2.foo.bar', 'foofoofoo', dummy_validator, 'hello 42')
91 92
         self.assertEqual(value, 'hello 42')
92 93
         # for non existing section in file
93
-        value = loader.getoption('lodel2.foofoo', 'foofoofoo', dummy_validator, 'hello 42', False)
94
+        value = loader.getoption('lodel2.foofoo', 'foofoofoo', dummy_validator, 'hello 42')
94 95
         self.assertEqual(value, 'hello 42')
95 96
 
97
+    def test_geoption_invalid_default_value(self):
98
+        """ Testing the behavior when the default value is invalid """
99
+        loader = SettingsLoader('tests/settings/settings_examples/simple.conf.d')
100
+        mandatory_validator = Validator('string', none_is_valid=False)
101
+        with self.assertRaises(SettingsErrors):
102
+            value = loader.getoption(
103
+                'lodel2.foo.bar', 'foofoofooDEFAULT', mandatory_validator)
104
+            loader.raise_errors()
105
+
96 106
     def test_getoption_complex(self):
97 107
         """ Testing behavior of getoption with less simple files & confs """
98 108
 
@@ -235,10 +245,10 @@ class SettingsLoaderTestCase(unittest.TestCase):
235 245
         loader = SettingsLoader('tests/settings/settings_examples/conf_setdef.d')
236 246
             
237 247
         # for non existing keys in file
238
-        value = loader.getoption('lodel2.foo.bar', 'foofoofoo', dummy_validator, 'hello 42', False)
248
+        value = loader.getoption('lodel2.foo.bar', 'foofoofoo', dummy_validator, 'hello 42')
239 249
         self.assertEqual(value, 'hello 42')
240 250
         # for non existing section in file
241
-        value = loader.getoption('lodel2.foofoo', 'foofoofoo', dummy_validator, 'hello 42', False)
251
+        value = loader.getoption('lodel2.foofoo', 'foofoofoo', dummy_validator, 'hello 42')
242 252
         self.assertEqual(value, 'hello 42')
243 253
         
244 254
         loader.setoption('lodel2.foo.bar', 'foofoofoo', 'test ok', dummy_validator)
@@ -253,8 +263,3 @@ class SettingsLoaderTestCase(unittest.TestCase):
253 263
         
254 264
         os.remove('tests/settings/settings_examples/conf_setdef.d/generated.ini')
255 265
         
256
-    def test_invalid_conf(self):
257
-        from lodel.settings.settings import Settings
258
-        Settings.stop()
259
-        with self.assertRaises((SettingsErrors, PluginError)):
260
-            Settings('tests/settings/settings_examples/bad_conf.d')

Loading…
Cancel
Save