diff options
Diffstat (limited to 'tests/functional/m/member/member_checks.py')
-rw-r--r-- | tests/functional/m/member/member_checks.py | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/tests/functional/m/member/member_checks.py b/tests/functional/m/member/member_checks.py new file mode 100644 index 000000000..291daee12 --- /dev/null +++ b/tests/functional/m/member/member_checks.py @@ -0,0 +1,233 @@ +# pylint: disable=print-statement,missing-docstring,no-self-use,too-few-public-methods,bare-except,broad-except, useless-object-inheritance +# pylint: disable=using-constant-test,expression-not-assigned, assigning-non-slot, unused-variable,pointless-statement, wrong-import-order, wrong-import-position,import-outside-toplevel +from __future__ import print_function +class Provider(object): + """provide some attributes and method""" + cattr = 4 + def __init__(self): + self.attr = 4 + def method(self, val): + """impressive method""" + return self.attr * val + def hophop(self): + """hop method""" + print('hop hop hop', self) + + +class Client(object): + """use provider class""" + + def __init__(self): + self._prov = Provider() + self._prov_attr = Provider.cattr + self._prov_attr2 = Provider.cattribute # [no-member] + self.set_later = 0 + + def set_set_later(self, value): + """set set_later attribute (introduce an inference ambiguity)""" + self.set_later = value + + def use_method(self): + """use provider's method""" + self._prov.hophop() + self._prov.hophophop() # [no-member] + + def use_attr(self): + """use provider's attr""" + print(self._prov.attr) + print(self._prov.attribute) # [no-member] + + def debug(self): + """print debug information""" + print(self.__class__.__name__) + print(self.__doc__) + print(self.__dict__) + print(self.__module__) + + def test_bt_types(self): + """test access to unexistant member of builtin types""" + lis = [] + lis.apppend(self) # [no-member] + dic = {} + dic.set(self) # [no-member] + tup = () + tup.append(self) # [no-member] + string = 'toto' + print(string.loower()) # [no-member] + integer = 1 + print(integer.whatever) # [no-member] + + def test_no_false_positives(self): + none = None + print(none.whatever) + # No misssing in the parents. + super().misssing() # [no-member] + + +class Mixin(object): + """No no-member should be emitted for mixins.""" + +class Getattr(object): + """no-member shouldn't be emitted for classes with dunder getattr.""" + + def __getattr__(self, attr): + return self.__dict__[attr] + + +class Getattribute(object): + """no-member shouldn't be emitted for classes with dunder getattribute.""" + + def __getattribute__(self, attr): + return 42 + +print(object.__init__) +print(property.__init__) +print(Client().set_later.lower()) +print(Mixin().nanana()) +print(Getattr().nananan()) +print(Getattribute().batman()) + +try: + Client().missing_method() +except AttributeError: + pass + +try: + Client().indeed() # [no-member] +except ImportError: + pass + +try: + Client.missing() +except AttributeError: + Client.missing() # [no-member] + +try: + Client.missing() +except AttributeError: + try: + Client.missing() # [no-member] + except ValueError: + pass + +try: + if Client: + Client().missing() +except AttributeError: + pass + +try: + Client().indeed() +except AttributeError: + try: + Client.missing() # [no-member] + except Exception: + pass + + +class SuperChecks(str, str): # pylint: disable=duplicate-bases + """Don't fail when the MRO is invalid.""" + def test(self): + super().lalala() + +type(Client()).ala # [no-member] +type({}).bala # [no-member] +type('').portocala # [no-member] + + +def socket_false_positive(): + """Test a regression + Version used: + + - Pylint 0.10.0 + - Logilab common 0.15.0 + - Logilab astroid 0.15.1 + + False E1101 positive, line 23: + Instance of '_socketobject' has no 'connect' member + """ + + import socket + sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sckt.connect(('127.0.0.1', 80)) + sckt.close() + + +def no_conjugate_member(magic_flag): + """should not raise E1101 on something.conjugate""" + if magic_flag: + something = 1.0 + else: + something = 1.0j + if isinstance(something, float): + return something + return something.conjugate() + + +class NoDunderNameInInstance(object): + """Emit a warning when accessing __name__ from an instance.""" + def __init__(self): + self.var = self.__name__ # [no-member] + + +class InvalidAccessBySlots(object): + __slots__ = ('a', ) + def __init__(self): + var = self.teta # [no-member] + self.teta = 24 + + +class MetaWithDynamicGetattr(type): + + def __getattr__(cls, attr): + return attr + + +class SomeClass(object, metaclass=MetaWithDynamicGetattr): + pass + + +SomeClass.does_not_exist + +class ClassWithMangledAttribute(object): + def __init__(self): + self.name = 'Bug1643' + def __bar(self): + print(self.name + "xD") + +ClassWithMangledAttribute()._ClassWithMangledAttribute__bar() # pylint: disable=protected-access + + +import enum + + +class Cls(enum.IntEnum): + BAR = 0 + + +SOME_VALUE = Cls.BAZ # [no-member] + + + +# Does not crash when inferring the `append` attribute on the slice object +class SomeClassUsingSlice: + def __init__(self, flag): + if flag: + self.attribute = slice(None) + else: + self.attribute = [] + self.attribute.append(1) + +from enum import Enum +class Animal(Enum): + ANT = 1 + BEE = 2 + CAT = 3 + DOG = 4 +# To test false positive no-member on Enum.__members__.items() +for itm in Animal.__members__.items(): + print(itm) +for keyy in Animal.__members__.keys: + print(keyy) +for vall in Animal.__members__.values: + print(vall) |