From 5adacc4dde1ae0dff866803c6d437ebcb4db2730 Mon Sep 17 00:00:00 2001 From: Mikhail Korobov Date: Fri, 17 Feb 2017 02:35:02 +0500 Subject: [PATCH] fixed method override check in Python 2 --- scrapy/spiders/__init__.py | 3 ++- scrapy/utils/deprecate.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/scrapy/spiders/__init__.py b/scrapy/spiders/__init__.py index 80768b1b0..30cb7590a 100644 --- a/scrapy/spiders/__init__.py +++ b/scrapy/spiders/__init__.py @@ -12,6 +12,7 @@ from scrapy.utils.trackref import object_ref from scrapy.utils.url import url_is_from_spider from scrapy.utils.deprecate import create_deprecated_class from scrapy.exceptions import ScrapyDeprecationWarning +from scrapy.utils.deprecate import method_is_overridden class Spider(object_ref): @@ -67,7 +68,7 @@ class Spider(object_ref): def start_requests(self): cls = self.__class__ - if cls.make_requests_from_url is not Spider.make_requests_from_url: + if method_is_overridden(cls, Spider, 'make_requests_from_url'): warnings.warn( "Spider.make_requests_from_url method is deprecated; it " "won't be called in future Scrapy releases. Please " diff --git a/scrapy/utils/deprecate.py b/scrapy/utils/deprecate.py index 0fc33e0c4..7ab39c97e 100644 --- a/scrapy/utils/deprecate.py +++ b/scrapy/utils/deprecate.py @@ -156,3 +156,35 @@ def update_classpath(path): ScrapyDeprecationWarning) return new_path return path + + +def method_is_overridden(subclass, base_class, method_name): + """ + Return True if a method named ``method_name`` of a ``base_class`` + is overridden in a ``subclass``. + + >>> class Base(object): + ... def foo(self): + ... pass + >>> class Sub1(Base): + ... pass + >>> class Sub2(Base): + ... def foo(self): + ... pass + >>> class Sub3(Sub1): + ... def foo(self): + ... pass + >>> class Sub4(Sub2): + ... pass + >>> method_is_overridden(Sub1, Base, 'foo') + False + >>> method_is_overridden(Sub2, Base, 'foo') + True + >>> method_is_overridden(Sub3, Base, 'foo') + True + >>> method_is_overridden(Sub4, Base, 'foo') + True + """ + base_method = getattr(base_class, method_name) + sub_method = getattr(subclass, method_name) + return base_method.__code__ is not sub_method.__code__