Skip to content

Commit ade2554

Browse files
committed
Add typing support
1 parent ef8022d commit ade2554

File tree

12 files changed

+42
-34
lines changed

12 files changed

+42
-34
lines changed

.github/workflows/feedparser.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ jobs:
6767
if: (startsWith(runner.os, 'Linux') || startsWith(runner.os, 'macOS'))
6868
run: |
6969
source venv/bin/activate
70-
tox -e py,py-chardet
70+
tox -e py,py-chardet,mypy
7171
7272
- name: Run tox
7373
if: startsWith(runner.os, 'Windows')
7474
run: |
7575
.\venv\scripts\activate.ps1
76-
tox -e py,py-chardet
76+
tox -e py,py-chardet,mypy
7777
7878
docs:
7979
name: "Build documentation"

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ build/
1111
.doit.*
1212
*.html
1313
poetry.lock
14+
.vscode/

CONTRIBUTORS.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ bug report!
2020
* `Tom Most <https://github.com/twm/>`_
2121
* `Nik Nyby <http://nikolas.us.to/>`_
2222
* `Ade Oshineye <http://blog.oshineye.com/>`_
23+
* `Tom Parker-Shemilt <https://tevps.net>`_
2324
* `Martin Pool <http://sourcefrog.net/>`_
2425
* `Sam Ruby <http://intertwingly.net/>`_
2526
* `Bernd Schlapsi <https://github.com/brot>`_

feedparser/api.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -138,17 +138,11 @@ def _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, h
138138
return url_file_stream_or_string
139139

140140

141-
LooseFeedParser = type(
142-
'LooseFeedParser',
143-
(LooseXMLParser, XMLParserMixin, BaseHTMLProcessor),
144-
{},
145-
)
141+
class LooseFeedParser(LooseXMLParser, XMLParserMixin, BaseHTMLProcessor):
142+
pass
146143

147-
StrictFeedParser = type(
148-
'StrictFeedParser',
149-
(StrictXMLParser, XMLParserMixin, xml.sax.handler.ContentHandler),
150-
{},
151-
)
144+
class StrictFeedParser(StrictXMLParser, XMLParserMixin, xml.sax.handler.ContentHandler):
145+
pass
152146

153147

154148
def parse(
@@ -214,10 +208,10 @@ def parse(
214208
agent = feedparser.USER_AGENT
215209
if sanitize_html is None:
216210
import feedparser
217-
sanitize_html = feedparser.SANITIZE_HTML
211+
sanitize_html = bool(feedparser.SANITIZE_HTML)
218212
if resolve_relative_uris is None:
219213
import feedparser
220-
resolve_relative_uris = feedparser.RESOLVE_RELATIVE_URIS
214+
resolve_relative_uris = bool(feedparser.RESOLVE_RELATIVE_URIS)
221215

222216
result = FeedParserDict(
223217
bozo=False,
@@ -258,7 +252,8 @@ def parse(
258252
baselang = baselang.decode('utf-8', 'ignore')
259253

260254
if not _XML_AVAILABLE:
261-
use_strict_parser = 0
255+
use_strict_parser = False
256+
feed_parser: Union[JSONParser, StrictFeedParser, LooseFeedParser]
262257
if use_json_parser:
263258
result['version'] = None
264259
feed_parser = JSONParser(baseuri, baselang, 'utf-8')
@@ -288,7 +283,7 @@ def parse(
288283
except xml.sax.SAXException as e:
289284
result['bozo'] = 1
290285
result['bozo_exception'] = feed_parser.exc or e
291-
use_strict_parser = 0
286+
use_strict_parser = False
292287

293288
# The loose XML parser will be tried if the JSON parser was not used,
294289
# and if the strict XML parser was not used (or if if it failed).
@@ -301,5 +296,8 @@ def parse(
301296
result['feed'] = feed_parser.feeddata
302297
result['entries'] = feed_parser.entries
303298
result['version'] = result['version'] or feed_parser.version
304-
result['namespaces'] = feed_parser.namespaces_in_use
299+
if isinstance(feed_parser, JSONParser):
300+
result['namespaces'] = {}
301+
else:
302+
result['namespaces'] = feed_parser.namespaces_in_use
305303
return result

feedparser/datetimes/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2626
# POSSIBILITY OF SUCH DAMAGE.
2727

28+
from time import struct_time
29+
from typing import Callable, List, Optional
2830
from .asctime import _parse_date_asctime
2931
from .greek import _parse_date_greek
3032
from .hungarian import _parse_date_hungarian
@@ -34,7 +36,7 @@
3436
from .rfc822 import _parse_date_rfc822
3537
from .w3dtf import _parse_date_w3dtf
3638

37-
_date_handlers = []
39+
_date_handlers: List[Callable[[str], Optional[struct_time]]] = []
3840

3941

4042
def registerDateHandler(func):

feedparser/datetimes/iso8601.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,7 @@
6868
+ r'(\.(?P<fracsecond>\d+))?'
6969
+ r'(?P<tz>[+-](?P<tzhour>\d{2})(:(?P<tzmin>\d{2}))?|Z)?)?'
7070
for tmpl in _iso8601_tmpl]
71-
try:
72-
del tmpl
73-
except NameError:
74-
pass
7571
_iso8601_matches = [re.compile(regex).match for regex in _iso8601_re]
76-
try:
77-
del regex
78-
except NameError:
79-
pass
8072

8173

8274
def _parse_date_iso8601(date_string):

feedparser/datetimes/perforce.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2626
# POSSIBILITY OF SUCH DAMAGE.
2727

28-
import email._parseaddr
28+
import email.utils
2929
import re
3030
import time
3131

@@ -41,6 +41,6 @@ def _parse_date_perforce(date_string):
4141
dow, year, month, day, hour, minute, second, tz = m.groups()
4242
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
4343
new_date_string = "%s, %s %s %s %s:%s:%s %s" % (dow, day, months[int(month) - 1], year, hour, minute, second, tz)
44-
tm = email._parseaddr.parsedate_tz(new_date_string)
44+
tm = email.utils.parsedate_tz(new_date_string)
4545
if tm:
46-
return time.gmtime(email._parseaddr.mktime_tz(tm))
46+
return time.gmtime(email.utils.mktime_tz(tm))

feedparser/encodings.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@
3232

3333
try:
3434
try:
35-
import cchardet as chardet
35+
import chardet as chardet
3636
except ImportError:
3737
import chardet
3838
except ImportError:
39-
chardet = None
4039
lazy_chardet_encoding = None
4140
else:
4241
def lazy_chardet_encoding(data):

feedparser/mixin.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import copy
3131
import html.entities
3232
import re
33+
from typing import Dict
3334
import xml.sax.saxutils
3435

3536
from .html import _cp1252
@@ -118,7 +119,7 @@ class XMLParserMixin(
118119
'http://www.w3.org/XML/1998/namespace': 'xml',
119120
'http://podlove.org/simple-chapters': 'psc',
120121
}
121-
_matchnamespaces = {}
122+
_matchnamespaces: Dict[str, str] = {}
122123

123124
can_be_relative_uri = {
124125
'comments',
@@ -170,6 +171,8 @@ def __init__(self):
170171
self.entries = [] # list of entry-level data
171172
self.version = '' # feed type/version, see SUPPORTED_VERSIONS
172173
self.namespaces_in_use = {} # dictionary of namespaces defined by the feed
174+
self.resolve_relative_uris = False
175+
self.sanitize_html = False
173176

174177
# the following are used internally to track state;
175178
# this is really out of control and should be refactored

feedparser/py.typed

Whitespace-only changes.

0 commit comments

Comments
 (0)