From f39733f3419f77e300423241667a9b5b86ff77be Mon Sep 17 00:00:00 2001 From: TH3CHARLie Date: Tue, 3 Dec 2019 22:42:55 +0800 Subject: [PATCH 1/2] split @abstractproperty into @property and @abstractmethod --- mypy/stubgen.py | 16 ++++++++++++---- test-data/unit/stubgen.test | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/mypy/stubgen.py b/mypy/stubgen.py index 214dc7763819..1b59061b237f 100755 --- a/mypy/stubgen.py +++ b/mypy/stubgen.py @@ -647,11 +647,14 @@ def process_name_expr_decorator(self, expr: NameExpr, context: Decorator) -> boo 'asyncio.coroutines', 'types'): self.add_coroutine_decorator(context.func, name, name) - elif any(self.refers_to_fullname(name, target) - for target in ('abc.abstractmethod', 'abc.abstractproperty')): + elif self.refers_to_fullname(name, 'abc.abstractmethod'): self.add_decorator(name) self.import_tracker.require_name(name) is_abstract = True + elif self.refers_to_fullname(name, 'abc.abstractproperty'): + self.add_decorator('property') + self.add_decorator('abc.abstractmethod') + is_abstract = True return is_abstract def refers_to_fullname(self, name: str, fullname: str) -> bool: @@ -674,8 +677,13 @@ def process_member_expr_decorator(self, expr: MemberExpr, context: Decorator) -> (expr.expr.name == 'abc' or self.import_tracker.reverse_alias.get('abc')) and expr.name in ('abstractmethod', 'abstractproperty')): - self.import_tracker.require_name(expr.expr.name) - self.add_decorator('%s.%s' % (expr.expr.name, expr.name)) + if expr.name == 'abstractproperty': + self.import_tracker.require_name(expr.expr.name) + self.add_decorator('%s' % ('property')) + self.add_decorator('%s.%s' % (expr.expr.name, 'abstractmethod')) + else: + self.import_tracker.require_name(expr.expr.name) + self.add_decorator('%s.%s' % (expr.expr.name, expr.name)) is_abstract = True elif expr.name == 'coroutine': if (isinstance(expr.expr, MemberExpr) and diff --git a/test-data/unit/stubgen.test b/test-data/unit/stubgen.test index 409a31064530..d6eb83cd3c86 100644 --- a/test-data/unit/stubgen.test +++ b/test-data/unit/stubgen.test @@ -1638,11 +1638,11 @@ class A: [out] import abc -from abc import abstractproperty from typing import Any class A(metaclass=abc.ABCMeta): - @abstractproperty + @property + @abc.abstractmethod def x(self) -> Any: ... [case testClassWithNameAnyOrOptional] @@ -2153,3 +2153,31 @@ from collections import namedtuple class C: N = namedtuple('N', ['x', 'y']) + +[case testSplitAbstractPropertyUsingAlias] +from abc import abstractproperty as alias_name +class A: + @alias_name + def x(self): pass +[out] +import abc +from typing import Any + +class A(metaclass=abc.ABCMeta): + @property + @abc.abstractmethod + def x(self) -> Any: ... + +[case testSplitAbstractPropertyUsingMemberExpr] +import abc +class A: + @abc.abstractproperty + def x(self): pass +[out] +import abc +from typing import Any + +class A(metaclass=abc.ABCMeta): + @property + @abc.abstractmethod + def x(self) -> Any: ... From a373ddd9b144d8da0d2e70d30b79ded2b616acde Mon Sep 17 00:00:00 2001 From: TH3CHARLie Date: Tue, 3 Dec 2019 23:39:49 +0800 Subject: [PATCH 2/2] fix test --- test-data/unit/stubgen.test | 48 +++++++++++++++---------------------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/test-data/unit/stubgen.test b/test-data/unit/stubgen.test index d6eb83cd3c86..f201e3dcb3f7 100644 --- a/test-data/unit/stubgen.test +++ b/test-data/unit/stubgen.test @@ -1625,7 +1625,8 @@ import abc from typing import Any class A(metaclass=abc.ABCMeta): - @abc.abstractproperty + @property + @abc.abstractmethod def x(self) -> Any: ... [case testAbstractProperty2_semanal] @@ -1640,6 +1641,23 @@ class A: import abc from typing import Any +class A(metaclass=abc.ABCMeta): + @property + @abc.abstractmethod + def x(self) -> Any: ... + +[case testAbstractProperty3_semanal] +import other +from abc import abstractproperty as alias_name + +class A: + @alias_name + def x(self): pass + +[out] +import abc +from typing import Any + class A(metaclass=abc.ABCMeta): @property @abc.abstractmethod @@ -2153,31 +2171,3 @@ from collections import namedtuple class C: N = namedtuple('N', ['x', 'y']) - -[case testSplitAbstractPropertyUsingAlias] -from abc import abstractproperty as alias_name -class A: - @alias_name - def x(self): pass -[out] -import abc -from typing import Any - -class A(metaclass=abc.ABCMeta): - @property - @abc.abstractmethod - def x(self) -> Any: ... - -[case testSplitAbstractPropertyUsingMemberExpr] -import abc -class A: - @abc.abstractproperty - def x(self): pass -[out] -import abc -from typing import Any - -class A(metaclass=abc.ABCMeta): - @property - @abc.abstractmethod - def x(self) -> Any: ...