1 from __future__
import absolute_import
2 from .SequenceTypes
import *
3 from .Modules
import OutputModule, EDProducer, EDFilter, EDAnalyzer, Service, ESProducer, ESSource, _Module
4 from .Mixins
import _Labelable
12 if isinstance(visitee, _Labelable):
13 if not visitee.hasLabel_():
14 raise ValueError(
"A task associated with the Schedule contains a module of type '"+visitee.type_()+
"'\nwhich has no assigned label.")
15 elif isinstance(visitee, Service):
16 if not visitee._inProcess:
17 raise ValueError(
"A task associated with the Schedule contains a service of type '"+visitee.type_()+
"'\nwhich is not attached to the process.")
22 class PathValidator(object):
28 if isinstance(visitee,OutputModule):
29 raise ValueError(
"Path "+self.
__label+
"cannot contain an OutputModule, '"+visitee.type_()+
"', with label '"+visitee.label_()+
"'")
31 if isinstance(visitee, _Labelable):
32 if not visitee.hasLabel_():
33 raise ValueError(
"Path "+self.
__label+
"contains a module of type '"+visitee.type_()+
"' which has no assigned label.")
34 elif isinstance(visitee, Service):
35 if not visitee._inProcess:
36 raise ValueError(
"Path "+self.
__label+
"contains a service of type '"+visitee.type_()+
"' which is not attached to the process.\n")
41 class EndPathValidator(object):
42 _presetFilters = [
"TriggerResultsFilter",
"HLTPrescaler"]
51 if isinstance(visitee, _Labelable):
52 if not visitee.hasLabel_():
53 raise ValueError(
"EndPath "+self.
__label+
"contains a module of type '"+visitee.type_()+
"' which has\nno assigned label.")
54 elif isinstance(visitee, Service):
55 if not visitee._inProcess:
56 raise ValueError(
"EndPath "+self.
__label+
"contains a service of type '"+visitee.type_()+
"' which is not attached to the process.\n")
57 if isinstance(visitee, Task):
61 if isinstance(visitee,EDFilter):
64 self.filtersOnEndpaths.append(visitee.type_())
67 if isinstance(visitee, Task):
81 if isinstance(visitee, _Labelable):
82 if not visitee.hasLabel_():
83 raise ValueError(
"FinalPath "+self.
__label+
"contains a module of type '"+visitee.type_()+
"' which has\nno assigned label.")
84 elif isinstance(visitee, Service):
85 if not visitee._inProcess:
86 raise ValueError(
"FinalPath "+self.
__label+
"contains a service of type '"+visitee.type_()+
"' which is not attached to the process.\n")
87 if isinstance(visitee, Task):
91 if isinstance(visitee,EDFilter):
92 self.filtersOnFinalpaths.append(visitee.type_())
93 if isinstance(visitee,EDProducer):
94 self.producersOnFinalpaths.append(visitee.type_())
97 if isinstance(visitee, Task):
101 """Form sets of all modules, ESProducers, ESSources and Services in visited objects. Can be used
102 to visit Paths, EndPaths, Sequences or Tasks. Includes in sets objects on sub-Sequences and sub-Tasks"""
110 if isinstance(visitee, _Module):
111 self.modules.add(visitee)
112 elif isinstance(visitee, ESProducer):
113 self.esProducers.add(visitee)
114 elif isinstance(visitee, ESSource):
115 self.esSources.add(visitee)
116 elif isinstance(visitee, Service):
117 self.services.add(visitee)
121 class CompositeVisitor(object):
122 """ Combines 3 different visitor classes in 1 so we only have to visit all the paths and endpaths once"""
128 self._validator.enter(visitee)
129 self._node.enter(visitee)
130 self._decorated.enter(visitee)
132 self._validator.leave(visitee)
135 self._decorated.leave(visitee)
138 """Fill a list with the names of Event module types in a sequence. The names are determined
139 by using globals() to lookup the variable names assigned to the modules. This
140 allows the determination of the labels before the modules have been attached to a Process."""
142 self.
_moduleToName = { v[1]:v[0]
for v
in globals_.items()
if isinstance(v[1],_Module) }
145 if isinstance(node,_Module):
150 if __name__==
"__main__":
157 producer = EDProducer(
"Producer")
158 analyzer = EDAnalyzer(
"Analyzer")
159 output = OutputModule(
"Out")
160 filter = EDFilter(
"Filter")
161 unlabeled = EDAnalyzer(
"UnLabeled")
162 producer.setLabel(
"producer")
163 analyzer.setLabel(
"analyzer")
164 output.setLabel(
"output")
165 filter.setLabel(
"filter")
170 p3 =
Path(s1+unlabeled)
171 ep1 = EndPath(producer+output+analyzer)
172 ep2 = EndPath(filter+output)
174 ep4 = EndPath(unlabeled)
177 p1.visit(pathValidator)
178 self.assertRaises(ValueError, p2.visit, pathValidator)
179 self.assertRaises(ValueError, p3.visit, pathValidator)
180 ep1.visit(endpathValidator)
181 ep2.visit(endpathValidator)
182 ep3.visit(endpathValidator)
183 self.assertRaises(ValueError, ep4.visit, endpathValidator)