From 71d213ef4fe2803763d71d76e73f92256996f3a7 Mon Sep 17 00:00:00 2001 From: Jeff Forcier Date: Thu, 6 Oct 2016 15:48:09 -0700 Subject: [PATCH] Get parse_changelog working + tested --- integration/util.py | 23 +++++++++++++++++++++-- releases/util.py | 31 +++++++++++++++++++++++++++++-- tests/_util.py | 8 +------- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/integration/util.py b/integration/util.py index c563c17..cd98d27 100644 --- a/integration/util.py +++ b/integration/util.py @@ -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') diff --git a/releases/util.py b/releases/util.py index 5e3f9ba..20de36a 100644 --- a/releases/util.py +++ b/releases/util.py @@ -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 diff --git a/tests/_util.py b/tests/_util.py index 285cc96..5017cfa 100644 --- a/tests/_util.py +++ b/tests/_util.py @@ -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)