From 2c0b81d88bcfe6e848e765b24ac52b2fa68b4bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Li=C5=A1ka?= Date: Fri, 28 Jul 2023 05:20:36 +0200 Subject: [PATCH] Refactor ``test_attrgetter_using`` (#11293) Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com> --- tests/test_ext_autodoc.py | 60 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/tests/test_ext_autodoc.py b/tests/test_ext_autodoc.py index a281b6d46..eee63541b 100644 --- a/tests/test_ext_autodoc.py +++ b/tests/test_ext_autodoc.py @@ -403,42 +403,40 @@ def test_new_documenter(app): ] +@pytest.mark.sphinx('html', testroot='ext-autodoc') def test_attrgetter_using(app): - from target import Class - from target.inheritance import Derived - directive = make_directive_bridge(app.env) + directive.genopt['members'] = ALL - def assert_getter_works(objtype, name, obj, attrs=[], **kw): - getattr_spy = [] - - def special_getattr(obj, name, *defargs): - if name in attrs: - getattr_spy.append((obj, name)) - return None - return getattr(obj, name, *defargs) - app.add_autodoc_attrgetter(type, special_getattr) - - del getattr_spy[:] - inst = app.registry.documenters[objtype](directive, name) - inst.generate(**kw) - - hooked_members = [s[1] for s in getattr_spy] - documented_members = [s[1] for s in processed_signatures] - for attr in attrs: - fullname = '.'.join((name, attr)) - assert attr in hooked_members - assert fullname not in documented_members, \ - '%r was not hooked by special_attrgetter function' % fullname - + directive.genopt['inherited_members'] = False with catch_warnings(record=True): - directive.genopt['members'] = ALL - directive.genopt['inherited_members'] = False - print(directive.genopt) - assert_getter_works('class', 'target.Class', Class, ['meth']) + _assert_getter_works(app, directive, 'class', 'target.Class', ['meth']) - directive.genopt['inherited_members'] = True - assert_getter_works('class', 'target.inheritance.Derived', Derived, ['inheritedmeth']) + directive.genopt['inherited_members'] = True + with catch_warnings(record=True): + _assert_getter_works(app, directive, 'class', 'target.inheritance.Derived', ['inheritedmeth']) + + +def _assert_getter_works(app, directive, objtype, name, attrs=(), **kw): + getattr_spy = [] + + def _special_getattr(obj, attr_name, *defargs): + if attr_name in attrs: + getattr_spy.append((obj, attr_name)) + return None + return getattr(obj, attr_name, *defargs) + + app.add_autodoc_attrgetter(type, _special_getattr) + + getattr_spy.clear() + app.registry.documenters[objtype](directive, name).generate(**kw) + + hooked_members = {s[1] for s in getattr_spy} + documented_members = {s[1] for s in processed_signatures} + for attr in attrs: + fullname = '.'.join((name, attr)) + assert attr in hooked_members + assert fullname not in documented_members, f'{fullname!r} not intercepted' @pytest.mark.sphinx('html', testroot='ext-autodoc')