Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test_no_user_warning assumes pip is available #2396

Open
kloczek opened this issue Mar 15, 2024 · 1 comment
Open

test_no_user_warning assumes pip is available #2396

kloczek opened this issue Mar 15, 2024 · 1 comment
Labels
Good first issue Friendly and approachable by new contributors Needs PR This issue is accepted, sufficiently specified and now needs an implementation

Comments

@kloczek
Copy link

kloczek commented Mar 15, 2024

I'm packaging your module as an rpm package so I'm using the typical PEP517 based build, install and test cycle used on building packages from non-root account.

  • python3 -sBm build -w --no-isolation
  • because I'm calling build with --no-isolation I'm using during all processes only locally installed modules
  • install .whl file in </install/prefix> using installer module
  • run pytest with $PYTHONPATH pointing to sitearch and sitelib inside </install/prefix>
  • build is performed in env which is cut off from access to the public network (pytest is executed with -m "not network")
Here is pytest output:
+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-astroid-3.1.0-2.fc36.x86_64/usr/lib64/python3.9/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-astroid-3.1.0-2.fc36.x86_64/usr/lib/python3.9/site-packages
+ /usr/bin/pytest -ra -m 'not network'
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.9.18, pytest-8.1.1, pluggy-1.4.0
rootdir: /home/tkloczko/rpmbuild/BUILD/astroid-3.1.0
configfile: pyproject.toml
testpaths: tests
plugins: hypothesis-6.99.5, xdist-3.5.0, forked-1.6.0
collected 1679 items / 1 skipped

tests/brain/numpy/test_core_einsumfunc.py ss                                                                                                                                          [  0%]
tests/brain/numpy/test_core_fromnumeric.py s                                                                                                                                          [  0%]
tests/brain/numpy/test_core_function_base.py s                                                                                                                                        [  0%]
tests/brain/numpy/test_core_multiarray.py sssss                                                                                                                                       [  0%]
tests/brain/numpy/test_core_numeric.py sssss                                                                                                                                          [  0%]
tests/brain/numpy/test_core_numerictypes.py sssssss..                                                                                                                                 [  1%]
tests/brain/numpy/test_core_umath.py ssssssss                                                                                                                                         [  1%]
tests/brain/numpy/test_ma.py ssss                                                                                                                                                     [  2%]
tests/brain/numpy/test_ndarray.py sss                                                                                                                                                 [  2%]
tests/brain/numpy/test_random_mtrand.py ss                                                                                                                                            [  2%]
tests/brain/test_argparse.py .                                                                                                                                                        [  2%]
tests/brain/test_attr.py .....                                                                                                                                                        [  2%]
tests/brain/test_brain.py .s.....s....ss......................................s....s..........................................................x......................                 [ 11%]
tests/brain/test_builtin.py ..................                                                                                                                                        [ 12%]
tests/brain/test_ctypes.py ....x........................                                                                                                                              [ 13%]
tests/brain/test_dataclasses.py ..............................................................................x...                                                                    [ 18%]
tests/brain/test_dateutil.py .                                                                                                                                                        [ 18%]
tests/brain/test_enum.py .............................                                                                                                                                [ 20%]
tests/brain/test_hashlib.py ...                                                                                                                                                       [ 20%]
tests/brain/test_multiprocessing.py ...                                                                                                                                               [ 20%]
tests/brain/test_named_tuple.py .......................                                                                                                                               [ 22%]
tests/brain/test_nose.py s                                                                                                                                                            [ 22%]
tests/brain/test_pathlib.py ....                                                                                                                                                      [ 22%]
tests/brain/test_pytest.py .                                                                                                                                                          [ 22%]
tests/brain/test_qt.py sss                                                                                                                                                            [ 22%]
tests/brain/test_regex.py ss                                                                                                                                                          [ 22%]
tests/brain/test_signal.py ...                                                                                                                                                        [ 23%]
tests/brain/test_six.py ssssss                                                                                                                                                        [ 23%]
tests/brain/test_ssl.py .                                                                                                                                                             [ 23%]
tests/brain/test_threading.py ....                                                                                                                                                    [ 23%]
tests/brain/test_typing.py .                                                                                                                                                          [ 23%]
tests/brain/test_typing_extensions.py .                                                                                                                                               [ 23%]
tests/brain/test_unittest.py .                                                                                                                                                        [ 23%]
tests/test_builder.py .......................................................x..                                                                                                      [ 27%]
tests/test_constraint.py ...................................                                                                                                                          [ 29%]
tests/test_decorators.py ...                                                                                                                                                          [ 29%]
tests/test_filter_statements.py .                                                                                                                                                     [ 29%]
tests/test_group_exceptions.py sss                                                                                                                                                    [ 29%]
tests/test_helpers.py ...............                                                                                                                                                 [ 30%]
tests/test_inference.py ...........................s..............................................................x...........x.....x................................................ [ 40%]
........x...................................................................s.........sss.........................................................x........xx.....................x.. [ 50%]
.x..........................................s......x........................................                                                                                          [ 56%]
tests/test_inference_calls.py ........................                                                                                                                                [ 57%]
tests/test_lookup.py .......................................................                                                                                                          [ 61%]
tests/test_manager.py ....................................F......                                                                                                                     [ 63%]
tests/test_modutils.py ................................................s.................                                                                                             [ 67%]
tests/test_nodes.py ...................ssss..........................................................................sssss........................................................... [ 77%]
...........................                                                                                                                                                           [ 78%]
tests/test_nodes_lineno.py s...................s...                                                                                                                                   [ 80%]
tests/test_nodes_position.py ...                                                                                                                                                      [ 80%]
tests/test_object_model.py x...............x...................                                                                                                                       [ 82%]
tests/test_objects.py ......................                                                                                                                                          [ 83%]
tests/test_protocols.py ...............ssssss                                                                                                                                         [ 85%]
tests/test_python3.py ..........................                                                                                                                                      [ 86%]
tests/test_raw_building.py .............                                                                                                                                              [ 87%]
tests/test_regrtest.py .............ss...........                                                                                                                                     [ 88%]
tests/test_scoped_nodes.py ...............................................................................................ss................................s.s...................... [ 98%]
.............                                                                                                                                                                         [ 98%]
tests/test_stdlib.py ..                                                                                                                                                               [ 98%]
tests/test_transforms.py .........                                                                                                                                                    [ 99%]
tests/test_utils.py ........                                                                                                                                                          [100%]

========================================================================================= FAILURES ==========================================================================================
______________________________________________________________________ IsolatedAstroidManagerTest.test_no_user_warning ______________________________________________________________________

self = <tests.test_manager.IsolatedAstroidManagerTest testMethod=test_no_user_warning>

    def test_no_user_warning(self):
        mgr = manager.AstroidManager()
        with warnings.catch_warnings():
            warnings.filterwarnings("error", category=UserWarning)
            mgr.ast_from_module_name("setuptools")
>           mgr.ast_from_module_name("pip")

tests/test_manager.py:393:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
astroid/manager.py:266: in ast_from_module_name
    raise e
astroid/manager.py:211: in ast_from_module_name
    found_spec = self.file_from_module_name(modname, context_file)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <astroid.manager.AstroidManager object at 0x7f7a9c889eb0>, modname = 'pip', contextfile = None

    def file_from_module_name(
        self, modname: str, contextfile: str | None
    ) -> spec.ModuleSpec:
        try:
            value = self._mod_file_cache[(modname, contextfile)]
        except KeyError:
            try:
                value = file_info_from_modpath(
                    modname.split("."), context_file=contextfile
                )
            except ImportError as e:
                # pylint: disable-next=redefined-variable-type
                value = AstroidImportError(
                    "Failed to import module {modname} with error:\n{error}.",
                    modname=modname,
                    # we remove the traceback here to save on memory usage (since these exceptions are cached)
                    error=e.with_traceback(None),
                )
            self._mod_file_cache[(modname, contextfile)] = value
        if isinstance(value, AstroidBuildingError):
            # we remove the traceback here to save on memory usage (since these exceptions are cached)
>           raise value.with_traceback(None)  # pylint: disable=no-member
E           astroid.exceptions.AstroidImportError: Failed to import module pip with error:
E           No module named pip.

astroid/manager.py:318: AstroidImportError
========================================================================================= XFAILURES =========================================================================================
____________________________________________________________________ TestLenBuiltinInference.test_int_subclass_argument _____________________________________________________________________

args = (<Call l.4 at 0x7f7aa0c26790>,), kwargs = {'context': <astroid.context.InferenceContext object at 0x7f7aa15e5280>}, generator = <generator object Call._infer at 0x7f7aa0eb4c80>

    def inner(
        *args: _P.args, **kwargs: _P.kwargs
    ) -> Generator[InferenceResult, None, None]:
        generator = func(*args, **kwargs)
        try:
>           yield next(generator)
E           StopIteration

astroid/decorators.py:90: StopIteration

The above exception was the direct cause of the following exception:

self = <tests.brain.test_brain.TestLenBuiltinInference object at 0x7f7aa3a595b0>

    @pytest.mark.xfail(reason="Can't use list special astroid fields")
    def test_int_subclass_argument(self):
        """I am unable to access the length of an object which
        subclasses list"""
        node = astroid.extract_node(
            """
        class ListSubclass(list):
            pass
        len(ListSubclass([1,2,3,4,4]))
        """
        )
>       assert next(node.infer()).as_string() == "5"

tests/brain/test_brain.py:1626:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
astroid/nodes/node_ng.py:170: in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = (<Call l.4 at 0x7f7aa0c26790>,), kwargs = {'context': <astroid.context.InferenceContext object at 0x7f7aa15e5280>}, generator = <generator object Call._infer at 0x7f7aa0eb4c80>

    def inner(
        *args: _P.args, **kwargs: _P.kwargs
    ) -> Generator[InferenceResult, None, None]:
        generator = func(*args, **kwargs)
        try:
            yield next(generator)
        except StopIteration as error:
            # generator is empty
            if error.args:
                raise InferenceError(**error.args[0]) from error
>           raise InferenceError(
                "StopIteration raised without any error information."
            ) from error
E           astroid.exceptions.InferenceError: StopIteration raised without any error information.

astroid/decorators.py:95: InferenceError
________________________________________________________ test_ctypes_redefined_types_members[c_buffer-bytes-<class 'ctypes.c_char'>] ________________________________________________________

c_type = 'c_buffer', builtin_type = 'bytes', type_code = "<class 'ctypes.c_char'>"

    @pytest.mark.parametrize(
        "c_type,builtin_type,type_code",
        [
            ("c_bool", "bool", "?"),
            ("c_byte", "int", "b"),
            ("c_char", "bytes", "c"),
            ("c_double", "float", "d"),
            pytest.param(
                "c_buffer",
                "bytes",
                "<class 'ctypes.c_char'>",
                marks=pytest.mark.xfail(
                    reason="c_buffer is Uninferable but for now we do not know why"
                ),
            ),
            ("c_float", "float", "f"),
            ("c_int", "int", "i"),
            ("c_int16", "int", "h"),
            ("c_int32", "int", "i"),
            ("c_int64", "int", "l"),
            ("c_int8", "int", "b"),
            ("c_long", "int", "l"),
            ("c_longdouble", "float", "g"),
            ("c_longlong", "int", "l"),
            ("c_short", "int", "h"),
            ("c_size_t", "int", "L"),
            ("c_ssize_t", "int", "l"),
            ("c_ubyte", "int", "B"),
            ("c_uint", "int", "I"),
            ("c_uint16", "int", "H"),
            ("c_uint32", "int", "I"),
            ("c_uint64", "int", "L"),
            ("c_uint8", "int", "B"),
            ("c_ulong", "int", "L"),
            ("c_ulonglong", "int", "L"),
            ("c_ushort", "int", "H"),
            ("c_wchar", "str", "u"),
        ],
    )
    def test_ctypes_redefined_types_members(c_type, builtin_type, type_code):
        """Test that the "value" and "_type_" member of each redefined types are
        correct.
        """
        src = f"""
        import ctypes
        x=ctypes.{c_type}("toto")
        x.value
        """
        node = extract_node(src)
        assert isinstance(node, nodes.NodeNG)
        node_inf = node.inferred()[0]
>       assert node_inf.pytype() == f"builtins.{builtin_type}"
E       AssertionError: assert Uninferable == 'builtins.bytes'
E        +  where Uninferable = Uninferable()
E        +    where Uninferable = Uninferable.pytype

tests/brain/test_ctypes.py:71: AssertionError
_____________________________________________________________________ test_dataclass_non_default_argument_after_default _____________________________________________________________________

    @pytest.mark.xfail(reason="Transforms returning Uninferable isn't supported.")
    def test_dataclass_non_default_argument_after_default() -> None:
        """Test that a non-default argument after a default argument is not allowed.

        This should succeed, but the dataclass brain is a transform
        which currently can't return an Uninferable correctly. Therefore, we can't
        set the dataclass ClassDef node to be Uninferable currently.
        Eventually it can be merged into test_dataclass_with_multiple_inheritance.
        """

        impossible = astroid.extract_node(
            """
        from dataclasses import dataclass

        @dataclass
        class BaseParent:
            required: bool

        @dataclass
        class FirstChild(BaseParent):
            ...

        @dataclass
        class SecondChild(BaseParent):
            optional: bool = False

        @dataclass
        class ThirdChild:
            other: bool = False

        @dataclass
        class ImpossibleGrandChild(FirstChild, SecondChild, ThirdChild):
            ...

        ImpossibleGrandChild() #@
        """
        )

>       assert next(impossible.infer()) is Uninferable
E       assert <Instance of .ImpossibleGrandChild at 0x140164632786832> is Uninferable
E        +  where <Instance of .ImpossibleGrandChild at 0x140164632786832> = next(<generator object NodeNG.infer at 0x7f7aa1d00dd0>)
E        +    where <generator object NodeNG.infer at 0x7f7aa1d00dd0> = <bound method NodeNG.infer of <Call l.24 at 0x7f7a9f465f70>>()
E        +      where <bound method NodeNG.infer of <Call l.24 at 0x7f7a9f465f70>> = <Call l.24 at 0x7f7a9f465f70>.infer

tests/brain/test_dataclasses.py:1173: AssertionError
________________________________________________________________ test_parse_module_with_invalid_type_comments_does_not_crash ________________________________________________________________

self = <astroid.builder.AstroidBuilder object at 0x7f7a9c545310>
data = '\n# op {\n#   name: "AssignAddVariableOp"\n#   input_arg {\n#     name: "resource"\n#     type: DT_RESOURCE\n#   }\n#...tr: "dtype"\n#   }\n#   attr {\n#     name: "dtype"\n#     type: "type"\n#   }\n#   is_stateful: true\n# }\na, b = 2\n'
modname = '', path = None

    def _data_build(
        self, data: str, modname: str, path: str | None
    ) -> tuple[nodes.Module, rebuilder.TreeRebuilder]:
        """Build tree node from data and add some informations."""
        try:
>           node, parser_module = _parse_string(
                data, type_comments=True, modname=modname
            )

astroid/builder.py:181:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
astroid/builder.py:480: in _parse_string
    parsed = parser_module.parse(
astroid/_ast.py:30: in parse
    return ast.parse(string, type_comments=type_comments)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

source = '\n# op {\n#   name: "AssignAddVariableOp"\n#   input_arg {\n#     name: "resource"\n#     type: DT_RESOURCE\n#   }\n#...: "dtype"\n#   }\n#   attr {\n#     name: "dtype"\n#     type: "type"\n#   }\n#   is_stateful: true\n# }\na, b = 2\n\n'
filename = '<unknown>', mode = 'exec'

    def parse(source, filename='<unknown>', mode='exec', *,
              type_comments=False, feature_version=None):
        """
        Parse the source into an AST node.
        Equivalent to compile(source, filename, mode, PyCF_ONLY_AST).
        Pass type_comments=True to get back type comments where the syntax allows.
        """
        flags = PyCF_ONLY_AST
        if type_comments:
            flags |= PyCF_TYPE_COMMENTS
        if isinstance(feature_version, tuple):
            major, minor = feature_version  # Should be a 2-tuple.
            assert major == 3
            feature_version = minor
        elif feature_version is None:
            feature_version = -1
        # Else it should be an int giving the minor version for 3.x.
>       return compile(source, filename, mode, flags,
                       _feature_version=feature_version)
E         File "<unknown>", line 6
E           #     type: DT_RESOURCE
E                       ^
E       SyntaxError: invalid syntax

/usr/lib64/python3.9/ast.py:50: SyntaxError

The above exception was the direct cause of the following exception:

    @pytest.mark.xfail(
        reason=(
            "The builtin ast module does not fail with a specific error "
            "for syntax error caused by invalid type comments."
        ),
    )
    def test_parse_module_with_invalid_type_comments_does_not_crash():
>       node = builder.parse(
            """
        # op {
        #   name: "AssignAddVariableOp"
        #   input_arg {
        #     name: "resource"
        #     type: DT_RESOURCE
        #   }
        #   input_arg {
        #     name: "value"
        #     type_attr: "dtype"
        #   }
        #   attr {
        #     name: "dtype"
        #     type: "type"
        #   }
        #   is_stateful: true
        # }
        a, b = 2
        """
        )

tests/test_builder.py:931:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
astroid/builder.py:303: in parse
    return builder.string_build(code, modname=module_name, path=path)
astroid/builder.py:151: in string_build
    module, builder = self._data_build(data, modname, path)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <astroid.builder.AstroidBuilder object at 0x7f7a9c545310>
data = '\n# op {\n#   name: "AssignAddVariableOp"\n#   input_arg {\n#     name: "resource"\n#     type: DT_RESOURCE\n#   }\n#...tr: "dtype"\n#   }\n#   attr {\n#     name: "dtype"\n#     type: "type"\n#   }\n#   is_stateful: true\n# }\na, b = 2\n'
modname = '', path = None

    def _data_build(
        self, data: str, modname: str, path: str | None
    ) -> tuple[nodes.Module, rebuilder.TreeRebuilder]:
        """Build tree node from data and add some informations."""
        try:
            node, parser_module = _parse_string(
                data, type_comments=True, modname=modname
            )
        except (TypeError, ValueError, SyntaxError) as exc:
>           raise AstroidSyntaxError(
                "Parsing Python code failed:\n{error}",
                source=data,
                modname=modname,
                path=path,
                error=exc,
            ) from exc
E           astroid.exceptions.AstroidSyntaxError: Parsing Python code failed:
E           invalid syntax (<unknown>, line 6)

astroid/builder.py:185: AstroidSyntaxError
________________________________________________________________________ InferenceTest.test_descriptor_are_callable _________________________________________________________________________

self = <tests.test_inference.InferenceTest testMethod=test_descriptor_are_callable>

    @pytest.mark.xfail(reason="Descriptors are not properly inferred as callable")
    def test_descriptor_are_callable(self):
        code = """
            class A:
                statm = staticmethod(open)
                clsm = classmethod('whatever')
        """
        ast = parse(code, __name__)
        statm = next(ast["A"].igetattr("statm"))
>       self.assertTrue(statm.callable())
E       AssertionError: Uninferable is not true

tests/test_inference.py:539: AssertionError
________________________________________________________________ InferenceTest.test_factory_methods_inside_binary_operation _________________________________________________________________

self = <tests.test_inference.InferenceTest testMethod=test_factory_methods_inside_binary_operation>

    @pytest.mark.xfail(
        reason="pathlib.Path cannot be inferred on Python 3.8",
    )
    def test_factory_methods_inside_binary_operation(self):
        node = extract_node(
            """
        from pathlib import Path
        h = Path("/home")
        u = h / "user"
        u #@
        """
        )
>       assert next(node.infer()).qname() == "pathlib.Path"
E       AssertionError: assert Uninferable == 'pathlib.Path'
E        +  where Uninferable = Uninferable()
E        +    where Uninferable = Uninferable.qname
E        +      where Uninferable = next(<generator object NodeNG.infer at 0x7f7a9c0fcc80>)
E        +        where <generator object NodeNG.infer at 0x7f7a9c0fcc80> = <bound method NodeNG.infer of <Name.u l.5 at 0x7f7a9b8d0fa0>>()
E        +          where <bound method NodeNG.infer of <Name.u l.5 at 0x7f7a9b8d0fa0>> = <Name.u l.5 at 0x7f7a9b8d0fa0>.infer

tests/test_inference.py:988: AssertionError
__________________________________________________________________________ InferenceTest.test_function_metaclasses __________________________________________________________________________

self = <tests.test_inference.InferenceTest testMethod=test_function_metaclasses>

    @pytest.mark.xfail(reason="Does not support function metaclasses")
    def test_function_metaclasses(self):
        # These are not supported right now, although
        # they will be in the future.
        ast_node = extract_node(
            """
        class BookMeta(type):
            author = 'Rushdie'

        def metaclass_function(*args):
            return BookMeta

        class Book(object, metaclass=metaclass_function):
            pass
        Book #@
        """
        )
        inferred = next(ast_node.infer())
        metaclass = inferred.metaclass()
>       self.assertIsInstance(metaclass, nodes.ClassDef)
E       AssertionError: <FunctionDef.metaclass_function l.5 at 0x7f7a9bf7c820> is not an instance of <class 'astroid.nodes.scoped_nodes.scoped_nodes.ClassDef'>

tests/test_inference.py:4033: AssertionError
_____________________________________________________________ InferenceTest.test_metaclass_arguments_are_classes_not_instances ______________________________________________________________

self = <tests.test_inference.InferenceTest testMethod=test_metaclass_arguments_are_classes_not_instances>

    @pytest.mark.xfail(reason="Metaclass arguments not inferred as classes")
    def test_metaclass_arguments_are_classes_not_instances(self):
        ast_node = extract_node(
            """
        class A(type):
            def test(cls): return cls
        A.test() #@
        """
        )
        # This is not supported yet
        inferred = next(ast_node.infer())
>       self.assertIsInstance(inferred, nodes.ClassDef)
E       AssertionError: <Instance of .A at 0x140164614188720> is not an instance of <class 'astroid.nodes.scoped_nodes.scoped_nodes.ClassDef'>

tests/test_inference.py:4210: AssertionError
__________________________________________________________________ TestInferencePropagation.test_call_context_propagation ___________________________________________________________________

self = <tests.test_inference.TestInferencePropagation object at 0x7f7aa2e42c70>

    @pytest.mark.xfail(reason="Relying on path copy")
    def test_call_context_propagation(self):
        n = extract_node(
            """
        def chest(a):
            return a * a
        def best(a, b):
            return chest(a)
        def test(a, b, c):
            return best(a, b)
        test(4, 5, 6) #@
        """
        )
>       assert next(n.infer()).as_string() == "16"
E       AssertionError: assert Uninferable == '16'
E        +  where Uninferable = Uninferable()
E        +    where Uninferable = Uninferable.as_string
E        +      where Uninferable = next(<generator object NodeNG.infer at 0x7f7a9f1d5d60>)
E        +        where <generator object NodeNG.infer at 0x7f7a9f1d5d60> = <bound method NodeNG.infer of <Call l.8 at 0x7f7aa2ec7430>>()
E        +          where <bound method NodeNG.infer of <Call l.8 at 0x7f7aa2ec7430>> = <Call l.8 at 0x7f7aa2ec7430>.infer

tests/test_inference.py:5703: AssertionError
______________________________________________________________________________ test_compare_identity[is-True] _______________________________________________________________________________

op = 'is', result = True

    @pytest.mark.xfail(reason="uninferable")
    @pytest.mark.parametrize(
        "op,result",
        [
            ("is", True),
            ("is not", False),
        ],
    )
    def test_compare_identity(op, result) -> None:
        code = f"""
        obj = object()
        obj {op} obj
        """
        node = extract_node(code)
        inferred = next(node.infer())
>       assert inferred.value == result
E       assert Uninferable == True
E        +  where Uninferable = Uninferable.value

tests/test_inference.py:5761: AssertionError
____________________________________________________________________________ test_compare_identity[is not-False] ____________________________________________________________________________

op = 'is not', result = False

    @pytest.mark.xfail(reason="uninferable")
    @pytest.mark.parametrize(
        "op,result",
        [
            ("is", True),
            ("is not", False),
        ],
    )
    def test_compare_identity(op, result) -> None:
        code = f"""
        obj = object()
        obj {op} obj
        """
        node = extract_node(code)
        inferred = next(node.infer())
>       assert inferred.value == result
E       assert Uninferable == False
E        +  where Uninferable = Uninferable.value

tests/test_inference.py:5761: AssertionError
___________________________________________________________________________________ test_compare_dynamic ____________________________________________________________________________________

    @pytest.mark.xfail(reason="unimplemented")
    def test_compare_dynamic() -> None:
        code = """
        class A:
            def __le__(self, other):
                return True
        A() <= None
        """
        node = extract_node(code)
        inferred = next(node.infer())
>       assert inferred.value is True
E       assert Uninferable is True
E        +  where Uninferable = Uninferable.value

tests/test_inference.py:5855: AssertionError
______________________________________________________________________________ test_compare_known_false_branch ______________________________________________________________________________

    @pytest.mark.xfail(reason="unimplemented")
    def test_compare_known_false_branch() -> None:
        code = """
        a = 'hello'
        if 1 < 2:
            a = 'goodbye'
        a
        """
        node = extract_node(code)
        inferred = list(node.infer())
>       assert len(inferred) == 1
E       assert 2 == 1
E        +  where 2 = len([<Const.str l.2 at 0x7f7a9c4eea90>, <Const.str l.4 at 0x7f7a9c4ee7c0>])

tests/test_inference.py:5898: AssertionError
_______________________________________________________________________ test_recursion_error_self_reference_type_call _______________________________________________________________________

    @pytest.mark.xfail(reason="Cannot fully infer all the base classes properly.")
    def test_recursion_error_self_reference_type_call() -> None:
        # Fix for https://github.com/pylint-dev/astroid/issues/199
        code = """
        class A(object):
            pass
        class SomeClass(object):
            route_class = A
            def __init__(self):
                self.route_class = type('B', (self.route_class, ), {})
                self.route_class() #@
        """
        node = extract_node(code)
        inferred = next(node.infer())
        assert isinstance(inferred, Instance)
        assert inferred.name == "B"
        # TODO: Cannot infer [B, A, object] but at least the recursion error is gone.
>       assert [cls.name for cls in inferred.mro()] == ["B", "A", "object"]
E       AssertionError: assert ['B', 'object'] == ['B', 'A', 'object']
E
E         At index 1 diff: 'object' != 'A'
E         Right contains one more item: 'object'
E         Use -v to get more diff

tests/test_inference.py:6873: AssertionError
__________________________________________________________ InstanceModelTest.test_instance_local_attributes_overrides_object_model __________________________________________________________

self = <tests.test_object_model.InstanceModelTest testMethod=test_instance_local_attributes_overrides_object_model>

    @pytest.mark.xfail(reason="Instance lookup cannot override object model")
    def test_instance_local_attributes_overrides_object_model(self):
        # The instance lookup needs to be changed in order for this to work.
        ast_node = builder.extract_node(
            """
        class A:
            @property
            def __dict__(self):
                  return []
        A().__dict__
        """
        )
        inferred = next(ast_node.infer())
>       self.assertIsInstance(inferred, astroid.List)
E       AssertionError: <Dict.dict l.2 at 0x7f7a9d2be400> is not an instance of <class 'astroid.nodes.node_classes.List'>

tests/test_object_model.py:71: AssertionError
___________________________________________________________________ FunctionModelTest.test_descriptor_not_inferrring_self ___________________________________________________________________

self = <tests.test_object_model.FunctionModelTest testMethod=test_descriptor_not_inferrring_self>

    @pytest.mark.xfail(reason="Descriptors cannot infer what self is")
    def test_descriptor_not_inferrring_self(self):
        # We can't infer __get__(X, Y)() when the bounded function
        # uses self, because of the tree's parent not being propagating good enough.
        result = builder.extract_node(
            """
        class A(object):
            x = 42
        def test(self): return self.x
        f = test.__get__(A(), A)
        f() #@
        """
        )
        result = next(result.infer())
>       self.assertIsInstance(result, astroid.Const)
E       AssertionError: Uninferable is not an instance of <class 'astroid.nodes.node_classes.Const'>

tests/test_object_model.py:390: AssertionError
================================================================================== short test summary info ==================================================================================
SKIPPED [1] tests/test_type_params.py:19: Requires Python 3.12 or higher
SKIPPED [1] tests/brain/numpy/test_core_einsumfunc.py:30: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_einsumfunc.py:44: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_fromnumeric.py:33: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_function_base.py:37: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_multiarray.py:104: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_multiarray.py:126: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_multiarray.py:82: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_multiarray.py:148: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_multiarray.py:170: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_numeric.py:42: This test requires the numpy library.
SKIPPED [4] tests/brain/numpy/test_core_numeric.py:60: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_numerictypes.py:296: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_numerictypes.py:307: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_numerictypes.py:335: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_numerictypes.py:209: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_numerictypes.py:97: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_numerictypes.py:267: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_numerictypes.py:90: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_umath.py:112: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_umath.py:119: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_umath.py:127: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_umath.py:173: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_umath.py:134: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_umath.py:195: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_umath.py:214: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_core_umath.py:153: This test requires the numpy library.
SKIPPED [4] tests/brain/numpy/test_ma.py:26: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_ndarray.py:127: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_ndarray.py:142: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_ndarray.py:157: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_random_mtrand.py:85: This test requires the numpy library.
SKIPPED [1] tests/brain/numpy/test_random_mtrand.py:92: This test requires the numpy library.
SKIPPED [1] astroid/test_utils.py:45: Needs Python <= 3.8. Current version is 3.9.18.final.0.
SKIPPED [1] tests/brain/test_brain.py:116: Needs Python 3 io model / doesn't work with plain pytest.use pytest -s for this test to work
SKIPPED [3] astroid/test_utils.py:45: Needs Python <= 3.9. Current version is 3.9.18.final.0.
SKIPPED [1] astroid/test_utils.py:43: Needs Python > 3.10. Current version is 3.9.18.final.0.
SKIPPED [1] tests/brain/test_nose.py:24: This test requires nose library.
SKIPPED [1] tests/brain/test_qt.py:24: These tests require the PyQt6 library.
SKIPPED [1] tests/brain/test_qt.py:44: These tests require the PyQt6 library.
SKIPPED [1] tests/brain/test_qt.py:59: These tests require the PyQt6 library.
SKIPPED [1] tests/brain/test_regex.py:19: This test requires the regex library.
SKIPPED [1] tests/brain/test_regex.py:27: This test requires the regex library.
SKIPPED [1] tests/brain/test_six.py:24: These tests require the six library
SKIPPED [1] tests/brain/test_six.py:67: These tests require the six library
SKIPPED [1] tests/brain/test_six.py:79: These tests require the six library
SKIPPED [1] tests/brain/test_six.py:120: These tests require the six library
SKIPPED [1] tests/brain/test_six.py:135: These tests require the six library
SKIPPED [1] tests/brain/test_six.py:93: These tests require the six library
SKIPPED [1] tests/test_group_exceptions.py:23: Requires Python 3.11 or higher
SKIPPED [1] tests/test_group_exceptions.py:54: Requires Python 3.11 or higher
SKIPPED [1] tests/test_group_exceptions.py:96: Requires Python 3.11 or higher
SKIPPED [1] tests/test_inference.py:3282: These tests require the six library
SKIPPED [1] tests/test_inference.py:3638: These tests require the six library
SKIPPED [1] tests/test_inference.py:3248: These tests require the six library
SKIPPED [1] tests/test_inference.py:4146: These tests require the six library
SKIPPED [1] tests/test_inference.py:4164: These tests require the six library
SKIPPED [1] tests/test_inference.py:6733: Exact inference with dataclasses (replace function) in python3.9
SKIPPED [1] tests/test_modutils.py:454: Backport valid on <=3.9
SKIPPED [1] tests/test_nodes.py:318: Uses 3.12 type param nodes
SKIPPED [1] tests/test_nodes.py:300: Uses 3.12 type param nodes
SKIPPED [1] tests/test_nodes.py:306: Uses 3.12 type param nodes
SKIPPED [1] tests/test_nodes.py:312: Uses 3.12 type param nodes
SKIPPED [1] tests/test_nodes.py:1707: pattern matching was added in PY310
SKIPPED [1] tests/test_nodes.py:1762: pattern matching was added in PY310
SKIPPED [1] tests/test_nodes.py:1816: pattern matching was added in PY310
SKIPPED [1] tests/test_nodes.py:1866: pattern matching was added in PY310
SKIPPED [1] tests/test_nodes.py:1942: pattern matching was added in PY310
SKIPPED [1] tests/test_nodes_lineno.py:23: end_lineno and end_col_offset were added in PY38
SKIPPED [1] tests/test_nodes_lineno.py:1045: pattern matching was added in PY310
SKIPPED [1] tests/test_protocols.py:347: Match requires python 3.10
SKIPPED [1] tests/test_protocols.py:366: Match requires python 3.10
SKIPPED [1] tests/test_protocols.py:386: Match requires python 3.10
SKIPPED [1] tests/test_protocols.py:422: Generic typing syntax requires python 3.12
SKIPPED [1] tests/test_protocols.py:430: Generic typing syntax requires python 3.12
SKIPPED [1] tests/test_protocols.py:438: Generic typing syntax requires python 3.12
SKIPPED [1] tests/test_regrtest.py:86: Needs numpy
SKIPPED [1] tests/test_regrtest.py:102: Needs numpy
SKIPPED [1] tests/test_scoped_nodes.py:1441: These tests require the six library
SKIPPED [1] tests/test_scoped_nodes.py:1455: These tests require the six library
SKIPPED [1] tests/test_scoped_nodes.py:1484: These tests require the six library
SKIPPED [1] tests/test_scoped_nodes.py:1656: These tests require the six library
XFAIL tests/brain/test_brain.py::TestLenBuiltinInference::test_int_subclass_argument - Can't use list special astroid fields
XFAIL tests/brain/test_ctypes.py::test_ctypes_redefined_types_members[c_buffer-bytes-<class 'ctypes.c_char'>] - c_buffer is Uninferable but for now we do not know why
XFAIL tests/brain/test_dataclasses.py::test_dataclass_non_default_argument_after_default - Transforms returning Uninferable isn't supported.
XFAIL tests/test_builder.py::test_parse_module_with_invalid_type_comments_does_not_crash - The builtin ast module does not fail with a specific error for syntax error caused by invalid type comments.
XFAIL tests/test_inference.py::InferenceTest::test_descriptor_are_callable - Descriptors are not properly inferred as callable
XFAIL tests/test_inference.py::InferenceTest::test_factory_methods_inside_binary_operation - pathlib.Path cannot be inferred on Python 3.8
XFAIL tests/test_inference.py::InferenceTest::test_function_metaclasses - Does not support function metaclasses
XFAIL tests/test_inference.py::InferenceTest::test_metaclass_arguments_are_classes_not_instances - Metaclass arguments not inferred as classes
XFAIL tests/test_inference.py::TestInferencePropagation::test_call_context_propagation - Relying on path copy
XFAIL tests/test_inference.py::test_compare_identity[is-True] - uninferable
XFAIL tests/test_inference.py::test_compare_identity[is not-False] - uninferable
XFAIL tests/test_inference.py::test_compare_dynamic - unimplemented
XFAIL tests/test_inference.py::test_compare_known_false_branch - unimplemented
XFAIL tests/test_inference.py::test_recursion_error_self_reference_type_call - Cannot fully infer all the base classes properly.
XFAIL tests/test_object_model.py::InstanceModelTest::test_instance_local_attributes_overrides_object_model - Instance lookup cannot override object model
XFAIL tests/test_object_model.py::FunctionModelTest::test_descriptor_not_inferrring_self - Descriptors cannot infer what self is
FAILED tests/test_manager.py::IsolatedAstroidManagerTest::test_no_user_warning - astroid.exceptions.AstroidImportError: Failed to import module pip with error:
================================================================== 1 failed, 1573 passed, 90 skipped, 16 xfailed in 22.75s ==================================================================
List of installed modules in build env:
Package                       Version
----------------------------- -----------
alabaster                     0.7.16
Babel                         2.14.0
build                         1.1.1
charset-normalizer            3.3.2
distro                        1.9.0
dnf                           4.19.0
docutils                      0.20.1
exceptiongroup                1.1.3
gpg                           1.23.2
idna                          3.6
imagesize                     1.4.1
importlib_metadata            7.0.1
iniconfig                     2.0.0
installer                     0.7.0
Jinja2                        3.1.3
lazy-object-proxy             1.10.0
libdnf                        0.73.0
MarkupSafe                    2.1.3
packaging                     24.0
pluggy                        1.4.0
Pygments                      2.17.2
pyproject_hooks               1.0.0
pytest                        8.1.1
python-dateutil               2.9.0.post0
requests                      2.31.0
setuptools                    69.1.1
snowballstemmer               2.2.0
Sphinx                        7.2.6
sphinxcontrib-applehelp       1.0.8
sphinxcontrib-devhelp         1.0.5
sphinxcontrib-htmlhelp        2.0.5
sphinxcontrib-jsmath          1.0.1
sphinxcontrib-qthelp          1.0.7
sphinxcontrib-serializinghtml 1.1.10
tokenize_rt                   5.2.0
tomli                         2.0.1
typing_extensions             4.10.0
urllib3                       1.26.18
wheel                         0.43.0
wrapt                         1.16.0
zipp                          3.17.0

Please let me know if you need more details or want me to perform some diagnostics.

@jacobtylerwalls
Copy link
Member

Thanks for the report. I guess we could just skip this test if pip is not available.

@jacobtylerwalls jacobtylerwalls changed the title 3.1.0: pytest fails in tests/test_manager.py::IsolatedAstroidManagerTest::test_no_user_warning unit test_no_user_warning assumes pip is available Mar 24, 2024
@jacobtylerwalls jacobtylerwalls added Good first issue Friendly and approachable by new contributors Needs PR This issue is accepted, sufficiently specified and now needs an implementation labels Mar 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Good first issue Friendly and approachable by new contributors Needs PR This issue is accepted, sufficiently specified and now needs an implementation
Projects
None yet
Development

No branches or pull requests

2 participants