Repository navigation
Expand file tree
/
Copy pathRuleElements.py
More file actions
executable file
·148 lines (116 loc) · 4.79 KB
/
Copy pathRuleElements.py
File metadata and controls
executable file
·148 lines (116 loc) · 4.79 KB
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
class RuleElement:
def __init__( self, name ):
self.name = name
def getType( self ):
pass
def __eq__( self, other ):
return ( self.name == other.name )
class Operator( RuleElement ):
# The Operator constructor
def __init__( self, operator ):
# This is the set of all allowed operators
self.operators = [ 'AND', 'OR', 'NOT', 'EQUALTO', 'NOTEQUALTO', 'LESSTHAN', 'GREATERTHAN', 'LESSTHANOREQUALTO', 'GREATERTHANOREQUALTO' ]
# If operator is not in the set then raise an exception
if operator in self.operators:
RuleElement.__init__( self, operator )
else:
raise 'Syntax error: ' + operator + ' is not a valid operator'
def __str__( self ):
return self.name
def getType( self ):
return 'Operator'
class Proposition( RuleElement ):
def __init__( self, name, value ):
self.value = value
RuleElement.__init__( self, name )
def __str__( self ):
if self.value == True:
truth = 'true'
else:
truth = 'false'
return 'Proposition statement = ' + self.name + ', value = ' + truth
def getType( self ):
return 'Proposition'
# I have had to capitalize the methods And(), Or(), Xor() and Not()
# because "and", "or" and "not" are Python keywords
def And( self, proposition ):
resultName = '( ' + self.name + ' AND ' + proposition.name + ' )'
resultValue = self.value and proposition.value
return Proposition(resultName, resultValue);
def Or( self, proposition ):
resultName = '( ' + self.name + ' OR ' + proposition.name + ' )'
resultValue = self.value or proposition.value
return Proposition(resultName, resultValue);
def Not( self ):
resultName = '( NOT ' + self.name + ' )'
resultValue = not self.value
return Proposition( resultName, resultValue );
def Xor( self, proposition ):
resultName = '( ' + self.name + ' XOR ' + proposition.name + ' )'
if ( self.value == proposition.value ):
return Proposition( resultName, 0 )
else:
return Proposition( resultName, 1 )
def __eq__( self, other ):
return ( self.value == other.value ) & ( self.name == other.name )
class Variable( RuleElement ):
def __init__( self, name, value ):
self.value = value
RuleElement.__init__( self, name )
def __str__( self ):
return 'Variable name = ' + self.name + ', value = ' + str( self.value )
def equalTo( self, variable ):
statement = '( ' + self.name + ' == ' + variable.name + ' )'
truthValue = ( self.value == variable.value )
return Proposition(statement, truthValue)
def notEqualTo( self, variable ):
statement = '( ' + self.name + ' != ' + variable.name + ' )'
truthValue = ( self.value != variable.value )
return Proposition(statement, truthValue)
def lessThan( self, variable ):
statement = '( ' + self.name + ' < ' + variable.name + ' )'
truthValue = ( self.value < variable.value )
return Proposition(statement, truthValue)
def greaterThan( self, variable ):
statement = '( ' + self.name + ' > ' + variable.name + ' )'
truthValue = ( self.value > variable.value )
return Proposition(statement, truthValue)
def greaterThanOrEqualTo( self, variable ):
statement = '( ' + self.name + ' >= ' + variable.name + ' )'
truthValue = ( self.value >= variable.value )
return Proposition(statement, truthValue)
def lessThanOrEqualTo( self, variable ):
statement = '( ' + self.name + ' <= ' + variable.name + ' )'
truthValue = ( self.value <= variable.value )
return Proposition(statement, truthValue)
def getType( self, ):
return 'Variable'
from time import *
from calendar import *
class DateVariable( Variable ):
def __init__( self, name, value ):
# Date string format is YYYY:MM:DD:HH:MM
# Convert the date string to a Unix timestamp
# using the function timegm(). This takes 9 parameters
# year, month, day, hour, minute, seconds, weekday, Julian day, daylight savings flag
dateElements = value.split( ':' )
i = 0
for e in dateElements:
dateElements[i] = int(e)
i = i + 1
dateElements.append( 0 ) # seconds
dateElements.append( 0 ) # weekday
dateElements.append( 0 ) # Julian day
dateElements.append( 0 ) # daylight savings flag
# Convert the 9 parameters to a UNIX timestamp
# This is an integer value that is the number of seconds since the start of 1970
tempValue = timegm( dateElements )
Variable.__init__( self, name, tempValue )
def __str__( self ):
# gmtime() converts a UNIX timestamp back to the 9 parameters
# needed by timegm()
dateElements = gmtime( self.value )
dateString = dateElements[0] + ':' + dateElements[1] + ':' + dateElements[2] + ':' + dateElements[3] + ':' + dateElements[4]
return 'DateVariable name = ' + self.name + ', value = ' + dateString
def getType( self, ):
return 'DateVariable'