-
Notifications
You must be signed in to change notification settings - Fork 259
Add conformance tests for PEP 702's @deprecated
#1822
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
Changes from all commits
Commits
Show all changes
12 commits
Select commit
Hold shift + click to select a range
1a9429e
Add conformance tests for PEP 702's `@deprecated`
InSyncWithFoo 8c7f06b
Reorder testcases to avoid irrelevant errors by Pyright
InSyncWithFoo 902f681
Address PR reviews
InSyncWithFoo 903bbd0
Avoid irrelevant errors
InSyncWithFoo 168caf2
Also rename "library" file
InSyncWithFoo c334760
Add manual test results
InSyncWithFoo 9eef221
Add missing punctuations, remove a note
InSyncWithFoo 7a70784
Another period
InSyncWithFoo b57c819
Rerun on pyre
JelleZijlstra d921fe0
Update conformance/results/pyre/directives_reveal_type.toml
JelleZijlstra a7d36a2
Add new `__call__()` testcase per PR review
InSyncWithFoo 61f334d
Prefer "OK" to "no error"
InSyncWithFoo File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
conformant = "Unsupported" | ||
notes = """ | ||
Does not support @deprecated. | ||
""" | ||
conformance_automated = "Fail" | ||
errors_diff = """ | ||
Line 15: Expected 1 errors | ||
Line 23: Expected 1 errors | ||
Line 24: Expected 1 errors | ||
Line 29: Expected 1 errors | ||
Line 40: Expected 1 errors | ||
Line 41: Expected 1 errors | ||
Line 43: Expected 1 errors | ||
Line 46: Expected 1 errors | ||
Line 47: Expected 1 errors | ||
Line 57: Expected 1 errors | ||
Line 87: Expected 1 errors | ||
""" | ||
output = """ | ||
""" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
version = "mypy 1.11.0" | ||
test_duration = 1.0 | ||
test_duration = 1.4 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
conformant = "Unsupported" | ||
notes = """ | ||
Does not support @deprecated. | ||
""" | ||
conformance_automated = "Fail" | ||
errors_diff = """ | ||
Line 15: Expected 1 errors | ||
Line 23: Expected 1 errors | ||
Line 24: Expected 1 errors | ||
Line 29: Expected 1 errors | ||
Line 40: Expected 1 errors | ||
Line 41: Expected 1 errors | ||
Line 43: Expected 1 errors | ||
Line 46: Expected 1 errors | ||
Line 47: Expected 1 errors | ||
Line 57: Expected 1 errors | ||
Line 87: Expected 1 errors | ||
""" | ||
output = """ | ||
""" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
version = "pyre 0.9.22" | ||
test_duration = 2.5 | ||
test_duration = 1.8 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
conformant = "Partial" | ||
notes = """ | ||
Does not report error for deprecated magic methods. | ||
""" | ||
conformance_automated = "Fail" | ||
errors_diff = """ | ||
Line 40: Expected 1 errors | ||
Line 41: Expected 1 errors | ||
Line 47: Expected 1 errors | ||
Line 33: Unexpected errors ['directives_deprecated.py:33:7 - error: The class "Ham" is deprecated'] | ||
""" | ||
output = """ | ||
directives_deprecated.py:15:44 - error: The class "Ham" is deprecated | ||
Use Spam instead (reportDeprecated) | ||
directives_deprecated.py:23:9 - error: The function "norwegian_blue" is deprecated | ||
It is pining for the fiords (reportDeprecated) | ||
directives_deprecated.py:24:13 - error: The function "norwegian_blue" is deprecated | ||
It is pining for the fiords (reportDeprecated) | ||
directives_deprecated.py:29:9 - error: The function "foo" is deprecated | ||
Only str will be allowed (reportDeprecated) | ||
directives_deprecated.py:33:7 - error: The class "Ham" is deprecated | ||
Use Spam instead (reportDeprecated) | ||
directives_deprecated.py:43:6 - error: The getter for property "greasy" is deprecated | ||
All spam will be equally greasy (reportDeprecated) | ||
directives_deprecated.py:46:6 - error: The setter for property "shape" is deprecated | ||
Shapes are becoming immutable (reportDeprecated) | ||
directives_deprecated.py:57:9 - error: The function "lorem" is deprecated | ||
Deprecated (reportDeprecated) | ||
directives_deprecated.py:87:13 - error: The method "foo" in class "Fooable" is deprecated | ||
Deprecated (reportDeprecated) | ||
""" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
version = "pyright 1.1.373" | ||
test_duration = 1.4 | ||
test_duration = 1.2 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
conformant = "Unsupported" | ||
notes = """ | ||
Does not support @deprecated. | ||
""" | ||
conformance_automated = "Fail" | ||
errors_diff = """ | ||
Line 23: Expected 1 errors | ||
Line 24: Expected 1 errors | ||
Line 29: Expected 1 errors | ||
Line 40: Expected 1 errors | ||
Line 41: Expected 1 errors | ||
Line 43: Expected 1 errors | ||
Line 46: Expected 1 errors | ||
Line 47: Expected 1 errors | ||
Line 57: Expected 1 errors | ||
Line 87: Expected 1 errors | ||
Line 16: Unexpected errors ['File "directives_deprecated.py", line 16, in <module>: Can\\'t find module \\'_directives_deprecated_library\\'. [import-error]'] | ||
Line 18: Unexpected errors ['File "directives_deprecated.py", line 18, in <module>: typing_extensions.deprecated not supported yet [not-supported-yet]'] | ||
Line 66: Unexpected errors ['File "directives_deprecated.py", line 66, in <module>: typing.override not supported yet [not-supported-yet]'] | ||
""" | ||
output = """ | ||
File "directives_deprecated.py", line 15, in <module>: Can't find module '_directives_deprecated_library'. [import-error] | ||
File "directives_deprecated.py", line 16, in <module>: Can't find module '_directives_deprecated_library'. [import-error] | ||
File "directives_deprecated.py", line 18, in <module>: typing_extensions.deprecated not supported yet [not-supported-yet] | ||
File "directives_deprecated.py", line 66, in <module>: typing.override not supported yet [not-supported-yet] | ||
""" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
version = "pytype 2024.04.11" | ||
test_duration = 32.7 | ||
test_duration = 30.0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
""" | ||
Support module for directive_deprecated. | ||
""" | ||
|
||
from typing import Self, overload | ||
|
||
from typing_extensions import deprecated | ||
|
||
|
||
@deprecated("Use Spam instead") | ||
class Ham: ... | ||
|
||
|
||
@deprecated("It is pining for the fiords") | ||
def norwegian_blue(x: int) -> int: ... | ||
|
||
|
||
@overload | ||
@deprecated("Only str will be allowed") | ||
def foo(x: int) -> str: ... | ||
|
||
|
||
@overload | ||
def foo(x: str) -> str: ... | ||
|
||
|
||
def foo(x: int | str) -> str: ... | ||
|
||
|
||
class Spam: | ||
|
||
@deprecated("There is enough spam in the world") | ||
def __add__(self, other: object) -> Self: ... | ||
|
||
@property | ||
@deprecated("All spam will be equally greasy") | ||
def greasy(self) -> float: ... | ||
|
||
@property | ||
def shape(self) -> str: ... | ||
|
||
@shape.setter | ||
@deprecated("Shapes are becoming immutable") | ||
def shape(self, value: str) -> None: ... |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
""" | ||
Tests the warnings.deprecated function. | ||
""" | ||
|
||
# pyright: reportDeprecated=true | ||
|
||
# Specification: https://typing.readthedocs.io/en/latest/spec/directives.html#deprecated | ||
# See also https://peps.python.org/pep-0702/ | ||
|
||
# > Type checkers should produce a diagnostic whenever they encounter a usage of an object | ||
# > marked as deprecated. [...] For deprecated classes and functions, this includes: | ||
|
||
# > * `from` imports | ||
|
||
from _directives_deprecated_library import Ham # E: Use of deprecated class Ham | ||
import _directives_deprecated_library as library | ||
|
||
from typing_extensions import deprecated | ||
|
||
|
||
# > * References through module, class, or instance attributes | ||
|
||
library.norwegian_blue(1) # E: Use of deprecated function norwegian_blue | ||
map(library.norwegian_blue, [1, 2, 3]) # E: Use of deprecated function norwegian_blue | ||
|
||
|
||
# > For deprecated overloads, this includes all calls that resolve to the deprecated overload. | ||
|
||
library.foo(1) # E: Use of deprecated overload for foo | ||
library.foo("x") # OK | ||
|
||
|
||
ham = Ham() # OK (already reported above) | ||
|
||
|
||
# > * Any syntax that indirectly triggers a call to the function. | ||
|
||
spam = library.Spam() | ||
|
||
_ = spam + 1 # E: Use of deprecated method Spam.__add__ | ||
spam += 1 # E: Use of deprecated method Spam.__add__ | ||
|
||
spam.greasy # E: Use of deprecated property Spam.greasy | ||
spam.shape # OK | ||
|
||
spam.shape = "cube" # E: Use of deprecated property setter Spam.shape | ||
spam.shape += "cube" # E: Use of deprecated property setter Spam.shape | ||
|
||
|
||
class Invocable: | ||
|
||
@deprecated("Deprecated") | ||
def __call__(self) -> None: ... | ||
|
||
invocable = Invocable() | ||
invocable() # E: Use of deprecated method __call__ | ||
|
||
|
||
# > * Any usage of deprecated objects in their defining module | ||
|
||
@deprecated("Deprecated") | ||
def lorem() -> None: ... | ||
|
||
|
||
ipsum = lorem() # E: Use of deprecated function lorem | ||
|
||
|
||
# > There are additional scenarios where deprecations could come into play. | ||
# > For example, an object may implement a `typing.Protocol`, | ||
# > but one of the methods required for protocol compliance is deprecated. | ||
# > As scenarios such as this one appear complex and relatively unlikely to come up in practice, | ||
# > this PEP does not mandate that type checkers detect them. | ||
|
||
from typing import Protocol, override | ||
|
||
|
||
class Fooable(Protocol): | ||
|
||
@deprecated("Deprecated") | ||
def foo(self) -> None: ... | ||
|
||
def bar(self) -> None: ... | ||
|
||
|
||
class Fooer(Fooable): | ||
|
||
@override | ||
def foo(self) -> None: # E?: Implementation of deprecated method foo | ||
... | ||
|
||
def bar(self) -> None: ... | ||
|
||
|
||
def foo_it(fooable: Fooable) -> None: | ||
fooable.foo() # E: Use of deprecated method foo | ||
fooable.bar() | ||
|
||
|
||
# https://github.com/python/typing/pull/1822#discussion_r1693991644 | ||
|
||
class Fooable2(Protocol): | ||
|
||
def foo(self) -> None: ... | ||
|
||
|
||
class Concrete: | ||
|
||
@deprecated("Deprecated") | ||
def foo(self) -> None: ... | ||
|
||
|
||
def take_fooable(f: Fooable2) -> None: ... | ||
|
||
|
||
def caller(c: Concrete) -> None: | ||
take_fooable(c) # E?: Concrete is a Fooable2, but only because of a deprecated method |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.