Browse Source

pygrass: Add a new method to check the correctness of the provide parameter, a new special parameter: check_ is added to skip the check

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@65598 15284696-431f-4ddb-bdfa-cd5b030d7da7
Pietro Zambelli 9 years ago
parent
commit
915e29d956

+ 18 - 7
lib/python/pygrass/modules/interface/module.py

@@ -505,6 +505,7 @@ class Module(object):
         #
         self.run_ = True
         self.finish_ = True
+        self.check_ = True
         self.env_ = None
         self.stdin_ = None
         self.stdin = None
@@ -544,7 +545,7 @@ class Module(object):
             del(kargs['flags'])
 
         # set attributs
-        for key in ('run_', 'env_', 'finish_', 'stdout_', 'stderr_'):
+        for key in ('run_', 'env_', 'finish_', 'stdout_', 'stderr_', 'check_'):
             if key in kargs:
                 setattr(self, key, kargs.pop(key))
 
@@ -554,7 +555,7 @@ class Module(object):
                 self.inputs[key[:-1]].value = kargs.pop(key)
 
         #
-        # check args
+        # set/update args
         #
         for param, arg in zip(self.params_list, args):
             param.value = arg
@@ -577,11 +578,8 @@ class Module(object):
             #
             # check reqire parameters
             #
-            for k in self.required:
-                if ((k in self.inputs and self.inputs[k].value is None) or
-                        (k in self.outputs and self.outputs[k].value is None)):
-                    msg = "Required parameter <%s> not set."
-                    raise ParameterError(msg % k)
+            if self.check_:
+                self.check()
             return self.run()
         return self
 
@@ -635,6 +633,19 @@ class Module(object):
         flags = self.flags.__doc__
         return '\n'.join([head, params, DOC['flag_head'], flags, DOC['foot']])
 
+    def check(self):
+        """Check the correctness of the provide parameters"""
+        required = True
+        for flg in self.flags.values():
+            if flg and flg.suppress_required:
+                required = False
+        if required:
+            for k in self.required:
+                if ((k in self.inputs and self.inputs[k].value is None) or
+                        (k in self.outputs and self.outputs[k].value is None)):
+                    msg = "Required parameter <%s> not set."
+                    raise ParameterError(msg % k)
+
     def get_dict(self):
         """Return a dictionary that includes the name, all valid
         inputs, outputs and flags

+ 14 - 0
lib/python/pygrass/modules/interface/testsuite/test_modules.py

@@ -10,6 +10,7 @@ from grass.gunittest.case import TestCase
 from grass.gunittest.main import test
 
 from grass.script.core import get_commands
+from grass.exceptions import ParameterError
 from grass.pygrass.modules.interface import Module
 
 PY2 = sys.version_info[0] == 2
@@ -65,5 +66,18 @@ class TestModulesPickability(TestCase):
         out.close()
 
 
+class TestModulesCheck(TestCase):
+    def test_flags_with_suppress_required(self):
+        """Test if flags with suppress required are handle correctly"""
+        gextension = Module('g.extension')
+        # check if raise an error if required parameter are missing
+        with self.assertRaises(ParameterError):
+            gextension.check()
+
+        # check if the flag suppress the required parameters
+        gextension.flags.a = True
+        self.assertIsNone(gextension.check())
+
+
 if __name__ == '__main__':
     test()