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

Class io.StringIO has abstract attributes. #720

Open
andrewleech opened this issue May 30, 2023 · 2 comments
Open

Class io.StringIO has abstract attributes. #720

andrewleech opened this issue May 30, 2023 · 2 comments
Assignees
Labels
mypy report Typecheck issue reported by mypy Quality QA of published stubs

Comments

@andrewleech
Copy link

I've just updated to micropython_stm32_stubs-1.20.0.post1 and getting some new mypy errors flagged in io.pyi:

tools/typings/io.pyi:22: error: Class io.StringIO has abstract attributes "__enter__", "__exit__", "__iter__", "__next__", "fileno", "isatty", "readable", "readlines", "seekable", "truncate", "writable", "writelines"  [misc]
tools/typings/io.pyi:22: note: If it is meant to be abstract, add 'abc.ABCMeta' as an explicit metaclass
tools/typings/io.pyi:34: error: Class io.BytesIO has abstract attributes "__enter__", "__exit__", "__iter__", "__next__", "fileno", "isatty", "readable", "readlines", "seekable", "truncate", "writable", "writelines"  [misc]
tools/typings/io.pyi:34: note: If it is meant to be abstract, add 'abc.ABCMeta' as an explicit metaclass

Both StringIO and BytesIO have typing.IO as their base which have these abstract functions defined, but not expected to be present in StringIO and BytesIO.

I know mypy usage isn't officially supported, but thought I'd share this as I didn't see it in the previous version.

@Josverl
Copy link
Owner

Josverl commented Jun 1, 2023

Thanks for the report, I've tried to test with mypy before, but that reported too many errors then.

If you can share your mypy setup / config then I'm happy to look into this, and add it to the test suite.

I suspect that there is a conflict between the two copies of io.pyi, one of them in micropython-stdlib-stubs , but that is just a hunch

@andrewleech
Copy link
Author

andrewleech commented Jun 5, 2023

I've got a local copy of typing checked into my repo that was installed with

pip install -U  micropython-stm32-stubs --target tools/typings --no-user

I'm using mypy on just my firmware src code via pre-commit

My .pre-commit-config.yaml looks similar to:

files: "^src/firmware"

repos:
  - repo: https://github.com/ambv/black
    rev: 22.3.0
    hooks:
      - id: black
        args: [
            "--fast", # Match micropython black configuration
            "--line-length=99", # Match micropython black configuration
          ]

  - repo: https://github.com/charliermarsh/ruff-pre-commit
    # Ruff version.
    rev: "v0.0.261"
    hooks:
      - id: ruff
        args: ["--fix"]
        additional_dependencies:
          ["micropython-stm32-stubs"]

  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: "v1.2.0"
    hooks:
      - id: mypy
        additional_dependencies:
          ["micropython-stm32-stubs"]

and then tool / mypy settings are in pyproject.toml

[tool.mypy]

mypy_path = '''
tools/typings:
src/libs/microdot/microdot-asyncio:
src/libs/microdot/src:
'''

# Allow use of own stubs library in tools/typings
# https://micropython-stubs.readthedocs.io/en/main/28_mypy.html

use_builtins_fixtures = true
no_site_packages = true

# Don't check imported (library/stub) modules.
follow_imports = "skip"
follow_imports_for_stubs = false

# Note: pre-commit sends all changed files explicitly to mypy,
# bypassing this exclude setting. Ensure pre-commit settings
# limit checked files appropriately.
exclude = [
    'tools/typings/',
    'src/micropython/',
    'src/libs/',
]

[[tool.mypy.overrides]]
# Ignore mypy errors in stubs
module = [
    'stdlib.os',
    'pyb',
    'machine',
    'uasyncio.*',
    'manifest',
]
ignore_errors = true

[tool.ruff]
# Enable pycodestyle (`E`) and Pyflakes (`F`) codes by default.
select = ["E", "F"]
ignore = []

# Allow autofix for all enabled rules (when `--fix`) is provided.
fixable = ["A", "B", "C", "D", "E", "F", "G", "I", "N", "Q", "S", "T", "W", "ANN", "ARG", "BLE", "COM", "DJ", "DTZ", "EM", "ERA", "EXE", "FBT", "ICN", "INP", "ISC", "NPY", "PD", "PGH", "PIE", "PL", "PT", "PTH", "PYI", "RET", "RSE", "RUF", "SIM", "SLF", "TCH", "TID", "TRY", "UP", "YTT"]
unfixable = []

builtins = ["const"]

# Exclude a variety of commonly ignored directories.
exclude = [
    ".bzr",
    ".direnv",
    ".eggs",
    ".git",
    ".hg",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "venv",
    "tools/typings",
]

# Same as our configuration of Black.
line-length = 99

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

# Assume Python 3.10.
target-version = "py310"

# Avoid automatically removing unused imports in __init__.py files.
ignore-init-module-imports = true

typing-modules = ["micropython-stm32-stubs"]

[tool.ruff.mccabe]
# Unlike Flake8, default to a complexity level of 10.
max-complexity = 10

[tool.ruff.per-file-ignores]
"manifest.py" = ["F821"]  # "Undefined name" for eg. freeze, include, etc.

I'm explicitely excluding a few (typing) modules in the tool.mypy.overrides section above as they were failing mypy, but for the most part I'm getting good support from this configuraion of mypy and micropython-stm32-stubs

@Josverl Josverl added the Quality QA of published stubs label Dec 15, 2023
@Josverl Josverl added the mypy report Typecheck issue reported by mypy label Dec 29, 2023
@Josverl Josverl self-assigned this Dec 29, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
mypy report Typecheck issue reported by mypy Quality QA of published stubs
Projects
None yet
Development

No branches or pull requests

2 participants