コード例 #1
0
ファイル: base.py プロジェクト: blackwithwhite666/snmp_orm
    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
コード例 #2
0
ファイル: abstract.py プロジェクト: carmackjia/snmp_orm
 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