views.main: Remove tooltip from the status view too
[git-cola.git] / cola / models / base.py
blobecf9940cd95f302012dd38a51494aea604cd8ff7
1 # Copyright (c) 2009 David Aguilar
2 """Provides a serializable data container"""
3 import types
4 import copy
6 from cola import serializer
7 from cola.compat import set
9 class BaseModel(object):
10 def param_names(self, export=False):
11 """Returns a list of serializable attribute names.
13 >>> m = BaseModel()
14 >>> m._question = 'unknown'
15 >>> m.answer = 42
17 >>> m.param_names()
18 ['answer']
20 >>> m.param_names(export=True)
21 ['_question', 'answer']
23 """
24 names = []
25 for k, v in self.__dict__.iteritems():
26 if is_atom(v) or is_dict(v) or is_seq(v):
27 if k.strip('_') != k:
28 if not export:
29 continue
30 names.append(k)
31 names.sort()
32 return names
34 def has_param(self,param):
35 """Returns true if a parameter exists in a model.
37 >>> m = BaseModel()
38 >>> m.answer = 42
39 >>> m.has_param('answer')
40 True
42 >>> m.has_param('question')
43 False
45 """
46 return param in self.__dict__
48 def param(self, param, default=None):
49 """Returns the value of a model parameter.
51 >>> m = BaseModel()
52 >>> m.answer = 42
53 >>> m.param('answer')
56 >>> m.param('another answer', 42)
58 """
59 return self.__dict__.get(param, default)
61 def __getattr__(self, param):
62 """Provides set_<attribute>(value) append methods.
64 This provides automatic convenience methods for handling
65 setattrs with notification.
67 >>> m = BaseModel()
68 >>> m.answer = 42
69 >>> m.set_answer(41)
70 >>> # Observers are notified
71 >>> m.answer
74 """
75 # Base case: we actually have this param
76 if param in self.__dict__:
77 return getattr(self, param)
79 # Return a closure over param for calling set_param;
80 # Concrete classes subclass set_param to provide notification
81 if param.startswith('set_'):
82 return lambda v: self.set_param(param[4:], v)
84 errmsg = ("'%s' object has no attribute '%s'" %
85 (self.__class__.__name__, param))
86 raise AttributeError(errmsg)
88 def set_param(self, param, value):
89 """Wrapper around setattr()
91 >>> m = BaseModel()
92 >>> m.answer = 41
93 >>> m.set_param('answer', 42)
94 >>> m.answer
97 """
98 setattr(self, param, value)
100 def copy_params(self, model, params_to_copy=None):
101 """Copies params from one model to another.
103 >>> m = BaseModel()
104 >>> m.answer = 42
105 >>> m._question = 'unknown'
106 >>> m2 = BaseModel()
107 >>> m2.copy_params(m)
108 >>> m2._question
109 'unknown'
111 >>> m2.answer
115 # Loop over all attributes and copy them over
116 for k in params_to_copy or model.param_names(export=True):
117 self.__dict__[k] = copy.copy(model.__dict__[k])
120 def is_dict(item):
121 return type(item) is types.DictType
124 def is_seq(item):
125 return (type(item) is types.ListType or
126 type(item) is types.TupleType or
127 type(item) is set)
129 def is_atom(item):
130 return(item is None or
131 type(item) in types.StringTypes or
132 type(item) is types.BooleanType or
133 type(item) is types.IntType or
134 type(item) is types.LongType or
135 type(item) is types.FloatType or
136 type(item) is types.ComplexType)