palantir / python-language-server

An implementation of the Language Server Protocol for Python
MIT License
2.61k stars 283 forks source link

pylintrc not respected in subfolder #616

Open chthor opened 5 years ago

chthor commented 5 years ago

I have the following structure:

root/
  .pylintrc
  wtf.py
  wtf/
    wtf.py
# wtf.py (identical both times)
X = 1
# .pylintrc
[MASTER]
disable=missing-docstring

pylint is ok with both files:

root $ pylint wtf.py

--------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00)

root $ pylint wtf/wtf.py

--------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00)

I'm running Neovim with LanguageClient-Neovim.

# .vimrc
let g:LanguageClient_serverCommands = {
  \ 'python': ['/usr/local/bin/pyls'],
  \ }

The top-level wtf.py works as expected:

# wtf.py
X = 1  <no warnings here>

But the subfolder version of wtf.py does not respect the pylintrc. I get the missing-docstring warning:

# wtf/wtf.py
X = 1 [missing-docstring] Missing module docstring

Why does pylintrc not apply to the subfolder?

jml commented 5 years ago

I'm being hit by this too, except in Emacs.

From the logs:

2019-07-26 17:44:36,577 UTC - DEBUG - pyls.plugins.pylint_lint - Calling pylint with '/Users/jml/src/myproject/somefolder/another/thingy.py -f json '

The results of this command change depending on which directory it runs in.

From /Users/jml: lots of errors, pylintrc not respected From /Users/jml/src/myproject/ (where my pylintrc lives): no errors, pylintrc respected From /Users/jml/src/myproject/somefolder/another/: lots of errors, same as /Users/jml

There's an args setting that the pylint plugin takes (see https://github.com/palantir/python-language-server/blob/697ebb162804459587f05131fd1a42c45ebfbf05/pyls/plugins/pylint_lint.py#L144) but I haven't yet been able to figure out how to actually set it. Will update here if I do.

I guess you could make an argument that pylint (and other external processes) should be run from the project root as a matter of course, which would make this problem go away.

chthor commented 5 years ago

@jml In my case the problem was a missing __init__.py in the subfolders in question, so they were not acting as proper Python packages. Adding __init__.py resolved my issue. (Not sure if that's relevant to your problem?)

jml commented 5 years ago

Ooh, that's a likely explanation. I haven't verified experimentally, but there are definitely directories missing __init__.py files.

youben11 commented 4 years ago

.pylintrc files aren't used for linting by pyls for the moment, the way you can configure pylint is by passing a list of arguments (the same arguments you would pass when using the pylint command line tool) like @jml said. In the vscode client you can update "pyls.plugins.pylint.args" to list your agruments in the vscode/package.json file.

noctuid commented 4 years ago

Yeah pylintrc is not respected anywhere for me. This issue seems to me to be a feature request for that (though the title should be edited) unless there is already another open issue I missed.

youben11 commented 4 years ago

@gatesn I think we should add support for pylint config files as it doesn't seem really obvious to pass config through "pyls.plugins.pylint.args".

gatesn commented 4 years ago

Yep, agree. I don’t think it should be too hard either since we shell out to pylint - so we should be able to have it discover it’s own config instead of parsing it ourselves

youben11 commented 4 years ago

@chthor the reason why it's not using the .pylintrc config in the subfolder is because pylint is ran under that exact subfolder which doesn't contain a .pylintrc. We should get this fixed by parsing the config file on startup and passing that config to every run of pylint as arguments.

UPDATE: pylint isn't ran under that subfolder, but the fix should still make pylint have the same behavour while linting all project files.