Get parse_changelog working + tested

This commit is contained in:
Jeff Forcier 2016-10-06 15:48:09 -07:00
parent 13fd559eb7
commit 71d213ef4f
3 changed files with 51 additions and 11 deletions

View file

@ -11,14 +11,14 @@ from spec import Spec, ok_, eq_
from sphinx.application import Sphinx
from releases.models import Release, Issue
from releases.util import get_doctree
from releases.util import get_doctree, parse_changelog
support = os.path.join(os.path.dirname(__file__), '_support')
vanilla = os.path.join(support, 'vanilla', 'changelog.rst')
class get_doctree_(Spec):
def obtains_app_and_doctree_from_filepath(self):
vanilla = os.path.join(support, 'vanilla', 'changelog.rst')
app, doctree = get_doctree(vanilla)
# Expect doctree & app
ok_(doctree)
@ -32,3 +32,22 @@ class get_doctree_(Spec):
ok_(isinstance(bug, Issue))
eq_(bug.type, 'bug')
eq_(bug.number, '1')
class parse_changelog_(Spec):
def yields_releases_dict_from_changelog_path(self):
releases = parse_changelog(vanilla)
ok_(releases)
ok_(isinstance(releases, dict))
eq_(
set(releases.keys()),
set(('1.0.0', '1.0.1', 'unreleased_1.x_bugfix',
'unreleased_1.x_feature')),
)
eq_(len(releases['1.0.0']), 0)
eq_(len(releases['unreleased_1.x_bugfix']), 0)
eq_(len(releases['unreleased_1.x_feature']), 0)
eq_(len(releases['1.0.1']), 1)
issue = releases['1.0.1'][0]
eq_(issue.type, 'bug')
eq_(issue.number, '1')

View file

@ -8,12 +8,13 @@ from tempfile import mkdtemp
import sphinx
from docutils.core import Publisher
from docutils.io import NullOutput
from docutils.nodes import bullet_list
from sphinx.application import Sphinx # not exposed at top level
from sphinx.io import (
SphinxStandaloneReader, SphinxFileInput, SphinxDummyWriter,
)
from . import generate_changelog, setup
from . import construct_releases, setup
def parse_changelog(path):
@ -27,8 +28,22 @@ def parse_changelog(path):
:param str path: A relative or absolute file path string.
:returns: Stuff.
:returns:
A dict of releases (including, if applicable, entries for
per-major-line unreleased issues). Keys are release numbers/versions
(`"1.0.2"`, `"unreleased_1.x_bugfix"`, etc), values are lists of
``releases.models.Issue`` objects.
"""
app, doctree = get_doctree(path)
# Have to semi-reproduce the 'find first bullet list' bit from main code,
# which is unfortunately side-effect-heavy (thanks to Sphinx plugin
# design).
first_list = None
for node in doctree[0]:
if isinstance(node, bullet_list):
first_list = node
break
return changelog2dict(construct_releases(first_list.children, app))
def get_doctree(path):
@ -150,3 +165,15 @@ def make_app(**kwargs):
init_args = [lambda x: x]
app.config.init_values(*init_args)
return app
def changelog2dict(changelog):
"""
Helper turning internal list-o-releases structure into a dict.
See `parse_changelog` docstring for return value details.
"""
d = {}
for r in changelog:
d[r['obj'].number] = r['entries']
return d

View file

@ -12,7 +12,7 @@ from releases import (
release_role,
construct_releases,
)
from releases.util import make_app
from releases.util import make_app, changelog2dict
def inliner(app=None):
@ -85,12 +85,6 @@ def release_list(*entries, **kwargs):
entries.append(release('1.0.0'))
return entries
def changelog2dict(changelog):
d = {}
for r in changelog:
d[r['obj'].number] = r['entries']
return d
def releases(*entries, **kwargs):
app = kwargs.pop('app', None) or make_app()
return construct_releases(release_list(*entries, **kwargs), app)