getappmap / appmap-python

AppMap client agent for Python
https://appland.org
Other
100 stars 16 forks source link

matplotlib tests fail, expecting their decorator to be outermost #331

Open petecheslock opened 6 months ago

petecheslock commented 6 months ago

In the 3.5 version of this project: https://github.com/matplotlib/matplotlib

Revision de98877e3dc45de8dd441d008f23d88738dc015d

Create venv pip install -r requirements/dev/dev-requirements.txt pip install -r requirements/testing/all.txt
pip install pytest-xdist pytest appmap pytest -vv

(most tests will pass)

run appmap-python pytest -vv - all tests will fail.

They all fail with the same error. Here is a single test example.

appmap-python pytest -n8 -vv lib/matplotlib/tests/test_type1font.py::test_Type1Font                                   INT ✘  3.9.19   matplotlib   17:12:42 
=========================================================================================== test session starts ===========================================================================================
platform darwin -- Python 3.9.19, pytest-8.2.1, pluggy-1.5.0 -- /Users/petecheslock/repos/matplotlib/venv/bin/python
cachedir: .pytest_cache
rootdir: /Users/petecheslock/repos/matplotlib
configfile: pytest.ini
plugins: cov-5.0.0, xvfb-3.0.0, rerunfailures-14.0, appmap-2.0.4, timeout-2.3.1, xdist-3.6.1
8 workers [1 item]      
scheduling tests via LoadScheduling

lib/matplotlib/tests/test_type1font.py::test_Type1Font 
[gw0] [100%] ERROR lib/matplotlib/tests/test_type1font.py::test_Type1Font 

================================================================================================= ERRORS ==================================================================================================
____________________________________________________________________________________ ERROR at setup of test_Type1Font _____________________________________________________________________________________
[gw0] darwin -- Python 3.9.19 /Users/petecheslock/repos/matplotlib/venv/bin/python

request = <SubRequest 'mpl_test_settings' for <Function test_Type1Font>>

    @pytest.fixture(autouse=True)
    def mpl_test_settings(request):
>       from matplotlib.testing.decorators import _cleanup_cm

lib/matplotlib/testing/conftest.py:40: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
venv/lib/python3.9/site-packages/_appmap/wrapt/wrappers.py:613: in __call__
    return self._self_wrapper(self.__wrapped__, instance,
venv/lib/python3.9/site-packages/_appmap/importer.py:235: in wrapped_exec_module
    exec_module(*args, **kwargs)
lib/matplotlib/testing/decorators.py:17: in <module>
    from matplotlib import (_api, _pylab_helpers, cbook, ft2font, pyplot as plt,
venv/lib/python3.9/site-packages/_appmap/wrapt/wrappers.py:613: in __call__
    return self._self_wrapper(self.__wrapped__, instance,
venv/lib/python3.9/site-packages/_appmap/importer.py:235: in wrapped_exec_module
    exec_module(*args, **kwargs)
lib/matplotlib/pyplot.py:2603: in <module>
    def imshow(
lib/matplotlib/pyplot.py:105: in _copy_docstring_and_deprecators
    func = decorator(func)
venv/lib/python3.9/site-packages/_appmap/wrapt/wrappers.py:622: in __call__
    return self._self_wrapper(self.__wrapped__, self._self_instance,
venv/lib/python3.9/site-packages/_appmap/instrument.py:131: in instrumented_fn
    return call_instrumented(f, instance, args, kwargs)
venv/lib/python3.9/site-packages/_appmap/instrument.py:82: in call_instrumented
    return f.fn(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

since = '3.5', name = 'aspect', func = <function imshow at 0x1537dcca0>

    def make_keyword_only(since, name, func=None):
        """
        Decorator indicating that passing parameter *name* (or any of the following
        ones) positionally to *func* is being deprecated.

        When used on a method that has a pyplot wrapper, this should be the
        outermost decorator, so that :file:`boilerplate.py` can access the original
        signature.
        """

        decorator = functools.partial(make_keyword_only, since, name)

        if func is None:
            return decorator

        signature = inspect.signature(func)
        POK = inspect.Parameter.POSITIONAL_OR_KEYWORD
        KWO = inspect.Parameter.KEYWORD_ONLY
>       assert (name in signature.parameters
                and signature.parameters[name].kind == POK), (
            f"Matplotlib internal error: {name!r} must be a positional-or-keyword "
            f"parameter for {func.__name__}()")
E       AssertionError: Matplotlib internal error: 'aspect' must be a positional-or-keyword parameter for imshow()

lib/matplotlib/_api/deprecation.py:434: AssertionError
========================================================================================= short test summary info =========================================================================================
ERROR lib/matplotlib/tests/test_type1font.py::test_Type1Font - AssertionError: Matplotlib internal error: 'aspect' must be a positional-or-keyword parameter for imshow()
apotterri commented 4 months ago

A clue to this failure here might well be described in the comment:

        When used on a method that has a pyplot wrapper, this should be the
        outermost decorator, so that :file:`boilerplate.py` can access the original
        signature.

If the function it's checking has been instrumented, make_keyword_only won't be the outermost decorator, the wrapt wrapper the agent applies will be.