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

Crash when adding pylint_flask_sqlalchemy to the --load-plugins in pycharm #9388

Closed
elanor-sparx opened this issue Jan 25, 2024 · 1 comment
Labels
Downstream Bug 🪲 The problem happens in a lib depending on pylint, not pylint

Comments

@elanor-sparx
Copy link

elanor-sparx commented Jan 25, 2024

Bug description

When parsing the following a.py:

Proprietary code removed

Pycharm external tools arguments used to create the crash:

--msg-template="/Users/xxx/code/xxxtools/python/dashboard/{path}:{line}:{column}:{C}:({symbol}){msg}"
--load-plugins="pylint_flask,pylint_flask_sqlalchemy"
$FileDir$

There is no crash when I instead use:

--msg-template="/Users/xxx/code/xxxtools/python/dashboard/{path}:{line}:{column}:{C}:({symbol}){msg}"
--load-plugins="pylint_flask"
$FileDir$

Becomes:

/Users/xxx/code/xxxtools/python/dashboard/venv/bin/pylint --msg-template=/Users/xxx/code/xxxtools/python/dashboard/{path}:{line}:{column}:{C}:({symbol}){msg} --load-plugins=pylint_flask,pylint_flask_sqlalchemy /Users/xxx/code/xxxtools/python/dashboard/app/admin

Error I was trying to get rid of by including pylint_flask_sqlalchemy:

E:(no-member)Instance of 'SQLAlchemy' has no 'func' member

on code line

x = MyObject.query.filter(
        db.func.date(MyObject.timestamp) == given_date
    ).order_by(MyObject.timestamp.desc())

Other issues with AstroidErrors: #8842, #9139
Reason I am submitting a fresh issue: The above issues don't mention plugins. This is almost certainly an issue with pylint_flask_sqlalchemy, but perhaps pylint might be able to fail gracefully when a plugin blows up.

Command used

pylint a.py

Pylint output

pylint crashed with a ``AstroidError`` and with the following stacktrace:
Traceback (most recent call last):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 788, in _lint_file
    check_astroid_module(module)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 1017, in check_astroid_module
    retval = self._check_astroid_module(
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 1069, in _check_astroid_module
    walker.walk(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/utils/ast_walker.py", line 94, in walk
    self.walk(child)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/utils/ast_walker.py", line 91, in walk
    callback(astroid)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/checkers/variables.py", line 2059, in visit_importfrom
    self._check_module_attrs(node, module, name.split("."))
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/checkers/variables.py", line 3066, in _check_module_attrs
    module = next(module.getattr(name)[0].infer())
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_ng.py", line 169, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 90, in inner
    yield next(generator)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/bases.py", line 179, in _infer_stmts
    for inf in stmt.infer(context=context):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_ng.py", line 169, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 90, in inner
    yield next(generator)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_classes.py", line 1756, in _infer
    for callee in self.func.infer(context):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_ng.py", line 169, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 90, in inner
    yield next(generator)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/bases.py", line 179, in _infer_stmts
    for inf in stmt.infer(context=context):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_ng.py", line 169, in infer
    for i, result in enumerate(self._infer(context=context, **kwargs)):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 90, in inner
    yield next(generator)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/decorators.py", line 49, in wrapped
    for res in _func(node, context, **kwargs):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/node_classes.py", line 2863, in _infer
    module = self.do_import_module()
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/_base_nodes.py", line 168, in do_import_module
    return mymodule.import_module(
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/nodes/scoped_nodes/scoped_nodes.py", line 453, in import_module
    return AstroidManager().ast_from_module_name(
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/manager.py", line 259, in ast_from_module_name
    return self.ast_from_file(found_spec.location, modname, fallback=False)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/manager.py", line 151, in ast_from_file
    return AstroidBuilder(self).file_build(filepath, modname)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/builder.py", line 140, in file_build
    return self._post_build(module, builder, encoding)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/builder.py", line 168, in _post_build
    module = self._manager.visit_transforms(module)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/manager.py", line 114, in visit_transforms
    return self._transform.visit(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 151, in visit
    return self._visit(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 81, in _visit
    visited = self._visit_generic(value)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 112, in _visit_generic
    return [self._visit_generic(child) for child in node]
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 112, in <listcomp>
    return [self._visit_generic(child) for child in node]
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 118, in _visit_generic
    return self._visit(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 84, in _visit
    return self._transform(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/astroid/transforms.py", line 66, in _transform
    ret = transform_func(node)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint_flask_sqlalchemy/__init__.py", line 24, in transform
    cls.locals[key] = [ClassDef(key, None)]
TypeError: __init__() missing 2 required positional arguments: 'col_offset' and 'parent'

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

Traceback (most recent call last):
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 752, in _lint_files
    self._lint_file(fileitem, module, check_astroid_module)
  File "/Users/xxx/code/xxxtools/python/dashboard/venv/lib/python3.9/site-packages/pylint/lint/pylinter.py", line 790, in _lint_file
    raise astroid.AstroidError from e
astroid.exceptions.AstroidError

Expected behavior

No crash.

Pylint version

pylint 3.0.3
astroid 3.0.2
Python 3.9.6 (default, Nov 10 2023, 13:38:27) 
[Clang 15.0.0 (clang-1500.1.0.2.5)]

OS / Environment

darwin (Darwin)

Additional dependencies

@jacobtylerwalls
Copy link
Member

Thanks for the report. I think it's better that pylint/astroid fail catastrophically so that plugin users/authors are aware of the incompatibility.

The issue with ClassDef instantation should be reported to the plugin.

@jacobtylerwalls jacobtylerwalls closed this as not planned Won't fix, can't repro, duplicate, stale Jan 25, 2024
@jacobtylerwalls jacobtylerwalls added the Downstream Bug 🪲 The problem happens in a lib depending on pylint, not pylint label Jan 25, 2024
@jacobtylerwalls jacobtylerwalls modified the milestone: 3.2.3 Jun 5, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Downstream Bug 🪲 The problem happens in a lib depending on pylint, not pylint
Projects
None yet
Development

No branches or pull requests

2 participants