test_property.py 3.71 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import abc
import pykat.exceptions as pkex

class puttable(object):
    """
    Objects that inherit this should be able to have something `put` to it.
    Essentially this means you could write Finesse commands like
    
    put this parameter value
    """
    __metaclass__ = abc.ABCMeta
    
    def __init__(self, component_name, parameter_name):
        self._parameter_name = parameter_name
        self._component_name = component_name
        self._putter = None
    
    def put(self, var):
        if not isinstance(var, putter):
            raise pkex.BasePyKatException("var was not something that can be `put` as a value")
        
        if self._putter != None:
            self._putter.put_count -= 1
        
        self._putter = var
        self._putter.put_count += 1
Daniel Brown's avatar
Daniel Brown committed
27
        
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    def getPutFinesseText(self):
        rtn = []
        # if something is being put to this 
        if self._putter != None:
            rtn.append("put {comp} {param} ${value}".format(comp=self._component_name, param=self._parameter_name, value=self._putter.put_name()))
        
        return rtn
            
class putter(object):
    """
    If an object can be put to something that is puttable it should inherit this
    object.
    """
    __metaclass__ = abc.ABCMeta
Daniel Brown's avatar
Daniel Brown committed
42
    
43
44
45
46
47
    def __init__(self, put_name):
        self._put_name = put_name
        self.put_count = 0
        
    def put_name(self): return self._put_name
Daniel Brown's avatar
Daniel Brown committed
48
    
49
50
51
52
53
54
55
56
57
        
class Param(puttable, putter):         
    def __init__(self, name, owner, value):
        self._name = name
        self._owner = owner
        self._value = value
        
        putter.__init__(self,"var_{0}_{1}".format(owner.name, name))
        puttable.__init__(self, owner.name, name)
Daniel Brown's avatar
Daniel Brown committed
58
59
        
    @property
60
    def name(self): return self._name
Daniel Brown's avatar
Daniel Brown committed
61
    
62
63
64
65
66
67
68
    @property
    def value(self): return self._value
    @value.setter
    def value(self, value):
        self._value = value
    
    def __float__(self): return self.value
Daniel Brown's avatar
Daniel Brown committed
69
        
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
    def getFinesseText(self):
        rtn = []
        rtn.extend(self.getPutFinesseText())
        
        # if this parameter is being put somewhere then we need to
        # set it as a variable
        if self.put_count > 0:
            rtn.append("set {put_name} {comp} {param}".format(put_name=self.put_name(), comp=self._owner.name, param=self.name))
        
        return rtn
        
    def __mul__(self, a):
        return float(self) * a
    
    def __imul__(self, a):
        return self.value * float(a)
        
    __rmul__ = __mul__
    
    def __add__(self, a):
        return self.value + flota(a)
    
    def __iadd__(self, a):
        return self.value + float(a)
        
    __radd__ = __add__
    
    def __sub__(self, a):
        return self.value - float(a)
    
    def __isub__(self, a):
        return self.value - float(a)
        
    __rsub__ = __sub__
    
    def __div__(self, a):
        return self.value / float(a)
    
    def __idiv__(self, a):
        return self.value / complex(a)
        
    def __pow__(self, q):
        return  self.value**q
Daniel Brown's avatar
Daniel Brown committed
113

114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
    def __neg__(self):
        return -self.value
        
    def __eq__(self, q):
        return float(q) == self.value
        
class Beer(object):
    def __init__(self, temp, name):
        
        self._name = name
        
        self._T = Param('T', self, temp)
    
    @property
    def name(self): return self._name
        
    @property
    def T(self): return self._T
    
    @T.setter
    def T(self,value): self._T.value = float(value) 
        
Daniel Brown's avatar
Daniel Brown committed
136

137
138
b = Beer(1,"b")
c = Beer(2,"c")
Daniel Brown's avatar
Daniel Brown committed
139

140
c.T.put(b.T)
Daniel Brown's avatar
Daniel Brown committed
141

142
143
print c.T.getFinesseText()
print b.T.getFinesseText()