From 01d948f0fd792c3700306efe1bd38ae2163cb042 Mon Sep 17 00:00:00 2001
From: Elias Dorneles
Date: Tue, 4 Aug 2015 16:28:02 -0300
Subject: [PATCH] remove selector support for LxmlDocument DOM cache and add
deprecation warning for _root argument
---
scrapy/selector/unified.py | 20 +++++++++-----------
tests/test_selector.py | 11 +++++++++++
2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/scrapy/selector/unified.py b/scrapy/selector/unified.py
index 9e0716671..db2a8510a 100644
--- a/scrapy/selector/unified.py
+++ b/scrapy/selector/unified.py
@@ -2,13 +2,13 @@
XPath selectors based on lxml
"""
+import warnings
+from parsel import Selector as ParselSelector, SelectorList
from scrapy.utils.trackref import object_ref
from scrapy.utils.python import to_bytes
from scrapy.http import HtmlResponse, XmlResponse
from scrapy.utils.decorators import deprecated
-from parsel import Selector as ParselSelector, SelectorList
-from parsel.unified import _ctgroup
-from .lxmldocument import LxmlDocument
+from scrapy.exceptions import ScrapyDeprecationWarning
__all__ = ['Selector', 'SelectorList']
@@ -33,22 +33,21 @@ class Selector(ParselSelector, object_ref):
__slots__ = ['response']
- def __init__(self, response=None, text=None, type=None, root=None, **kwargs):
+ def __init__(self, response=None, text=None, type=None, root=None, _root=None, **kwargs):
st = _st(response, type or self._default_type)
- # supporting legacy _root argument
- root = kwargs.get('_root', root)
-
- self._parser = _ctgroup[st]['_parser']
+ if root is None and _root is not None:
+ warnings.warn("Argument `_root` is deprecated, use `root` instead",
+ ScrapyDeprecationWarning, stacklevel=2)
+ root = _root
if text is not None:
response = _response_from_text(text, st)
if response is not None:
- root = LxmlDocument(response, self._parser)
+ text = response.body_as_unicode()
self.response = response
- text = response.body_as_unicode() if response else None
super(Selector, self).__init__(text=text, type=st, root=root, **kwargs)
# Deprecated api
@@ -59,4 +58,3 @@ class Selector(ParselSelector, object_ref):
@deprecated(use_instead='.extract()')
def extract_unquoted(self):
return self.extract()
-
diff --git a/tests/test_selector.py b/tests/test_selector.py
index 02f82298c..dd27ae7da 100644
--- a/tests/test_selector.py
+++ b/tests/test_selector.py
@@ -7,6 +7,8 @@ from scrapy.exceptions import ScrapyDeprecationWarning
from scrapy.http import TextResponse, HtmlResponse, XmlResponse
from scrapy.selector import Selector
from scrapy.selector.lxmlsel import XmlXPathSelector, HtmlXPathSelector, XPathSelector
+from lxml import etree
+from tests import mock
class SelectorTestCase(unittest.TestCase):
@@ -37,6 +39,15 @@ class SelectorTestCase(unittest.TestCase):
self.assertEqual([x.extract() for x in sel.xpath("concat(//input[@name='a']/@value, //input[@name='b']/@value)")],
[u'12'])
+ @mock.patch('scrapy.selector.unified.warnings')
+ def test_deprecated_root_argument(self, warnings):
+ root = etree.fromstring(u'')
+ sel = self.sscls(_root=root)
+ self.assertEqual(root, sel._root)
+ warnings.warn.assert_called_once_with(
+ 'Argument `_root` is deprecated, use `root` instead',
+ mock.ANY, stacklevel=2)
+
def test_representation_slice(self):
body = u"
".format(50 * 'b')
response = TextResponse(url="http://example.com", body=body, encoding='utf8')