]> git.parisson.com Git - timeside.git/commitdiff
Add tools.parameters modules
authorThomas Fillon <thomas@parisson.com>
Thu, 22 May 2014 07:10:21 +0000 (09:10 +0200)
committerThomas Fillon <thomas@parisson.com>
Thu, 22 May 2014 07:10:21 +0000 (09:10 +0200)
timeside/tools/parameters.py [new file with mode: 0644]

diff --git a/timeside/tools/parameters.py b/timeside/tools/parameters.py
new file mode 100644 (file)
index 0000000..69a68cf
--- /dev/null
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+
+#
+# Copyright (c) 2007-2014 Parisson SARL
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide.  If not, see <http://www.gnu.org/licenses/>.
+
+# Authors:
+#   Thomas Fillon <thomas  at parisson.com>
+
+
+from traits.api import HasTraits, Unicode, Int, Float, Range
+import simplejson as json
+
+
+TRAIT_TYPES = {Unicode: 'str',
+               Int: 'int',
+               Float: 'float',
+               Range: 'range'}
+
+
+class HasParam(object):
+    """
+    >>> class ParamClass(HasParam):
+    ...    class _Param(HasTraits):
+    ...        param1 = Unicode(desc='first or personal name',
+    ...                      label='First Name')
+    ...        param2 = Int()
+    ...        param3 = Float()
+    ...        param4 = Range(low=0, high=10, value=3)
+    >>>
+    >>> p = ParamClass()
+    >>> param_json = p.get_parameters()
+    >>> print param_json
+    {"param4": 3, "param3": 0.0, "param2": 0, "param1": ""}
+    >>> new_param_json = '{"param1": "plop", "param2": 7, "param3": 0.5, \
+    "param4": 8}'
+    >>> p.set_parameters(new_param_json)
+    >>> print p.get_parameters()
+    {"param4": 8, "param3": 0.5, "param2": 7, "param1": "plop"}
+    >>> v = p.param_view()
+    >>> print v
+    {'param4': {'default': 3, 'type': 'range'}, \
+'param3': {'default': 0.0, 'type': 'float'}, \
+'param2': {'default': 0, 'type': 'int'}, \
+'param1': {'default': u'', 'type': 'str'}}
+    """
+    class _Param(HasTraits):
+        pass
+
+    def __init__(self):
+        super(HasParam, self).__init__()
+        self._parameters = self._Param()
+
+    def __setattr__(self, name, value):
+        if name is '_parameters':
+            super(HasParam, self).__setattr__(name, value)
+        elif name in self._parameters.trait_names():
+            self._parameters.trait_setq(**{name: value})
+            # Copy attributes as a regular attribute at class level
+            super(HasParam, self).__setattr__(name,
+                                              self._parameters.get(name))
+        else:
+            super(HasParam, self).__setattr__(name, value)
+
+#    def __getattribute__(self, name):
+#        if name in ['_parameters', '_Param']:
+#            return super(HasParam, self).__getattribute__(name)
+#        elif name in self._parameters.trait_names():
+#            return self._parameters.trait_get(name)
+#        else:
+#            return super(HasParam, self).__getattribute__(name)
+
+    def get_parameters(self):
+        list_traits = self._parameters.editable_traits()
+        param_dict = self._parameters.get(list_traits)
+        param_str = json.dumps(param_dict)
+        return param_str
+
+    def set_parameters(self, param_str):
+        param_dict = json.loads(param_str)
+        self._parameters.set(**param_dict)
+
+    def param_view(self):
+        list_traits = self._parameters.editable_traits()
+        view = {}
+        for key in list_traits:
+            trait_type = self._parameters.trait(key).trait_type.__class__
+            default = self._parameters.trait(key).default
+            d = {'type': TRAIT_TYPES[trait_type],
+                 'default': default}
+            view[key] = d
+        return view
+
+
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod()