def sort(self, sortkey=None, as_text=False, filtered=True, keep=True): """ Returns a sorted list of alarm models valid keys are: * name * device * active (time desc) * severity * receivers * hierarchy * failed """ try: updated = [a for a in self.alarms.values() if a.updated] if len(updated) == len(self.alarms): [ a.get_active() for a in self.alarms.values() if a.active in (1, True) ] else: self.info('sort(): %d alarms not updated yet' % (len(self.alarms) - len(updated))) self.debug('%d alarms, %d filtered, %d updated' % tuple(map(len, (self.alarms, updated, self.filtered)))) #self.lock.acquire() ordered = self.ordered if not keep or not ordered \ or (now()-self.last_sort) > self.get_period(): #self.last_keys = keys or self.last_keys sortkey = sortkey or self.sortkey if isSequence(sortkey): sortkey = lambda a, p=sortkey: self.sortkey(a, priority=p) if filtered: objs = [self.api[f] for f in self.filtered] else: objs = self.alarms.values() ordered = sorted(objs, key=sortkey) if keep: self.ordered = ordered self.debug('sort([%d])' % (len(ordered))) if as_text: kw = fd.isMapping(as_text) and as_text or {} r = list( reversed( [self.get_alarm_as_text(a, **kw) for a in ordered])) else: r = list(reversed([a.get_model() for a in ordered])) self.last_sort = now() return r except: self.error(traceback.format_exc()) finally: #self.lock.release() pass
def test_AlarmDS(device=''): if not device: device = Fn.first( (d for d, v in api.devices.items() if v.ping() is not None), None) Fn.log.info('Testing AlarmDS(%s)' % device) if device: device = api.devices.get(device) assert Fn.isMapping(device.get_active_alarms()) return True
def attributes2json(self, filename, attrs, keep=False, log=False): if not fn.isMapping(attrs): attrs = self.attrs2dict(attrs, keep=keep, log=log) try: if not os.path.exists(os.path.dirname(filename)): try: os.makedirs(os.path.dirname(filename)) except OSError as exc: # Guard against race condition raise json.dump(attrs, open(filename, 'w'), encoding='latin-1') print('%d attributes written to %s' % (len(attrs), filename)) except Exception, e: print('attributes2json(%s) failed!' % filename) failed = 0 for k, v in attrs.items(): try: json.dumps({k: v}, encoding='latin-1') except Exception, ee: failed = 1 print((k, 'cannot be parsed: ', ee))
def test(self, tests=[]): """ Tests would be a list of (name,result,args,kwargs) values """ print('test(', tests, ')') try: tests = tests or self.tests if not fn.isSequence(tests): tests = [tests] passed = 0 if fn.isMapping(tests): tests = [ [k] + list(t if not isMapping(t) else (t.get('result', None), t.get('args', []), t.get('kwargs', []))) for k, t in tests.items() ] for t in tests: t = fn.toList(t) print t t[0] = t[0] t[1] = (t[1:] or [None])[0] t[2] = (t[2:] or [[]])[0] t[3] = (t[3:] or [{}])[0] v = self.test_object(t[0], t[1], *t[2], **t[3]) if v: passed += 1 self.results[t[0]] = v print('-' * 80) for t in tests: v = self.results[fn.toList(t)[0]] print('%s testing: %s : %s' % (self.module, t, ['Failed', 'Ok'][bool(v)])) print('%s : %d / %d tests passed' % (self.module, passed, len(tests))) except: traceback.print_exc() print(tests) return passed
def test(self,tests=[]): """ Tests would be a list of (name,result,args,kwargs) values """ print('test(',tests,')') try: tests = tests or self.tests if not fn.isSequence(tests): tests = [tests] passed = 0 if fn.isMapping(tests): tests = [ [k]+list(t if not isMapping(t) else (t.get('result',None),t.get('args',[]),t.get('kwargs',[])) ) for k,t in tests.items()] for t in tests: t = fn.toList(t) print t t[0] = t[0] t[1] = (t[1:] or [None])[0] t[2] = (t[2:] or [[]])[0] t[3] = (t[3:] or [{}])[0] v = self.test_object(t[0],t[1],*t[2],**t[3]) if v: passed += 1 self.results[t[0]] = v print('-'*80) for t in tests: v = self.results[fn.toList(t)[0]] print('%s testing: %s : %s' % (self.module,t,['Failed','Ok'][bool(v)])) print('%s : %d / %d tests passed'%(self.module,passed,len(tests))) except: traceback.print_exc() print(tests) return passed
def generate_class_properties(filein='ui_attribute_values.pck', all_rw=False): print('generate_class_properties:' + str(filein)) devs = pickle.load(open(filein)) classes = defaultdict(Struct) print('classes in %s are: %s' % (filein, sorted(set(s.dev_class for s in devs.values())))) filters = raw_input( 'Do you want to filter out some classes? [PyStateComposer]' ) or 'PyStateComposer' for d, s in devs.items(): if s.dev_class in filters: continue classes[s.dev_class].attrs = {} classes[s.dev_class].comms = {} classes[s.dev_class].values = defaultdict(set) for d, s in devs.items(): if s.dev_class in filters: continue for a, t in s.attrs.items(): t['datatype'] = t.get('data_type', 'DevDouble') if not isinstance(t, Struct): t = Struct(t) if t.value is not None and not any(x in t.datatype.lower() for x in ('array', )): try: classes[s.dev_class].values[a].add(t.value) except: print d, s.dev_class, a, t for d, s in devs.items(): if s.dev_class in filters: continue #Iterate attributes for a, t in s.attrs.items(): if a.lower() in ('state', 'status'): continue if t.value is None and a in classes[s.dev_class].attrs: continue else: if t.value is None: datatype, formula = 'DevDouble', 'NaN' else: datatype = t.datatype if t.data_format == 'SCALAR' else t.datatype.replace( 'Dev', 'DevVar') + 'Array' if 'bool' in datatype.lower(): formula = DEFAULT_BOOL() elif 'state' in datatype.lower(): formula = DEFAULT_STATE( f='choice(%s or [0])' % list(classes[s.dev_class].values[a])) elif 'string' in datatype.lower(): formula = DEFAULT_STRING( d=d, a=a, f='choice(%s or [0])' % list(classes[s.dev_class].values[a])) elif 'double' in datatype.lower( ) or 'float' in datatype.lower(): formula = DEFAULT_DOUBLE(f=random.choice( list(classes[s.dev_class].values[a]) or [0])) else: formula = DEFAULT_INT( f='choice(%s or [0])' % list(classes[s.dev_class].values[a])) if 'Array' in datatype: formula = "[%s for i in range(10)]" % formula if all_rw or 'WRITE' in t.writable: formula = DEFAULT_WRITE(a=a, f=formula) classes[s.dev_class].attrs[a] = '%s = %s(%s)' % ( a, datatype, formula) #Iterate commands for c, t in s.comms.items(): if fd.isMapping(t): t = t['in_type'], t['out_type'] datatype = t[1] if t[1] != 'DevVoid' else 'DevString' if 'bool' in datatype.lower(): formula = DEFAULT_BOOL() elif 'state' in datatype.lower(): formula = DEFAULT_STATE() elif 'string' in datatype.lower(): formula = DEFAULT_STRING(d=d, a=c) elif 'double' in datatype.lower() or 'float' in datatype.lower(): formula = DEFAULT_DOUBLE() else: formula = DEFAULT_INT() if 'Array' in datatype: formula = "[%s for i in range(10)]" % formula if 'DevVoid' not in t[0]: formula = DEFAULT_ARGS(f=formula) classes[s.dev_class].comms[c] = '%s = %s(%s)' % (c, datatype, formula) classes[s.dev_class].states = DEFAULT_STATES for k, t in classes.items(): print('\nWriting %s attributes ([%d])\n' % (k, len(t.attrs))) f = open('%s_attributes.txt' % k, 'w') for a in sorted(t.attrs.values()): print('%s' % a) f.write('%s\n' % a) f.close() print('\nWriting %s commands ([%d])\n' % (k, len(t.comms))) f = open('%s_commands.txt' % k, 'w') for a in sorted(t.comms.values()): print('%s' % a) f.write('%s\n' % a) f.close() print('\nWriting %s states ([%d])\n' % (k, len(t.states))) f = open('%s_states.txt' % k, 'w') for a in t.states: print('%s' % a) f.write('%s\n' % a) f.close() return (filein)