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

Target using pytest fail with "Untyped decorator makes function untyped" #35

Open
wbekerom opened this issue Jan 19, 2021 · 2 comments
Open

Comments

@wbekerom
Copy link

I just implemented this integration and for the most part things went smooth. But now I stumbled into a case that I cannot seem to solve, see the example below.

Running below in a virtual env where pytest is installed works, however running it from the base env (without pytest) fails. All other pip depencies do get loaded correctly via bazel, only a few pytest decorators give errors. Running mypy test_foo.py also passes in the virutalenv (using the same mypy.ini file).

I'm relatively new to bazel and mypy, so not sure where to start digging. Any thoughts?

WORKSPACE

workspace(name = "myproject")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

#############################################################################
# Python Rules
#############################################################################
http_archive(
    name = "rules_python",
    sha256 = "b6d46438523a3ec0f3cead544190ee13223a52f6a6765a29eae7b7cc24cc83a0",
    url = "https://github.com/bazelbuild/rules_python/releases/download/0.1.0/rules_python-0.1.0.tar.gz",
)
load("@rules_python//python:repositories.bzl", "py_repositories")
py_repositories()
load("@rules_python//python:pip.bzl", "pip_install")

# Create a central repo that knows about the dependencies needed for
# requirements.txt.
pip_install(
    name = "eng_pip_deps",
    requirements = "//:requirements.txt",
)

#############################################################################
# Mypy aspect plugin
#############################################################################
mypy_integration_version = "0.1.0"  # latest @ November 15th 2020
http_archive(
    name = "mypy_integration",
    sha256 = "511ca642294129b7abebf6afd48aa63e7d91de3ec5fa0689d60d1dc6a94a7d1a",
    strip_prefix = "bazel-mypy-integration-{version}".format(version = mypy_integration_version),
    url = "https://github.com/thundergolfer/bazel-mypy-integration/archive/{version}.tar.gz".format(
        version = mypy_integration_version,
    ),
)
load(
    "@mypy_integration//repositories:repositories.bzl",
    mypy_integration_repositories = "repositories",
)
mypy_integration_repositories()
load("@mypy_integration//:config.bzl", "mypy_configuration")
mypy_configuration(mypy_config_file = "//:mypy.ini")
load("@mypy_integration//repositories:deps.bzl", mypy_integration_deps = "deps")
mypy_integration_deps(mypy_requirements_file = "//:mypy_version.txt")

BUILD

load("@eng_pip_deps//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_test")

py_test(
    name = "test_foo",
    srcs = ["test_foo.py"],
    python_version = "PY3",
    deps = [
        requirement("pytest"),
        requirement("pytest-asyncio"),
    ],
)

test_foo.py

import pytest

@pytest.mark.asyncio
async def test_foo_noop() -> None:
    pass

result

$ bazel build //:test_foo                                                                                                                                                                       [16:49:26]
(16:49:33) INFO: Current date is 2021-01-19
(16:49:33) INFO: Analyzed target //:test_foo (0 packages loaded, 0 targets configured).
(16:49:33) INFO: Found 1 target...
(16:49:34) ERROR: /home/myproject/BUILD:4:8: Couldn't build file test_foo_dummy_out: Type-checking //:test_foo failed (Exit 1): test_foo_mypy_exe failed: error executing command bazel-out/k8-fastbuild/bin/test_foo_mypy_exe

Use --sandbox_debug to see verbose messages from the sandbox test_foo_mypy_exe failed: error executing command bazel-out/k8-fastbuild/bin/test_foo_mypy_exe

Use --sandbox_debug to see verbose messages from the sandbox
test_foo.py:3: error: Untyped decorator makes function "test_foo_noop" untyped
    @pytest.mark.asyncio
     ^
Found 1 error in 1 file (checked 1 source file)
Aspect @mypy_integration//:mypy.bzl%mypy_aspect of //:test_foo failed to build
Use --verbose_failures to see the command lines of failed build steps.
(16:49:34) INFO: Elapsed time: 1.803s, Critical Path: 1.61s
(16:49:34) INFO: 2 processes: 2 internal.
(16:49:34) FAILED: Build did NOT complete successfully
FAIL
@wbekerom
Copy link
Author

To add to this, I noted that I was ignoring missing imports for mypy-pytest.*. I now removed this such that my ini looks like:

mypy.ini

[mypy]
pretty = True
strict = True

And I get the following from bazel build:

test_foo.py:2: error: Cannot find implementation or library stub for module
named 'pytest'
    import pytest
    ^
test_foo.py:2: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
test_foo.py:5: error: Untyped decorator makes function "test_foo_noop" untyped
    @pytest.mark.asyncio
     ^
Found 2 errors in 1 file (checked 1 source file)

The folder bazel-out/k8-fastbuild/bin/test_foo.runfiles/eng_pip_deps/pypi__pytest does exist, but for some reason mypy cannot find it.

When running mypy directly on a virtualenv with only pytest installed it passes.

@thundergolfer
Copy link
Collaborator

Thanks for the issue report. The main repo I work on that has the integration in use has:

[mypy-pytest]
ignore_missing_imports = True

So there's likely something going wrong here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants