Skip to content

Commit 9a00b63

Browse files
committed
move test utilies into scrapy_poet/utils/
1 parent 213549a commit 9a00b63

File tree

10 files changed

+79
-71
lines changed

10 files changed

+79
-71
lines changed

scrapy_poet/utils.py

Lines changed: 0 additions & 45 deletions
This file was deleted.

tests/utils.py renamed to scrapy_poet/utils/__init__.py

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
from inspect import isasyncgenfunction
23
from typing import Dict
34
from unittest import mock
@@ -6,30 +7,57 @@
67
from scrapy import signals
78
from scrapy.crawler import Crawler
89
from scrapy.exceptions import CloseSpider
10+
from scrapy.http import Request, Response
911
from scrapy.settings import Settings
12+
from scrapy.utils.project import inside_project, project_data_dir
1013
from scrapy.utils.python import to_bytes
1114
from twisted.internet import reactor
1215
from twisted.internet.task import deferLater
1316
from twisted.web.resource import Resource
1417
from twisted.web.server import NOT_DONE_YET
18+
from web_poet import HttpRequest, HttpResponse, HttpResponseHeaders
1519

16-
from tests.mockserver import MockServer
20+
from scrapy_poet.utils.mockserver import MockServer
1721

1822

19-
def create_scrapy_settings(request):
20-
"""Default scrapy-poet settings"""
21-
s = dict(
22-
# collect scraped items to crawler.spider.collected_items
23-
ITEM_PIPELINES={
24-
"tests.utils.CollectorPipeline": 100,
25-
},
26-
DOWNLOADER_MIDDLEWARES={
27-
# collect injected dependencies to crawler.spider.collected_response_deps
28-
"tests.utils.InjectedDependenciesCollectorMiddleware": 542,
29-
"scrapy_poet.InjectionMiddleware": 543,
30-
},
23+
def get_scrapy_data_path(createdir: bool = True, default_dir: str = ".scrapy") -> str:
24+
"""Return a path to a folder where Scrapy is storing data.
25+
26+
Usually that's a .scrapy folder inside the project.
27+
"""
28+
# This code is extracted from scrapy.utils.project.data_path function,
29+
# which does too many things.
30+
path = project_data_dir() if inside_project() else default_dir
31+
if createdir:
32+
os.makedirs(path, exist_ok=True)
33+
return path
34+
35+
36+
def http_request_to_scrapy_request(request: HttpRequest, **kwargs) -> Request:
37+
return Request(
38+
url=str(request.url),
39+
method=request.method,
40+
headers=request.headers,
41+
body=request.body,
42+
**kwargs,
43+
)
44+
45+
46+
def scrapy_response_to_http_response(response: Response) -> HttpResponse:
47+
"""Convenience method to convert a ``scrapy.http.Response`` into a
48+
``web_poet.HttpResponse``.
49+
"""
50+
kwargs = {}
51+
encoding = getattr(response, "_encoding", None)
52+
if encoding:
53+
kwargs["encoding"] = encoding
54+
return HttpResponse(
55+
url=response.url,
56+
body=response.body,
57+
status=response.status,
58+
headers=HttpResponseHeaders.from_bytes_dict(response.headers),
59+
**kwargs,
3160
)
32-
return Settings(s)
3361

3462

3563
class HtmlResource(Resource):
@@ -161,6 +189,22 @@ def process_response(self, request, response, spider):
161189
return response
162190

163191

192+
def create_scrapy_settings(request):
193+
"""Default scrapy-poet settings"""
194+
s = dict(
195+
# collect scraped items to crawler.spider.collected_items
196+
ITEM_PIPELINES={
197+
CollectorPipeline: 100,
198+
},
199+
DOWNLOADER_MIDDLEWARES={
200+
# collect injected dependencies to crawler.spider.collected_response_deps
201+
InjectedDependenciesCollectorMiddleware: 542,
202+
"scrapy_poet.InjectionMiddleware": 543,
203+
},
204+
)
205+
return Settings(s)
206+
207+
164208
def capture_exceptions(callback):
165209
"""Wrapper for Scrapy callbacks that captures exceptions within
166210
the provided callback and yields it under `exception` property. Also

tests/mockserver.py renamed to scrapy_poet/utils/mockserver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def __enter__(self):
2929
sys.executable,
3030
"-u",
3131
"-m",
32-
"tests.mockserver",
32+
"scrapy_poet.utils.mockserver",
3333
self.resource,
3434
"--port",
3535
str(self.port),

tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from tests.utils import create_scrapy_settings
3+
from scrapy_poet.utils import create_scrapy_settings
44

55

66
@pytest.fixture()

tests/test_downloader.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515
from web_poet.pages import WebPage
1616

1717
from scrapy_poet.downloader import create_scrapy_downloader
18-
from scrapy_poet.utils import http_request_to_scrapy_request
19-
from tests.utils import (
18+
from scrapy_poet.utils import (
2019
AsyncMock,
2120
DelayedResource,
2221
EchoResource,
23-
MockServer,
2422
StatusResource,
23+
http_request_to_scrapy_request,
2524
make_crawler,
2625
)
26+
from scrapy_poet.utils.mockserver import MockServer
2727

2828

2929
@pytest.fixture

tests/test_middleware.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,13 @@
1717
from scrapy_poet import DummyResponse, InjectionMiddleware, callback_for
1818
from scrapy_poet.cache import SqlitedictCache
1919
from scrapy_poet.page_input_providers import PageObjectInputProvider
20-
from tests.mockserver import get_ephemeral_port
21-
from tests.utils import HtmlResource, capture_exceptions, crawl_items, crawl_single_item
20+
from scrapy_poet.utils import (
21+
HtmlResource,
22+
capture_exceptions,
23+
crawl_items,
24+
crawl_single_item,
25+
)
26+
from scrapy_poet.utils.mockserver import get_ephemeral_port
2227

2328

2429
class ProductHtml(HtmlResource):

tests/test_providers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
PageObjectInputProvider,
2020
PageParamsProvider,
2121
)
22-
from tests.utils import AsyncMock, HtmlResource, crawl_single_item
22+
from scrapy_poet.utils import AsyncMock, HtmlResource, crawl_single_item
2323

2424

2525
class ProductHtml(HtmlResource):

tests/test_retries.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from web_poet.exceptions import Retry
66
from web_poet.pages import WebPage
77

8-
from tests.utils import EchoResource, MockServer, make_crawler
8+
from scrapy_poet.utils import EchoResource, MockServer, make_crawler
99

1010

1111
class BaseSpider(Spider):

tests/test_scrapy_dependencies.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
HttpResponseProvider,
1111
PageObjectInputProvider,
1212
)
13-
from tests.utils import HtmlResource, crawl_items, crawl_single_item
13+
from scrapy_poet.utils import HtmlResource, crawl_items, crawl_single_item
1414

1515

1616
class ProductHtml(HtmlResource):

tests/test_web_poet_rules.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,13 @@
2828

2929
from scrapy_poet import callback_for
3030
from scrapy_poet.downloadermiddlewares import DEFAULT_PROVIDERS
31-
from tests.mockserver import get_ephemeral_port
31+
from scrapy_poet.utils import (
32+
capture_exceptions,
33+
crawl_single_item,
34+
create_scrapy_settings,
35+
)
36+
from scrapy_poet.utils.mockserver import get_ephemeral_port
3237
from tests.test_middleware import ProductHtml
33-
from tests.utils import capture_exceptions, crawl_single_item, create_scrapy_settings
3438

3539
DOMAIN = get_domain(socket.gethostbyname(socket.gethostname()))
3640
PORT = get_ephemeral_port()

0 commit comments

Comments
 (0)