Support inherited private method names

This commit is contained in:
Andrew Baxter 2019-06-03 20:41:02 +09:00
parent 9af91a26b0
commit bcad8947e8
2 changed files with 22 additions and 3 deletions

View File

@ -81,8 +81,13 @@ def _find_method(obj, func):
if func_self is obj:
name = six.get_method_function(func).__name__
if _is_private_method(name):
classname = obj.__class__.__name__.lstrip('_')
name = '_%s%s' % (classname, name)
qualname = getattr(func, '__qualname__', None)
if qualname is None:
classname = obj.__class__.__name__.lstrip('_')
name = '_%s%s' % (classname, name)
else:
splits = qualname.split('.')
name = '_%s%s' % (splits[-2], splits[-1])
return name
raise ValueError("Function %s is not a method of: %s" % (func, obj))

View File

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
import unittest
import sys
from scrapy.http import Request, FormRequest
from scrapy.spiders import Spider
@ -74,6 +75,14 @@ class RequestSerializationTest(unittest.TestCase):
errback=self.spider.handle_error)
self._assert_serializes_ok(r, spider=self.spider)
def test_mixin_private_callback_serialization(self):
if sys.version_info[0] < 3:
return
r = Request("http://www.example.com",
callback=self.spider._TestSpiderMixin__mixin_callback,
errback=self.spider.handle_error)
self._assert_serializes_ok(r, spider=self.spider)
def test_private_callback_name_matching(self):
self.assertTrue(_is_private_method('__a'))
self.assertTrue(_is_private_method('__a_'))
@ -106,7 +115,12 @@ class RequestSerializationTest(unittest.TestCase):
self.assertRaises(ValueError, request_to_dict, r)
class TestSpider(Spider):
class TestSpiderMixin(object):
def __mixin_callback(self, response):
pass
class TestSpider(Spider, TestSpiderMixin):
name = 'test'
def parse_item(self, response):