Skip to content

Commit 3a21661

Browse files
Copilotsobolevn
andauthored
Update mypy from <1.18 to <1.21 (support through 1.20.1) (#2373)
* Fix typesafety test expectations for mypy 1.18 changes - Update 'Cannot infer type argument N' → 'Cannot infer value of type parameter X' - Remove no longer emitted '"Never" not callable' error - Remove no longer emitted 'erased type of self' errors Agent-Logs-Url: https://github.com/dry-python/returns/sessions/f332ee3a-c556-47ec-a276-8119a6a98aca Co-authored-by: sobolevn <4660275+sobolevn@users.noreply.github.com> * Update mypy support to 1.20.1 and fix all typesafety test expectations - Update mypy version constraint from >=1.12,<1.18 to >=1.12,<1.21 - Fix builtins.X → X display changes in all typesafety YAML tests (mypy 1.20) - Fix TypeVar backtick suffix removal in revealed types (mypy 1.20) - Fix 'Cannot infer type argument N' → 'Cannot infer value of type parameter X' (mypy 1.18) - Remove no longer emitted 'Never not callable' and 'erased type of self' errors (mypy 1.18) - Remove no longer emitted 'defined here' note (mypy 1.20) - Remove unused type: ignore comment in test_pickle.py (mypy 1.20 improvement) Agent-Logs-Url: https://github.com/dry-python/returns/sessions/f332ee3a-c556-47ec-a276-8119a6a98aca Co-authored-by: sobolevn <4660275+sobolevn@users.noreply.github.com> * Bump mypy minimum to 1.19, regenerate lock file, clean up dead version checks - Bump mypy version constraint from >=1.12,<1.21 to >=1.19,<1.21 - Regenerate poetry.lock to fix CI (lock file was out of sync) - Remove dead version-check code for mypy < 1.16 in plugin (analyze_member_access msg parameter handling no longer needed) - Remove unused imports (importlib.metadata.version, typing.Any) Agent-Logs-Url: https://github.com/dry-python/returns/sessions/ec3a5de7-f5a3-49a4-a973-9265d6a4555e Co-authored-by: sobolevn <4660275+sobolevn@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sobolevn <4660275+sobolevn@users.noreply.github.com>
1 parent ef94591 commit 3a21661

File tree

143 files changed

+950
-862
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

143 files changed

+950
-862
lines changed

poetry.lock

Lines changed: 161 additions & 46 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ dependencies.python = "^3.10"
3535
dependencies.typing-extensions = ">=4.0,<5.0"
3636
dependencies.pytest = { version = ">=8,<10", optional = true }
3737
dependencies.hypothesis = { version = "^6.151", optional = true }
38-
dependencies.mypy = { version = ">=1.12,<1.18", optional = true }
38+
dependencies.mypy = { version = ">=1.19,<1.21", optional = true }
3939
extras.compatible-mypy = [ "mypy" ]
4040
extras.check-laws = [ "pytest", "hypothesis" ]
4141
group.dev.dependencies.anyio = "^4.3"

returns/contrib/mypy/_features/kind.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
from collections.abc import Sequence
22
from enum import Enum, unique
3-
from importlib.metadata import version
4-
from typing import Any
53

64
from mypy.checkmember import analyze_member_access
75
from mypy.plugin import (
@@ -63,13 +61,6 @@ def attribute_access(ctx: AttributeContext) -> MypyType:
6361
else:
6462
return ctx.default_attr_type
6563

66-
mypy_version_tuple = tuple(
67-
map(int, version('mypy').partition('+')[0].split('.'))
68-
)
69-
70-
extra_kwargs: dict[str, Any] = {}
71-
if mypy_version_tuple < (1, 16):
72-
extra_kwargs['msg'] = ctx.api.msg
7364
return analyze_member_access(
7465
ctx.context.name, # type: ignore
7566
accessed,
@@ -80,7 +71,6 @@ def attribute_access(ctx: AttributeContext) -> MypyType:
8071
original_type=instance,
8172
chk=ctx.api, # type: ignore
8273
in_literal_context=ctx.api.expr_checker.is_literal_context(), # type: ignore
83-
**extra_kwargs,
8474
)
8575

8676

returns/contrib/mypy/_typeops/analtype.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from collections.abc import Sequence
2-
from importlib.metadata import version
32
from types import MappingProxyType
4-
from typing import Any, Final, Literal, overload
3+
from typing import Final, Literal, overload
54

65
from mypy.checkmember import analyze_member_access
76
from mypy.nodes import ARG_NAMED, ARG_OPT
@@ -119,15 +118,6 @@ def translate_to_function(
119118
"""
120119
checker = ctx.api.expr_checker # type: ignore
121120

122-
mypy_version = version('mypy')
123-
mypy_version_tuple = tuple(
124-
map(int, mypy_version.partition('+')[0].split('.'))
125-
)
126-
127-
extra_kwargs: dict[str, Any] = {}
128-
if mypy_version_tuple < (1, 16):
129-
extra_kwargs['msg'] = checker.msg
130-
131121
return get_proper_type(
132122
analyze_member_access(
133123
'__call__',
@@ -138,6 +128,5 @@ def translate_to_function(
138128
is_operator=True,
139129
original_type=function_def,
140130
chk=checker.chk,
141-
**extra_kwargs,
142131
)
143132
)

tests/test_primitives/test_container/test_base_container/test_pickle.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def __init__(self, inner_value: Any) -> None:
1414
def __eq__(self, other: object) -> bool:
1515
return (
1616
type(other) is type(self) # noqa: WPS516
17-
and self.inner_value == other.inner_value # type: ignore[attr-defined]
17+
and self.inner_value == other.inner_value
1818
)
1919

2020
def __hash__(self) -> int:

typesafety/test_context/test_requires_context/test_context.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
main: |
1212
from returns.context import RequiresContext
1313
14-
reveal_type(RequiresContext[int, str].ask()) # N: Revealed type is "returns.context.requires_context.RequiresContext[builtins.str, builtins.str]"
14+
reveal_type(RequiresContext[int, str].ask()) # N: Revealed type is "returns.context.requires_context.RequiresContext[str, str]"
1515
1616
1717
- case: requires_context_from_value
1818
disable_cache: false
1919
main: |
2020
from returns.context import RequiresContext
2121
22-
reveal_type(RequiresContext.from_value(1)) # N: Revealed type is "returns.context.requires_context.RequiresContext[builtins.int, Any]"
22+
reveal_type(RequiresContext.from_value(1)) # N: Revealed type is "returns.context.requires_context.RequiresContext[int, Any]"
2323
2424
2525
- case: requires_context_from_context
@@ -28,4 +28,4 @@
2828
from returns.context import RequiresContext
2929
3030
x: RequiresContext[int, str]
31-
reveal_type(RequiresContext.from_context(x)) # N: Revealed type is "returns.context.requires_context.RequiresContext[builtins.int, builtins.str]"
31+
reveal_type(RequiresContext.from_context(x)) # N: Revealed type is "returns.context.requires_context.RequiresContext[int, str]"

typesafety/test_context/test_requires_context/test_requires_context_cast.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
first: RequiresContext[TypeError, int] # we can only cast return type
77
second: RequiresContext[Exception, int] = first
88
9-
reveal_type(second) # N: Revealed type is "returns.context.requires_context.RequiresContext[builtins.Exception, builtins.int]"
9+
reveal_type(second) # N: Revealed type is "returns.context.requires_context.RequiresContext[Exception, int]"
1010
1111
1212
- case: context_wrong_cast
@@ -46,7 +46,7 @@
4646
reveal_type(func().bind(second))
4747
reveal_type(func().bind(third))
4848
out: |
49-
main:21: note: Revealed type is "returns.context.requires_context.RequiresContext[builtins.int, main.B]"
49+
main:21: note: Revealed type is "returns.context.requires_context.RequiresContext[int, main.B]"
5050
main:21: error: Argument 1 to "bind" of "RequiresContext" has incompatible type "Callable[[int], RequiresContext[int, A]]"; expected "Callable[[int], KindN[RequiresContext[Any, Any], int, B, Any]]" [arg-type]
51-
main:22: note: Revealed type is "returns.context.requires_context.RequiresContext[builtins.int, main.B]"
51+
main:22: note: Revealed type is "returns.context.requires_context.RequiresContext[int, main.B]"
5252
main:22: error: Argument 1 to "bind" of "RequiresContext" has incompatible type "Callable[[int], RequiresContext[int, C]]"; expected "Callable[[int], KindN[RequiresContext[Any, Any], int, B, Any]]" [arg-type]

typesafety/test_context/test_requires_context/test_requires_context_type.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
66
first: RequiresContext[str, int]
77
8-
reveal_type(first(1)) # N: Revealed type is "builtins.str"
8+
reveal_type(first(1)) # N: Revealed type is "str"
99
1010
1111
- case: requires_context_getattr
@@ -24,7 +24,7 @@
2424
2525
first: RequiresContext[str, int]
2626
27-
reveal_type(first.map(lambda char: float(char))) # N: Revealed type is "returns.context.requires_context.RequiresContext[builtins.float, builtins.int]"
27+
reveal_type(first.map(lambda char: float(char))) # N: Revealed type is "returns.context.requires_context.RequiresContext[float, int]"
2828
2929
3030
- case: requires_context_apply_correct
@@ -36,7 +36,7 @@
3636
first: RequiresContext[str, int]
3737
second: RequiresContext[Callable[[str], float], int]
3838
39-
reveal_type(first.apply(second)) # N: Revealed type is "returns.context.requires_context.RequiresContext[builtins.float, builtins.int]"
39+
reveal_type(first.apply(second)) # N: Revealed type is "returns.context.requires_context.RequiresContext[float, int]"
4040
4141
4242
- case: requires_context_bind_correct
@@ -49,7 +49,7 @@
4949
def function(arg: str) -> RequiresContext[float, int]:
5050
return RequiresContext.from_value(1.5)
5151
52-
reveal_type(first.bind(function)) # N: Revealed type is "returns.context.requires_context.RequiresContext[builtins.float, builtins.int]"
52+
reveal_type(first.bind(function)) # N: Revealed type is "returns.context.requires_context.RequiresContext[float, int]"
5353
5454
5555
- case: requires_context_bind_context_correct
@@ -62,7 +62,7 @@
6262
def function(arg: str) -> RequiresContext[float, int]:
6363
return RequiresContext.from_value(1.5)
6464
65-
reveal_type(first.bind_context(function)) # N: Revealed type is "returns.context.requires_context.RequiresContext[builtins.float, builtins.int]"
65+
reveal_type(first.bind_context(function)) # N: Revealed type is "returns.context.requires_context.RequiresContext[float, int]"
6666
6767
6868
- case: requires_context_modify_env
@@ -71,7 +71,7 @@
7171
from returns.context import RequiresContext
7272
7373
first: RequiresContext[float, int]
74-
reveal_type(first.modify_env(int)('1')) # N: Revealed type is "builtins.float"
74+
reveal_type(first.modify_env(int)('1')) # N: Revealed type is "float"
7575
7676
7777
- case: requires_context_call_wrong

typesafety/test_context/test_requires_context/test_requires_context_typecast.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
x: RequiresContextIOResult[int, float, str]
88
9-
reveal_type(RequiresContext.from_requires_context_ioresult(x)) # N: Revealed type is "returns.context.requires_context.RequiresContext[returns.io.IOResult[builtins.int, builtins.float], builtins.str]"
9+
reveal_type(RequiresContext.from_requires_context_ioresult(x)) # N: Revealed type is "returns.context.requires_context.RequiresContext[returns.io.IOResult[int, float], str]"
1010
1111
1212
- case: requires_context_from_requires_context_result
@@ -17,7 +17,7 @@
1717
1818
x: RequiresContextResult[int, float, str]
1919
20-
reveal_type(RequiresContext.from_requires_context_result(x)) # N: Revealed type is "returns.context.requires_context.RequiresContext[returns.result.Result[builtins.int, builtins.float], builtins.str]"
20+
reveal_type(RequiresContext.from_requires_context_result(x)) # N: Revealed type is "returns.context.requires_context.RequiresContext[returns.result.Result[int, float], str]"
2121
2222
2323
- case: requires_context_from_requires_context_future_result
@@ -28,4 +28,4 @@
2828
2929
x: RequiresContextFutureResult[int, float, str]
3030
31-
reveal_type(RequiresContext.from_requires_context_future_result(x)) # N: Revealed type is "returns.context.requires_context.RequiresContext[returns.future.FutureResult[builtins.int, builtins.float], builtins.str]"
31+
reveal_type(RequiresContext.from_requires_context_future_result(x)) # N: Revealed type is "returns.context.requires_context.RequiresContext[returns.future.FutureResult[int, float], str]"

typesafety/test_context/test_requires_context_future_result/test_context_future_result.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@
1111
main: |
1212
from returns.context import RequiresContextFutureResult
1313
14-
reveal_type(RequiresContextFutureResult[int, bool, str].ask()) # N: Revealed type is "returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str, builtins.bool, builtins.str]"
14+
reveal_type(RequiresContextFutureResult[int, bool, str].ask()) # N: Revealed type is "returns.context.requires_context_future_result.RequiresContextFutureResult[str, bool, str]"

0 commit comments

Comments
 (0)