Skip to content

Fix wrong configuration being used with multiple workspace folders #13

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

Merged
merged 2 commits into from
Jul 3, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions mypy_ls/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@

log = logging.getLogger(__name__)

mypyConfigFile: Optional[str] = None
# A mapping from workspace path to config file path
mypyConfigFileMap: Dict[str, Optional[str]] = dict()

tmpFile: Optional[IO[str]] = None

Expand Down Expand Up @@ -157,6 +158,7 @@ def pylsp_lint(
)
return last_diagnostics[document.path]

mypyConfigFile = mypyConfigFileMap.get(workspace.root_path)
if mypyConfigFile:
args.append("--config-file")
args.append(mypyConfigFile)
Expand Down Expand Up @@ -250,10 +252,10 @@ def init(workspace: str) -> Dict[str, str]:
with open(path) as file:
configuration = eval(file.read())

global mypyConfigFile
mypyConfigFile = findConfigFile(workspace, "mypy.ini")
if not mypyConfigFile:
mypyConfigFile = findConfigFile(workspace, ".mypy.ini")
mypyConfigFileMap[workspace] = mypyConfigFile

if ("enabled" not in configuration or configuration["enabled"]) and (
"live_mode" not in configuration or configuration["live_mode"]
Expand Down
38 changes: 37 additions & 1 deletion test/test_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ def test_settings():
def test_plugin(workspace):
config = FakeConfig()
doc = Document(DOC_URI, workspace, DOC_TYPE_ERR)
workspace = None
plugin.pylsp_settings(config)
diags = plugin.pylsp_lint(config, workspace, doc, is_saved=False)

Expand Down Expand Up @@ -84,3 +83,40 @@ def test_parse_line_with_context(monkeypatch, word, bounds, workspace):
assert diag["message"] == '"Request" has no attribute "id"'
assert diag["range"]["start"] == {"line": 278, "character": bounds[0]}
assert diag["range"]["end"] == {"line": 278, "character": bounds[1]}


def test_multiple_workspaces(tmpdir):
DOC_SOURCE = """
def foo():
return
unreachable = 1
"""
DOC_ERR_MSG = "Statement is unreachable"

# Initialize two workspace folders.
folder1 = tmpdir.mkdir("folder1")
ws1 = Workspace(uris.from_fs_path(str(folder1)), Mock())
ws1._config = Config(ws1.root_uri, {}, 0, {})
folder2 = tmpdir.mkdir("folder2")
ws2 = Workspace(uris.from_fs_path(str(folder2)), Mock())
ws2._config = Config(ws2.root_uri, {}, 0, {})

# Create configuration file for workspace folder 1.
mypy_config = folder1.join("mypy.ini")
mypy_config.write("[mypy]\nwarn_unreachable = True")

# Initialize settings for both folders.
plugin.pylsp_settings(ws1._config)
plugin.pylsp_settings(ws2._config)

# Test document in workspace 1 (uses mypy.ini configuration).
doc1 = Document(DOC_URI, ws1, DOC_SOURCE)
diags = plugin.pylsp_lint(ws1._config, ws1, doc1, is_saved=False)
assert len(diags) == 1
diag = diags[0]
assert diag["message"] == DOC_ERR_MSG

# Test document in workspace 2 (without mypy.ini configuration)
doc2 = Document(DOC_URI, ws2, DOC_SOURCE)
diags = plugin.pylsp_lint(ws2._config, ws2, doc2, is_saved=False)
assert len(diags) == 0