from spec import Spec, eq_, skip from docutils.nodes import ( reference, bullet_list, list_item, raw, paragraph, ) from releases import ( Issue, construct_releases, construct_nodes, ) from _util import ( b, f, s, entry, make_app, release, releases, setup_issues, ) def _obj2name(obj): cls = obj if isinstance(obj, type) else obj.__class__ return cls.__name__.split('.')[-1] def _expect_type(node, cls): type_ = _obj2name(node) name = _obj2name(cls) msg = "Expected %r to be a %s, but it's a %s" % (node, name, type_) assert isinstance(node, cls), msg class presentation(Spec): """ Expansion/extension of docutils nodes (rendering) """ def setup(self): setup_issues(self) def _generate(self, *entries, **kwargs): raw = kwargs.pop('raw', False) nodes = construct_nodes(releases(*entries, **kwargs)) # By default, yield the contents of the bullet list. return nodes if raw else nodes[0][1][0] def _test_link(self, kwargs, type_, expected): app = make_app(**kwargs) nodes = construct_nodes(construct_releases([ release('1.0.2', app=app), entry(b(15, app=app)), release('1.0.0'), ], app=app)) if type_ == 'release': header = nodes[0][0][0].astext() assert expected in header elif type_ == 'issue': link = nodes[0][1][0][0][2] eq_(link['refuri'], expected) else: raise Exception("Gave unknown type_ kwarg to _test_link()!") def issues_with_numbers_appear_as_number_links(self): self._test_link({}, 'issue', 'bar_15') def releases_appear_as_header_links(self): self._test_link({}, 'release', 'foo_1.0.2') def links_will_use_github_option_if_defined(self): kwargs = { 'release_uri': None, 'issue_uri': None, 'github_path': 'foo/bar', } for type_, expected in ( ('issue', 'https://github.com/foo/bar/issues/15'), ('release', 'https://github.com/foo/bar/tree/1.0.2'), ): self._test_link(kwargs, type_, expected) def issue_links_prefer_explicit_setting_over_github_setting(self): kwargs = { 'release_uri': None, 'issue_uri': 'explicit_issue_%s', 'github_path': 'foo/bar', } self._test_link(kwargs, 'issue', 'explicit_issue_15') def release_links_prefer_explicit_setting_over_github_setting(self): kwargs = { 'release_uri': 'explicit_release_%s', 'issue_uri': None, 'github_path': 'foo/bar', } self._test_link(kwargs, 'release', 'explicit_release_1.0.2') def _assert_prefix(self, entries, expectation): assert expectation in self._generate(*entries)[0][0][0] def bugs_marked_as_bugs(self): self._assert_prefix(['1.0.2', self.b], 'Bug') def features_marked_as_features(self): self._assert_prefix(['1.1.0', self.f], 'Feature') def support_marked_as_support(self): self._assert_prefix(['1.1.0', self.s], 'Support') def dashed_issues_appear_as_unlinked_issues(self): node = self._generate('1.0.2', b('-')) assert not isinstance(node[0][2], reference) def zeroed_issues_appear_as_unlinked_issues(self): node = self._generate('1.0.2', b(0)) assert not isinstance(node[0][2], reference) def un_prefixed_list_items_appear_as_unlinked_bugs(self): text = "fixes an issue in ``methodname``" fake = list_item('', paragraph('', '', raw('', text))) node = self._generate('1.0.2', fake) # [, , , ] eq_(len(node[0]), 4) assert 'Bug' in str(node[0][0]) assert 'fixes an issue' in str(node[0][3]) def un_prefixed_list_items_get_no_prefix_under_unstable_prehistory(self): app = make_app(unstable_prehistory=True) fake = list_item('', paragraph('', '', raw('', 'whatever'))) node = self._generate('0.1.0', fake, app=app, skip_initial=True) # [] eq_(len(node[0]), 1) assert 'Bug' not in str(node[0][0]) assert 'whatever' in str(node[0][0]) def issues_remain_wrapped_in_unordered_list_nodes(self): node = self._generate('1.0.2', self.b, raw=True)[0][1] _expect_type(node, bullet_list) _expect_type(node[0], list_item) def release_headers_have_local_style_tweaks(self): node = self._generate('1.0.2', self.b, raw=True)[0][0] _expect_type(node, raw) # Header w/ bottom margin assert '