-
-
Notifications
You must be signed in to change notification settings - Fork 38
feat: validate mypyc_attr args #69
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
Open
BobTheBuidler
wants to merge
5
commits into
python:master
Choose a base branch
from
BobTheBuidler:patch-1
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
07b1c7f
feat: validate mypyc_attr args
BobTheBuidler e172303
Update mypy_extensions.py
BobTheBuidler 21f5e20
Update mypy_extensions.py
BobTheBuidler 2660b9f
add free_list_len to MypycAttrs
BobTheBuidler 36f8fde
Update mypy_extensions.py
BobTheBuidler 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 |
---|---|---|
|
@@ -5,12 +5,37 @@ | |
from mypy_extensions import TypedDict | ||
""" | ||
|
||
from typing import Any, Dict | ||
from typing import Any, Callable, Dict, Final, Literal, TypeVar | ||
|
||
import sys | ||
# _type_check is NOT a part of public typing API, it is used here only to mimic | ||
# the (convenient) behavior of types provided by typing module. | ||
from typing import _type_check # type: ignore | ||
from typing import _type_check # type: ignore [attr-defined] | ||
|
||
from typing_extensions import NotRequired, TypeGuard, Unpack | ||
|
||
|
||
_C = TypeVar("_C", bound=Callable[..., Any]) | ||
|
||
MYPYC_ATTRS: Final = frozenset([ | ||
"native_class", | ||
"allow_interpreted_subclasses", | ||
"serializable", | ||
"free_list_len", | ||
]) | ||
|
||
MypycAttr = Literal[ | ||
"native_class", | ||
"allow_interpreted_subclasses", | ||
"serializable", | ||
"free_list_len", | ||
] | ||
|
||
class MypycAttrs(TypedDict): | ||
native_class: NotRequired[bool] | ||
allow_interpreted_subclasses: NotRequired[bool] | ||
serializable: NotRequired[bool] | ||
free_list_len: NotRequired[int] | ||
|
||
|
||
def _check_fails(cls, other): | ||
|
@@ -158,12 +183,25 @@ def trait(cls): | |
return cls | ||
|
||
|
||
def mypyc_attr(*attrs, **kwattrs): | ||
def _validate_mypyc_attr_key(key: str) -> TypeGuard[MypycAttr]: | ||
if key not in MYPYC_ATTRS: | ||
raise ValueError( | ||
f"{key!r} is not a valid `mypyc_attr` key.\n" | ||
"Valid keys are: {', '.join(map(repr, sorted(MYPYC_ATTRS)))}" | ||
) | ||
|
||
|
||
def mypyc_attr(*attrs: MypycAttr, **kwattrs: Unpack[MypycAttrs]) -> Callable[[_C], _C]: | ||
for key in attrs: | ||
_validate_mypyc_attr_key(key) | ||
for key, value in kwattrs.items(): | ||
_validate_mypyc_attr_key(key) | ||
if not isinstance(value, bool): | ||
raise TypeError(f"{key} value should be boolean, not {type(value).__name__}.") | ||
return lambda x: x | ||
|
||
|
||
# TODO: We may want to try to properly apply this to any type | ||
# variables left over... | ||
# TODO: We may want to try to properly apply this to any type variables left over... | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this just looked silly as a multiline comment once the block above was added |
||
class _FlexibleAliasClsApplied: | ||
def __init__(self, val): | ||
self.val = val | ||
|
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
are there others? I was looking thru the docs and couldn't find any good central resource on this