On 2016-01-19 13:43, Martin Basti wrote:
> +
> +def fake_class(name_or_class_obj, members=[]):

Please use a non-mutable argument here. members=() will do the job just
fine.

> +    if isinstance(name_or_class_obj, scoped_nodes.Class):
> +        cl = name_or_class_obj
> +    else:
> +        cl = scoped_nodes.Class(name_or_class_obj, None)
> +
> +    for m in members:
> +        if isinstance(m, str):
> +            if m in cl.locals:
> +                _warning_already_exists(cl, m)
> +            else:
> +                cl.locals[m] = [scoped_nodes.Class(m, None)]
> +        elif isinstance(m, dict):
> +            for key, val in m.items():
> +                assert isinstance(key, str), "key must be string"
> +                if key in cl.locals:
> +                    _warning_already_exists(cl, key)
> +                    fake_class(cl.locals[key], val)
> +                else:
> +                    cl.locals[key] = [fake_class(key, val)]
> +        else:
> +            # here can be used any astroid type
> +            if m.name in cl.locals:
> +                _warning_already_exists(cl, m.name)
> +            else:
> +                cl.locals[m.name] = [copy.copy(m)]
> +    return cl

...

> +ipa_class_members = {
> +    # Python standard library & 3rd party classes
> +    'socket._socketobject': ['sendall'],
> +# !!!    'datetime.tzinfo': ['houroffset', 'minoffset', 'utcoffset', 'dst'],
> +# !!!    'nss.nss.subject_public_key_info': ['public_key'],
> +
> +    # IPA classes
> +    'ipalib.base.NameSpace': [
> +        'add',
> +        'mod',
> +        'del',
> +        'show',
> +        'find'
> +    ],
> +    'ipalib.cli.Collector': ['__options'],
> +    'ipalib.config.Env': [
> +        {'__d': ['get']},
> +        {'__done': ['add']},
> +        'xmlrpc_uri',
> +        'validate_api',
> +        'startup_traceback',
> +        'verbose'
> +    ] + LOGGING_ATTRS,

The rules for __options, __d and __done may lead to false detection.
Class member and attribute names with leading double underscore are
mangled, so Collector.__options is turned into __Collector_options.
self.__options works because it's also mangled. But from other classes,
the attribute must be referred to as __Collector_options.

Christian


Attachment: signature.asc
Description: OpenPGP digital signature

-- 
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code

Reply via email to