Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## [Unreleased]
**Fixes:**
- Made `SubconParsedType` and `SubconBuildTypes` invariant.

## [0.8.1] - 2026-07-23
**New features:**
- Added `Subconstruct`, `SymmetricAdapter`, `Tunnel` and `Validator` to `construct_typed` as subscriptable types.
Expand All @@ -23,4 +27,4 @@
- Use PEP604 union syntax "X | Y" instead of "Union[X, Y]" and "X | None" instead of "Optional[X]" in type hints.

**Organizational changes:**
- Use `uv` as a project management tool and `poe` as a task runner.
- Use `uv` as a project management tool and `poe` as a task runner.
38 changes: 19 additions & 19 deletions construct-stubs/core.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,8 @@ ValueType = t.TypeVar("ValueType")
ConstantOrContextLambda = ValueType | t.Callable[[Context], t.Any]
ConstantOrContextLambda2 = ValueType | t.Callable[[Context], ValueType]

SubconParsedType = t.TypeVar("SubconParsedType", covariant=True)
SubconBuildTypes = t.TypeVar("SubconBuildTypes", contravariant=True)
SubconParsedType = t.TypeVar("SubconParsedType")
SubconBuildTypes = t.TypeVar("SubconBuildTypes")

class Subconstruct(
t.Generic[SubconParsedType, SubconBuildTypes, ParsedType, BuildTypes],
Expand Down Expand Up @@ -498,11 +498,11 @@ class Sequence(Construct[ListContainer[t.Any], t.List[t.Any] | None]):
# arrays ranges and repeaters
# ===============================================================================
class Array(
Subconstruct[ # ty: ignore[invalid-generic-class]
Subconstruct[
SubconParsedType,
SubconBuildTypes,
ListContainer[SubconParsedType], # type: ignore
t.List[SubconBuildTypes], # type: ignore
ListContainer[SubconParsedType],
t.List[SubconBuildTypes],
]
):
count: ConstantOrContextLambda[int]
Expand All @@ -515,11 +515,11 @@ class Array(
) -> None: ...

class GreedyRange(
Subconstruct[ # ty: ignore[invalid-generic-class]
Subconstruct[
SubconParsedType,
SubconBuildTypes,
ListContainer[SubconParsedType], # type: ignore
t.List[SubconBuildTypes], # type: ignore
ListContainer[SubconParsedType],
t.List[SubconBuildTypes],
]
):
discard: bool
Expand All @@ -530,11 +530,11 @@ class GreedyRange(
) -> None: ...

class RepeatUntil(
Subconstruct[ # ty: ignore[invalid-generic-class]
Subconstruct[
SubconParsedType,
SubconBuildTypes,
ListContainer[SubconParsedType], # type: ignore
t.List[SubconBuildTypes], # type: ignore
ListContainer[SubconParsedType],
t.List[SubconBuildTypes],
]
):
predicate: bool | t.Callable[[SubconParsedType, ListContainer[SubconParsedType], Context], bool]
Expand Down Expand Up @@ -948,7 +948,7 @@ class RawCopyObj(t.Generic[ParsedType], Container[t.Any]):
length: int

class RawCopy(
Subconstruct[ # ty: ignore[invalid-generic-class]
Subconstruct[
SubconParsedType,
SubconBuildTypes,
RawCopyObj[SubconParsedType],
Expand Down Expand Up @@ -1154,7 +1154,7 @@ class EncryptedSymAead(Tunnel[SubconParsedType, SubconBuildTypes]):
# lazy equivalents
# ===============================================================================
class Lazy(
Subconstruct[ # ty: ignore[invalid-generic-class]
Subconstruct[
SubconParsedType,
SubconBuildTypes,
t.Callable[[], SubconParsedType],
Expand Down Expand Up @@ -1187,11 +1187,11 @@ class LazyStruct(Construct[LazyContainer[t.Any], t.Dict[str, t.Any] | None]):
class LazyListContainer(t.List[ListType]): ...

class LazyArray(
Subconstruct[ # ty: ignore[invalid-generic-class]
Subconstruct[
SubconParsedType,
SubconBuildTypes,
ListContainer[SubconParsedType], # type: ignore
t.List[SubconBuildTypes], # type: ignore
ListContainer[SubconParsedType],
t.List[SubconBuildTypes],
]
):
count: ConstantOrContextLambda[int]
Expand Down Expand Up @@ -1251,11 +1251,11 @@ def Filter(
]: ...

class Slicing(
Adapter[ # ty: ignore[invalid-generic-class]
Adapter[
SubconParsedType,
SubconBuildTypes,
ListContainer[SubconParsedType], # type: ignore
t.List[SubconBuildTypes], # type: ignore
ListContainer[SubconParsedType],
t.List[SubconBuildTypes],
]
):
def __init__(
Expand Down
Loading