Skip to content

Commit

Permalink
Fix pydoctor parser
Browse files Browse the repository at this point in the history
  • Loading branch information
hynek committed Aug 14, 2014
1 parent d19ccad commit a3d3bc3
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 33 deletions.
10 changes: 7 additions & 3 deletions doc2dash/parsers/pydoctor.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from bs4 import BeautifulSoup

from . import types
from .base import _BaseParser, APPLE_REF_TEMPLATE
from .base import _BaseParser, APPLE_REF_TEMPLATE, ParserEntry


log = logging.getLogger(__name__)
Expand All @@ -27,7 +27,7 @@ def parse(self):
"""
Parse pydoctor docs at *docpath*.
yield tuples of symbol name, type and path
yield ParserEntrys
"""
soup = BeautifulSoup(
open(os.path.join(self.docpath, 'nameIndex.html')),
Expand All @@ -38,7 +38,11 @@ def parse(self):
path = tag.get('href')
if path and not path.startswith('#'):
name = tag.string
yield name, _guess_type(name, path), path
yield ParserEntry(
name=name,
type=_guess_type(name, path),
path=path
)

def find_and_patch_entry(self, soup, entry):
link = soup.find('a', attrs={'name': entry.anchor})
Expand Down
73 changes: 43 additions & 30 deletions tests/parsers/pydoctor/test_pydoctor.py
Original file line number Diff line number Diff line change
@@ -1,57 +1,70 @@
from __future__ import absolute_import, division, print_function

import os

import pytest

from bs4 import BeautifulSoup
from mock import patch, mock_open

from doc2dash.parsers import types
from doc2dash.parsers.base import TOCEntry
from doc2dash.parsers.base import TOCEntry, ParserEntry
from doc2dash.parsers.pydoctor import PyDoctorParser, _guess_type


HERE = os.path.dirname(__file__)


def test_guess_type():
ts = [
@pytest.mark.parametrize(
"name, path, expected", [
('startServer',
'twisted.conch.test.test_cftp.CFTPClientTestBase.html#startServer',
types.METHOD),
types.METHOD
),
('A', 'twisted.test.myrebuilder1.A.html', types.CLASS),
('epollreactor', 'twisted.internet.epollreactor.html',
types.PACKAGE)
]

for t in ts:
assert _guess_type(t[0], t[1]) == t[2]
)
def test_guess_type(name, path, expected):
"""
Symbol types are correctly guessed.
"""
assert _guess_type(name, path) == expected


EXAMPLE_PARSE_RESULT = [
('twisted.conch.insults.insults.ServerProtocol'
'.ControlSequenceParser.A', types.METHOD,
'twisted.conch.insults.insults.ServerProtocol'
'.ControlSequenceParser.html#A'),
('twisted.test.myrebuilder1.A', types.CLASS,
'twisted.test.myrebuilder1.A.html'),
('twisted.test.myrebuilder2.A', types.CLASS,
'twisted.test.myrebuilder2.A.html'),
('twisted.test.test_jelly.A', types.CLASS,
'twisted.test.test_jelly.A.html'),
('twisted.test.test_persisted.A', types.CLASS,
'twisted.test.test_persisted.A.html'),
('twisted.test.myrebuilder1.A.a', types.METHOD,
'twisted.test.myrebuilder1.A.html#a'),
('twisted.test.myrebuilder1.Inherit.a', types.METHOD,
'twisted.test.myrebuilder1.Inherit.html#a'),
('twisted.test.myrebuilder2.A.a', types.METHOD,
'twisted.test.myrebuilder2.A.html#a'),
('twisted.test.myrebuilder2.Inherit.a', types.METHOD,
'twisted.test.myrebuilder2.Inherit.html#a'),
('twisted.web._newclient.HTTP11ClientProtocol.abort', types.METHOD,
'twisted.web._newclient.HTTP11ClientProtocol.html#abort')
]
ParserEntry(name=t[0], type=t[1], path=t[2])
for t in [
('twisted.conch.insults.insults.ServerProtocol'
'.ControlSequenceParser.A', types.METHOD,
'twisted.conch.insults.insults.ServerProtocol'
'.ControlSequenceParser.html#A'),
('twisted.test.myrebuilder1.A', types.CLASS,
'twisted.test.myrebuilder1.A.html'),
('twisted.test.myrebuilder2.A', types.CLASS,
'twisted.test.myrebuilder2.A.html'),
('twisted.test.test_jelly.A', types.CLASS,
'twisted.test.test_jelly.A.html'),
('twisted.test.test_persisted.A', types.CLASS,
'twisted.test.test_persisted.A.html'),
('twisted.test.myrebuilder1.A.a', types.METHOD,
'twisted.test.myrebuilder1.A.html#a'),
('twisted.test.myrebuilder1.Inherit.a', types.METHOD,
'twisted.test.myrebuilder1.Inherit.html#a'),
('twisted.test.myrebuilder2.A.a', types.METHOD,
'twisted.test.myrebuilder2.A.html#a'),
('twisted.test.myrebuilder2.Inherit.a', types.METHOD,
'twisted.test.myrebuilder2.Inherit.html#a'),
('twisted.web._newclient.HTTP11ClientProtocol.abort', types.METHOD,
'twisted.web._newclient.HTTP11ClientProtocol.html#abort')
]]


def test_parse():
"""
The shipped example results in the expected parsing result.
"""
example = open(os.path.join(HERE, 'pydoctor_example.html')).read()
with patch('doc2dash.parsers.pydoctor.open', mock_open(read_data=example),
create=True):
Expand Down

0 comments on commit a3d3bc3

Please sign in to comment.