Skip to content

Commit a3d3bc3

Browse files
committed
Fix pydoctor parser
1 parent d19ccad commit a3d3bc3

2 files changed

Lines changed: 50 additions & 33 deletions

File tree

doc2dash/parsers/pydoctor.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from bs4 import BeautifulSoup
77

88
from . import types
9-
from .base import _BaseParser, APPLE_REF_TEMPLATE
9+
from .base import _BaseParser, APPLE_REF_TEMPLATE, ParserEntry
1010

1111

1212
log = logging.getLogger(__name__)
@@ -27,7 +27,7 @@ def parse(self):
2727
"""
2828
Parse pydoctor docs at *docpath*.
2929
30-
yield tuples of symbol name, type and path
30+
yield ParserEntrys
3131
"""
3232
soup = BeautifulSoup(
3333
open(os.path.join(self.docpath, 'nameIndex.html')),
@@ -38,7 +38,11 @@ def parse(self):
3838
path = tag.get('href')
3939
if path and not path.startswith('#'):
4040
name = tag.string
41-
yield name, _guess_type(name, path), path
41+
yield ParserEntry(
42+
name=name,
43+
type=_guess_type(name, path),
44+
path=path
45+
)
4246

4347
def find_and_patch_entry(self, soup, entry):
4448
link = soup.find('a', attrs={'name': entry.anchor})

tests/parsers/pydoctor/test_pydoctor.py

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,70 @@
1+
from __future__ import absolute_import, division, print_function
2+
13
import os
24

5+
import pytest
6+
37
from bs4 import BeautifulSoup
48
from mock import patch, mock_open
59

610
from doc2dash.parsers import types
7-
from doc2dash.parsers.base import TOCEntry
11+
from doc2dash.parsers.base import TOCEntry, ParserEntry
812
from doc2dash.parsers.pydoctor import PyDoctorParser, _guess_type
913

1014

1115
HERE = os.path.dirname(__file__)
1216

1317

14-
def test_guess_type():
15-
ts = [
18+
@pytest.mark.parametrize(
19+
"name, path, expected", [
1620
('startServer',
1721
'twisted.conch.test.test_cftp.CFTPClientTestBase.html#startServer',
18-
types.METHOD),
22+
types.METHOD
23+
),
1924
('A', 'twisted.test.myrebuilder1.A.html', types.CLASS),
2025
('epollreactor', 'twisted.internet.epollreactor.html',
2126
types.PACKAGE)
2227
]
23-
24-
for t in ts:
25-
assert _guess_type(t[0], t[1]) == t[2]
28+
)
29+
def test_guess_type(name, path, expected):
30+
"""
31+
Symbol types are correctly guessed.
32+
"""
33+
assert _guess_type(name, path) == expected
2634

2735

2836
EXAMPLE_PARSE_RESULT = [
29-
('twisted.conch.insults.insults.ServerProtocol'
30-
'.ControlSequenceParser.A', types.METHOD,
31-
'twisted.conch.insults.insults.ServerProtocol'
32-
'.ControlSequenceParser.html#A'),
33-
('twisted.test.myrebuilder1.A', types.CLASS,
34-
'twisted.test.myrebuilder1.A.html'),
35-
('twisted.test.myrebuilder2.A', types.CLASS,
36-
'twisted.test.myrebuilder2.A.html'),
37-
('twisted.test.test_jelly.A', types.CLASS,
38-
'twisted.test.test_jelly.A.html'),
39-
('twisted.test.test_persisted.A', types.CLASS,
40-
'twisted.test.test_persisted.A.html'),
41-
('twisted.test.myrebuilder1.A.a', types.METHOD,
42-
'twisted.test.myrebuilder1.A.html#a'),
43-
('twisted.test.myrebuilder1.Inherit.a', types.METHOD,
44-
'twisted.test.myrebuilder1.Inherit.html#a'),
45-
('twisted.test.myrebuilder2.A.a', types.METHOD,
46-
'twisted.test.myrebuilder2.A.html#a'),
47-
('twisted.test.myrebuilder2.Inherit.a', types.METHOD,
48-
'twisted.test.myrebuilder2.Inherit.html#a'),
49-
('twisted.web._newclient.HTTP11ClientProtocol.abort', types.METHOD,
50-
'twisted.web._newclient.HTTP11ClientProtocol.html#abort')
51-
]
37+
ParserEntry(name=t[0], type=t[1], path=t[2])
38+
for t in [
39+
('twisted.conch.insults.insults.ServerProtocol'
40+
'.ControlSequenceParser.A', types.METHOD,
41+
'twisted.conch.insults.insults.ServerProtocol'
42+
'.ControlSequenceParser.html#A'),
43+
('twisted.test.myrebuilder1.A', types.CLASS,
44+
'twisted.test.myrebuilder1.A.html'),
45+
('twisted.test.myrebuilder2.A', types.CLASS,
46+
'twisted.test.myrebuilder2.A.html'),
47+
('twisted.test.test_jelly.A', types.CLASS,
48+
'twisted.test.test_jelly.A.html'),
49+
('twisted.test.test_persisted.A', types.CLASS,
50+
'twisted.test.test_persisted.A.html'),
51+
('twisted.test.myrebuilder1.A.a', types.METHOD,
52+
'twisted.test.myrebuilder1.A.html#a'),
53+
('twisted.test.myrebuilder1.Inherit.a', types.METHOD,
54+
'twisted.test.myrebuilder1.Inherit.html#a'),
55+
('twisted.test.myrebuilder2.A.a', types.METHOD,
56+
'twisted.test.myrebuilder2.A.html#a'),
57+
('twisted.test.myrebuilder2.Inherit.a', types.METHOD,
58+
'twisted.test.myrebuilder2.Inherit.html#a'),
59+
('twisted.web._newclient.HTTP11ClientProtocol.abort', types.METHOD,
60+
'twisted.web._newclient.HTTP11ClientProtocol.html#abort')
61+
]]
5262

5363

5464
def test_parse():
65+
"""
66+
The shipped example results in the expected parsing result.
67+
"""
5568
example = open(os.path.join(HERE, 'pydoctor_example.html')).read()
5669
with patch('doc2dash.parsers.pydoctor.open', mock_open(read_data=example),
5770
create=True):

0 commit comments

Comments
 (0)