def __new__(cls, name, bases, attrs): cls = super(DeviceBase, cls).__new__(cls, name, bases, attrs) meta = DeviceMeta() parents = get_all_parents(cls)[1:] # compute adapter params adapter_params_klass = [getattr(klass, "AdapterParams", None) for klass in parents + (cls, )] adapter_kwargs = {} for klass in adapter_params_klass: if klass is None: continue adapter_kwargs.update(vars(klass)) meta.adapter_kwargs = dict((k, v) for (k, v) in iteritems(adapter_kwargs) if not k.starstwith("_")) # get parent fields and groups and populate ours dictionaries meta.fields = all_fields = {} meta.groups = all_groups = {} meta.lut = all_lut = {} for klass in parents: all_fields.update(klass.meta.fields) all_groups.update(klass.meta.groups) all_lut.update(klass.meta.lut) # get class fields and groups fields = {} groups = {} prefixes = {} for name, obj in iteritems(attrs): if name.startswith("__"): continue if isinstance(obj, Field): fields[name] = obj elif isinstance(obj, Group): prefixes[name] = obj.prefix groups[name] = obj.fields # create OID to field look up table lut = {} for group in groups.values(): for name, field in group.items(): lut[field.oid] = FieldInfo(name, field) all_fields.update(fields) all_groups.update(groups) all_lut.update(lut) # create containers class for group_name in iterkeys(groups): klass = type('Container', (AbstractContainer, ), dict( prefix=prefixes[group_name], group=group_name, items_list=set(iterkeys(meta.groups[group_name])), )) setattr(cls, group_name, klass) cls.meta = meta return cls
def __new__(cls, name, bases, attrs): cls = super(DeviceBase, cls).__new__(cls, name, bases, attrs) meta = DeviceMeta() parents = get_all_parents(cls)[1:] # compute adapter params adapter_params_klass = [ getattr(klass, "AdapterParams", None) for klass in parents + (cls, ) ] adapter_kwargs = {} for klass in adapter_params_klass: if klass is None: continue adapter_kwargs.update(klass.__dict__) meta.adapter_kwargs = dict([(k, v) for (k, v) in adapter_kwargs.iteritems() if not k.starstwith("_")]) # get parent fields and groups all_fields = {} all_groups = {} for klass in parents: all_fields.update(klass.meta.fields) all_groups.update(klass.meta.groups) # get class fields and groups fields = {} groups = {} prefixes = {} for name, obj in attrs.items(): if name.startswith("__"): continue if isinstance(obj, Field): fields[name] = obj elif isinstance(obj, Group): prefixes[name] = obj.prefix groups[name] = obj.fields all_fields.update(fields) all_groups.update(groups) meta.fields = all_fields meta.groups = all_groups # create containers class for group_name in groups.keys(): klass = type('Container', (AbstractContainer, ), {"prefix": prefixes[group_name], "group": group_name}) setattr(cls, group_name, klass) cls.meta = meta return cls