mirror of https://github.com/astral-sh/ruff
Add is_assignable_to/is_disjoint_from tests
This commit is contained in:
parent
ab260acb74
commit
d500d7eda1
|
|
@ -1338,6 +1338,40 @@ def g3(obj: Foo[tuple[A]]):
|
||||||
f3(obj)
|
f3(obj)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Generic aliases
|
||||||
|
|
||||||
|
```py
|
||||||
|
from typing import final
|
||||||
|
from ty_extensions import static_assert, is_assignable_to, TypeOf
|
||||||
|
|
||||||
|
class GenericClass[T]:
|
||||||
|
x: T # invariant
|
||||||
|
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericClass], type[GenericClass]))
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericClass[int]], type[GenericClass]))
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericClass], type[GenericClass[int]]))
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericClass[int]], type[GenericClass[int]]))
|
||||||
|
static_assert(not is_assignable_to(TypeOf[GenericClass[str]], type[GenericClass[int]]))
|
||||||
|
|
||||||
|
class GenericClassIntBound[T: int]:
|
||||||
|
x: T # invariant
|
||||||
|
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericClassIntBound], type[GenericClassIntBound]))
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericClassIntBound[int]], type[GenericClassIntBound]))
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericClassIntBound], type[GenericClassIntBound[int]]))
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericClassIntBound[int]], type[GenericClassIntBound[int]]))
|
||||||
|
|
||||||
|
@final
|
||||||
|
class GenericFinalClass[T]:
|
||||||
|
x: T # invariant
|
||||||
|
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericFinalClass], type[GenericFinalClass]))
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericFinalClass[int]], type[GenericFinalClass]))
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericFinalClass], type[GenericFinalClass[int]]))
|
||||||
|
static_assert(is_assignable_to(TypeOf[GenericFinalClass[int]], type[GenericFinalClass[int]]))
|
||||||
|
static_assert(not is_assignable_to(TypeOf[GenericFinalClass[str]], type[GenericFinalClass[int]]))
|
||||||
|
```
|
||||||
|
|
||||||
## `TypeGuard` and `TypeIs`
|
## `TypeGuard` and `TypeIs`
|
||||||
|
|
||||||
`TypeGuard[...]` and `TypeIs[...]` are always assignable to `bool`.
|
`TypeGuard[...]` and `TypeIs[...]` are always assignable to `bool`.
|
||||||
|
|
|
||||||
|
|
@ -666,6 +666,48 @@ static_assert(is_disjoint_from(Path, tuple[Path | None, str, int]))
|
||||||
static_assert(is_disjoint_from(Path, Path2))
|
static_assert(is_disjoint_from(Path, Path2))
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Generic aliases
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[environment]
|
||||||
|
python-version = "3.12"
|
||||||
|
```
|
||||||
|
|
||||||
|
```py
|
||||||
|
from typing import final
|
||||||
|
from ty_extensions import static_assert, is_disjoint_from, TypeOf
|
||||||
|
|
||||||
|
class GenericClass[T]:
|
||||||
|
x: T # invariant
|
||||||
|
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericClass], type[GenericClass]))
|
||||||
|
# TODO: these should not error
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericClass[int]], type[GenericClass])) # error: [static-assert-error]
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericClass], type[GenericClass[int]])) # error: [static-assert-error]
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericClass[int]], type[GenericClass[int]]))
|
||||||
|
static_assert(is_disjoint_from(TypeOf[GenericClass[str]], type[GenericClass[int]]))
|
||||||
|
|
||||||
|
class GenericClassIntBound[T: int]:
|
||||||
|
x: T # invariant
|
||||||
|
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericClassIntBound], type[GenericClassIntBound]))
|
||||||
|
# TODO: these should not error
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericClassIntBound[int]], type[GenericClassIntBound])) # error: [static-assert-error]
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericClassIntBound], type[GenericClassIntBound[int]])) # error: [static-assert-error]
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericClassIntBound[int]], type[GenericClassIntBound[int]]))
|
||||||
|
|
||||||
|
@final
|
||||||
|
class GenericFinalClass[T]:
|
||||||
|
x: T # invariant
|
||||||
|
|
||||||
|
# TODO: these should not error
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericFinalClass], type[GenericFinalClass])) # error: [static-assert-error]
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericFinalClass[int]], type[GenericFinalClass])) # error: [static-assert-error]
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericFinalClass], type[GenericFinalClass[int]])) # error: [static-assert-error]
|
||||||
|
static_assert(not is_disjoint_from(TypeOf[GenericFinalClass[int]], type[GenericFinalClass[int]]))
|
||||||
|
static_assert(is_disjoint_from(TypeOf[GenericFinalClass[str]], type[GenericFinalClass[int]]))
|
||||||
|
```
|
||||||
|
|
||||||
## Callables
|
## Callables
|
||||||
|
|
||||||
No two callable types are disjoint because there exists a non-empty callable type
|
No two callable types are disjoint because there exists a non-empty callable type
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue