From a462c56e0724a413bf68fcfd48ef5a1355a96186 Mon Sep 17 00:00:00 2001 From: Thomas Fillon Date: Thu, 22 May 2014 09:10:21 +0200 Subject: [PATCH] Add tools.parameters modules --- timeside/tools/parameters.py | 111 +++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 timeside/tools/parameters.py diff --git a/timeside/tools/parameters.py b/timeside/tools/parameters.py new file mode 100644 index 0000000..69a68cf --- /dev/null +++ b/timeside/tools/parameters.py @@ -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 . + +# Authors: +# Thomas Fillon + + +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() -- 2.39.5