Fix doctest collection of `functools.cached_property` objects.
This commit is contained in:
		
							parent
							
								
									15fadd8c5c
								
							
						
					
					
						commit
						d4fb6ac9f7
					
				
							
								
								
									
										1
									
								
								AUTHORS
								
								
								
								
							
							
						
						
									
										1
									
								
								AUTHORS
								
								
								
								
							| 
						 | 
					@ -379,6 +379,7 @@ Tor Colvin
 | 
				
			||||||
Trevor Bekolay
 | 
					Trevor Bekolay
 | 
				
			||||||
Tushar Sadhwani
 | 
					Tushar Sadhwani
 | 
				
			||||||
Tyler Goodlet
 | 
					Tyler Goodlet
 | 
				
			||||||
 | 
					Tyler Smart
 | 
				
			||||||
Tzu-ping Chung
 | 
					Tzu-ping Chung
 | 
				
			||||||
Vasily Kuznetsov
 | 
					Vasily Kuznetsov
 | 
				
			||||||
Victor Maryama
 | 
					Victor Maryama
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					Fix doctest collection of `functools.cached_property` objects.
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
"""Discover and run doctests in modules and test files."""
 | 
					"""Discover and run doctests in modules and test files."""
 | 
				
			||||||
import bdb
 | 
					import bdb
 | 
				
			||||||
 | 
					import functools
 | 
				
			||||||
import inspect
 | 
					import inspect
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import platform
 | 
					import platform
 | 
				
			||||||
| 
						 | 
					@ -536,6 +537,21 @@ class DoctestModule(Module):
 | 
				
			||||||
                        tests, obj, name, module, source_lines, globs, seen
 | 
					                        tests, obj, name, module, source_lines, globs, seen
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class CachedPropertyAwareDocTestFinder(MockAwareDocTestFinder):
 | 
				
			||||||
 | 
					            def _from_module(self, module, object):
 | 
				
			||||||
 | 
					                """Doctest code does not take into account `@cached_property`,
 | 
				
			||||||
 | 
					                this is a hackish way to fix it. https://github.com/python/cpython/issues/107995
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                Wrap Doctest finder so that when it calls `_from_module` for
 | 
				
			||||||
 | 
					                a cached_property it uses the underlying function instead of the
 | 
				
			||||||
 | 
					                wrapped cached_property object.
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					                if isinstance(object, functools.cached_property):
 | 
				
			||||||
 | 
					                    object = object.func
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                # Type ignored because this is a private function.
 | 
				
			||||||
 | 
					                return super()._from_module(module, object)  # type: ignore[misc]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self.path.name == "conftest.py":
 | 
					        if self.path.name == "conftest.py":
 | 
				
			||||||
            module = self.config.pluginmanager._importconftest(
 | 
					            module = self.config.pluginmanager._importconftest(
 | 
				
			||||||
                self.path,
 | 
					                self.path,
 | 
				
			||||||
| 
						 | 
					@ -555,7 +571,7 @@ class DoctestModule(Module):
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    raise
 | 
					                    raise
 | 
				
			||||||
        # Uses internal doctest module parsing mechanism.
 | 
					        # Uses internal doctest module parsing mechanism.
 | 
				
			||||||
        finder = MockAwareDocTestFinder()
 | 
					        finder = CachedPropertyAwareDocTestFinder()
 | 
				
			||||||
        optionflags = get_optionflags(self)
 | 
					        optionflags = get_optionflags(self)
 | 
				
			||||||
        runner = _get_runner(
 | 
					        runner = _get_runner(
 | 
				
			||||||
            verbose=False,
 | 
					            verbose=False,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -482,6 +482,24 @@ class TestDoctests:
 | 
				
			||||||
        reprec = pytester.inline_run(p, "--doctest-modules")
 | 
					        reprec = pytester.inline_run(p, "--doctest-modules")
 | 
				
			||||||
        reprec.assertoutcome(failed=1)
 | 
					        reprec.assertoutcome(failed=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_doctest_cached_property(self, pytester: Pytester):
 | 
				
			||||||
 | 
					        p = pytester.makepyfile(
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					            import functools
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            class Foo:
 | 
				
			||||||
 | 
					                @functools.cached_property
 | 
				
			||||||
 | 
					                def foo(self):
 | 
				
			||||||
 | 
					                    '''
 | 
				
			||||||
 | 
					                    >>> assert False, "Tacos!"
 | 
				
			||||||
 | 
					                    '''
 | 
				
			||||||
 | 
					                    ...
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        result = pytester.runpytest(p, "--doctest-modules")
 | 
				
			||||||
 | 
					        result.assert_outcomes(failed=1)
 | 
				
			||||||
 | 
					        assert "Tacos!" in result.stdout.str()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_doctestmodule_external_and_issue116(self, pytester: Pytester):
 | 
					    def test_doctestmodule_external_and_issue116(self, pytester: Pytester):
 | 
				
			||||||
        p = pytester.mkpydir("hello")
 | 
					        p = pytester.mkpydir("hello")
 | 
				
			||||||
        p.joinpath("__init__.py").write_text(
 | 
					        p.joinpath("__init__.py").write_text(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue