Skip to content

Commit d780b2e

Browse files
committed
parser: s/http_accept/accept/. #307
1 parent 5ac548c commit d780b2e

File tree

9 files changed

+51
-56
lines changed

9 files changed

+51
-56
lines changed

CHANGES.rst

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@ Version 3.15
1111

1212
Unreleased
1313

14-
* Update the parser API to expose HTTP information to the updater. (:issue:`307`)
14+
* Update the (unstable) parser API to expose HTTP information to the updater,
15+
plus additional clean-ups. (:issue:`307`)
1516

16-
.. note::
17-
18-
The (unstable) :class:`.RetrieverType` protocol used by retrievers changed.
19-
20-
* Allow retrievers to store arbitrary caching data via
21-
:attr:`.RetrievedFeed.caching_info`.
17+
* The :class:`.RetrieverType` protocol used by retrievers changed
18+
(new return type, allow storing arbitrary caching data via
19+
:attr:`~.RetrievedFeed.caching_info`).
20+
* The ``HTTPAcceptParserType`` was renamed to :class:`.AcceptParserType`.
2221

2322

2423
Version 3.14

docs/internal.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Protocols
7070
:members:
7171
:special-members: __call__
7272

73-
.. autoclass:: HTTPAcceptParserType
73+
.. autoclass:: AcceptParserType
7474
:members:
7575
:show-inheritance:
7676

src/reader/_parser/__init__.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,13 @@ def mount_retriever(self, prefix: str, retriever: RetrieverType[Any]) -> None:
146146
self._lazy_call('mount_retriever', prefix, retriever)
147147

148148
def mount_parser_by_mime_type(
149-
self, parser: ParserType[Any], http_accept: str | None = None
149+
self, parser: ParserType[Any], accept: str | None = None
150150
) -> None:
151151
# duplicate Parser check (fail early)
152-
if not http_accept: # pragma: no cover
153-
if not isinstance(parser, HTTPAcceptParserType):
154-
raise TypeError("unaware parser type with no http_accept given")
155-
self._lazy_call('mount_parser_by_mime_type', parser, http_accept)
152+
if not accept: # pragma: no cover
153+
if not isinstance(parser, AcceptParserType):
154+
raise TypeError("unaware parser type with no accept given")
155+
self._lazy_call('mount_parser_by_mime_type', parser, accept)
156156

157157
def mount_parser_by_url(self, url: str, parser: ParserType[Any]) -> None:
158158
self._lazy_call('mount_parser_by_url', url, parser)
@@ -263,19 +263,15 @@ class RetrieverType(Protocol[T_co]): # pragma: no cover
263263
"""A callable that knows how to retrieve a feed."""
264264

265265
def __call__(
266-
self,
267-
url: str,
268-
caching_info: JSONType | None,
269-
# FIXME also s/http_accept/accept/
270-
http_accept: str | None,
266+
self, url: str, caching_info: JSONType | None, accept: str | None
271267
) -> ContextManager[RetrievedFeed[T_co] | T_co]:
272268
"""Retrieve a feed.
273269
274270
Args:
275271
feed (str): The feed URL.
276272
caching_info (JSONType or None):
277273
:attr:`~RetrievedFeed.caching_info` from the last update.
278-
http_accept (str or None):
274+
accept (str or None):
279275
Content types to be retrieved, as an HTTP ``Accept`` header.
280276
281277
Returns:
@@ -380,11 +376,11 @@ def __call__(
380376

381377

382378
@runtime_checkable
383-
class HTTPAcceptParserType(ParserType[T_cv], Protocol): # pragma: no cover
384-
"""A :class:`ParserType` that knows what content it can handle."""
379+
class AcceptParserType(ParserType[T_cv], Protocol): # pragma: no cover
380+
"""A :class:`ParserType` that knows what content types it can handle."""
385381

386382
@property
387-
def http_accept(self) -> str:
383+
def accept(self) -> str:
388384
"""The content types this parser supports,
389385
as an ``Accept`` HTTP header value.
390386

src/reader/_parser/_lazy.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
from ..exceptions import InvalidFeedURLError
1818
from ..exceptions import ParseError
1919
from ..types import JSONType
20+
from . import AcceptParserType
2021
from . import EntryPair
2122
from . import EntryPairsParserType
2223
from . import F
2324
from . import FeedForUpdateRetrieverType
24-
from . import HTTPAcceptParserType
2525
from . import NotModified
2626
from . import ParsedFeed
2727
from . import ParseResult
@@ -201,32 +201,32 @@ def retrieve(
201201
"""
202202
parser = self.get_parser_by_url(url)
203203

204-
http_accept: str | None
204+
accept: str | None
205205
if not parser:
206-
http_accept = unparse_accept_header(
206+
accept = unparse_accept_header(
207207
(mime_type, quality)
208208
for mime_type, parsers in self.parsers_by_mime_type.items()
209209
for quality, _ in parsers
210210
)
211211
else:
212212
# URL parsers get the default session / requests Accept (*/*);
213-
# later, we may use parser.http_accept, if it exists, but YAGNI
214-
http_accept = None
213+
# later, we may use parser.accept, if it exists, but YAGNI
214+
accept = None
215215

216216
retriever = self.get_retriever(url)
217217

218-
return self._retrieve(retriever, url, caching_info, http_accept)
218+
return self._retrieve(retriever, url, caching_info, accept)
219219

220220
@contextmanager
221221
def _retrieve(
222222
self,
223223
retriever: RetrieverType[Any],
224224
url: str,
225225
caching_info: JSONType | None,
226-
http_accept: str | None,
226+
accept: str | None,
227227
) -> Iterator[RetrievedFeed[Any]]:
228228
with wrap_exceptions(url, 'during retriever'):
229-
context = retriever(url, caching_info, http_accept)
229+
context = retriever(url, caching_info, accept)
230230
with context as feed:
231231
if not isinstance(feed, RetrievedFeed):
232232
feed = RetrievedFeed(feed)
@@ -413,31 +413,31 @@ def get_retriever(self, url: str) -> RetrieverType[Any]:
413413
raise ParseError(url, message="no retriever for URL")
414414

415415
def mount_parser_by_mime_type(
416-
self, parser: ParserType[Any], http_accept: str | None = None
416+
self, parser: ParserType[Any], accept: str | None = None
417417
) -> None:
418418
"""Register a parser to one or more MIME types.
419419
420420
Args:
421421
parser (ParserType): The parser.
422-
http_accept (str or None):
422+
accept (str or None):
423423
The content types the parser supports,
424-
as an ``Accept`` HTTP header value.
424+
as an HTTP ``Accept`` header.
425425
If not given, use the parser's
426-
:attr:`~HTTPAcceptParserType.http_accept` attribute,
426+
:attr:`~AcceptParserType.accept` attribute,
427427
if it has one.
428428
429429
Raises:
430430
TypeError: The parser does not have an
431-
:attr:`~HTTPAcceptParserType.http_accept` attribute,
432-
and no ``http_accept`` was given.
431+
:attr:`~AcceptParserType.accept` attribute,
432+
and no ``accept`` was given.
433433
434434
"""
435-
if not http_accept:
436-
if not isinstance(parser, HTTPAcceptParserType):
437-
raise TypeError("unaware parser type with no http_accept given")
438-
http_accept = parser.http_accept
435+
if not accept:
436+
if not isinstance(parser, AcceptParserType):
437+
raise TypeError("unaware parser type with no accept given")
438+
accept = parser.accept
439439

440-
for mime_type, quality in parse_accept_header(http_accept):
440+
for mime_type, quality in parse_accept_header(accept):
441441
if not quality:
442442
continue
443443

src/reader/_parser/feedparser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
class FeedparserParser:
3232
# The wildcard gets added back explicitly later on.
33-
http_accept = unparse_accept_header(
33+
accept = unparse_accept_header(
3434
(v, q)
3535
for v, q in parse_accept_header(feedparser.http.ACCEPT_HEADER)
3636
if v != '*/*'

src/reader/_parser/http.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def __call__(
4343
self,
4444
url: str,
4545
caching_info: Any = None,
46-
http_accept: str | None = None,
46+
accept: str | None = None,
4747
) -> Iterator[RetrievedFeed[IO[bytes]]]:
4848
request_headers = {
4949
# https://tools.ietf.org/html/rfc3229#section-10.5.3
@@ -52,8 +52,8 @@ def __call__(
5252
# https://www.ctrl.blog/entry/feed-caching.html
5353
'A-IM': 'feed',
5454
}
55-
if http_accept:
56-
request_headers['Accept'] = http_accept
55+
if accept:
56+
request_headers['Accept'] = accept
5757

5858
error = RetrieveError(url)
5959

src/reader/_parser/jsonfeed.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
class JSONFeedParser:
2828
"""https://jsonfeed.org/version/1.1"""
2929

30-
http_accept = 'application/feed+json,application/json;q=0.9'
30+
accept = 'application/feed+json,application/json;q=0.9'
3131

3232
def __call__(
3333
self,

tests/test_parser.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -986,22 +986,22 @@ def test_parser_mount_order():
986986

987987
def make_dummy_retriever(name, mime_type='type/subtype', headers=None):
988988
@contextmanager
989-
def retriever(url, caching_info, http_accept):
990-
retriever.last_http_accept = http_accept
989+
def retriever(url, caching_info, accept):
990+
retriever.last_accept = accept
991991
http_info = HTTPInfo(200, headers)
992992
yield RetrievedFeed(name, mime_type, caching_info, http_info)
993993

994994
retriever.slow_to_read = False
995995
return retriever
996996

997997

998-
def make_dummy_parser(prefix='', http_accept=None):
998+
def make_dummy_parser(prefix='', accept=None):
999999
def parser(url, file, headers):
10001000
parser.last_headers = headers
10011001
return prefix + file, [url]
10021002

1003-
if http_accept:
1004-
parser.http_accept = http_accept
1003+
if accept:
1004+
parser.accept = accept
10051005

10061006
return parser
10071007

@@ -1025,7 +1025,7 @@ def test_parser_selection():
10251025
'type/http',
10261026
'caching',
10271027
)
1028-
assert http_retriever.last_http_accept == 'type/http'
1028+
assert http_retriever.last_accept == 'type/http'
10291029
assert http_parser.last_headers == 'headers'
10301030

10311031
# this should not get in the way of anything else;
@@ -1047,7 +1047,7 @@ def test_parser_selection():
10471047
'type/file',
10481048
'caching',
10491049
)
1050-
assert file_retriever.last_http_accept == 'type/http,type/file,text/plain;q=0.8'
1050+
assert file_retriever.last_accept == 'type/http,type/file,text/plain;q=0.8'
10511051
assert file_parser.last_headers is None
10521052

10531053
with pytest.raises(ParseError) as excinfo:
@@ -1080,10 +1080,10 @@ def test_parser_selection():
10801080
None,
10811081
)
10821082
assert parse('unkn:one') == ('fallbackp-unkn', ['unkn:one'], 'type/unknown', None)
1083-
assert nomt_retriever.last_http_accept == 'type/http,type/file,text/plain;q=0.8,*/*'
1083+
assert nomt_retriever.last_accept == 'type/http,type/file,text/plain;q=0.8,*/*'
10841084

10851085
assert parse('file:o') == ('urlp-file', ['file:o'], 'type/file', None)
1086-
assert file_retriever.last_http_accept is None
1086+
assert file_retriever.last_accept is None
10871087

10881088
# this assert is commented because the selected retriever
10891089
# depends on urlunparse() behavior, which in turn depends

tests/test_reader_private.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ def process_feed_for_update(self, feed):
179179

180180

181181
class CustomParser:
182-
http_accept = 'x.test'
182+
accept = 'x.test'
183183

184184
def __call__(self, url, file, headers):
185185
self.in_call(url)

0 commit comments

Comments
 (0)