# SPDX-License-Identifier: MIT import json import os.path import shutil import subprocess import sys import pytest import attr if sys.version_info < (3, 6): _found_pyright = False else: _found_pyright = shutil.which("pyright") @attr.s(frozen=True) class PyrightDiagnostic(object): severity = attr.ib() message = attr.ib() @pytest.mark.skipif(not _found_pyright, reason="Requires pyright.") def test_pyright_baseline(): """The __dataclass_transform__ decorator allows pyright to determine attrs decorated class types. """ test_file = os.path.dirname(__file__) + "/dataclass_transform_example.py" pyright = subprocess.run( ["pyright", "--outputjson", str(test_file)], capture_output=True ) pyright_result = json.loads(pyright.stdout) diagnostics = set( PyrightDiagnostic(d["severity"], d["message"]) for d in pyright_result["generalDiagnostics"] ) # Expected diagnostics as per pyright 1.1.135 expected_diagnostics = { PyrightDiagnostic( severity="information", message='Type of "Define.__init__" is' ' "(self: Define, a: str, b: int) -> None"', ), PyrightDiagnostic( severity="information", message='Type of "DefineConverter.__init__" is ' '"(self: DefineConverter, with_converter: int) -> None"', ), PyrightDiagnostic( severity="information", message='Type of "d.a" is "Literal[\'new\']"', ), PyrightDiagnostic( severity="error", message='Cannot assign member "a" for type ' '"FrozenDefine"\n\xa0\xa0"FrozenDefine" is frozen', ), PyrightDiagnostic( severity="information", message='Type of "d2.a" is "Literal[\'new\']"', ), } assert diagnostics == expected_diagnostics