From 0954baea081f86d07e2c0c6b04ac38c9102fe04b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:24:51 +0000 Subject: [PATCH 1/3] Bump pyright from 1.1.407 to 1.1.410 in /betterproto2 Bumps [pyright](https://github.com/RobertCraigie/pyright-python) from 1.1.407 to 1.1.410. - [Release notes](https://github.com/RobertCraigie/pyright-python/releases) - [Commits](https://github.com/RobertCraigie/pyright-python/compare/v1.1.407...v1.1.410) --- updated-dependencies: - dependency-name: pyright dependency-version: 1.1.410 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- betterproto2/uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/betterproto2/uv.lock b/betterproto2/uv.lock index d596e1f..470fa03 100644 --- a/betterproto2/uv.lock +++ b/betterproto2/uv.lock @@ -1581,15 +1581,15 @@ wheels = [ [[package]] name = "pyright" -version = "1.1.407" +version = "1.1.410" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/1b/0aa08ee42948b61745ac5b5b5ccaec4669e8884b53d31c8ec20b2fcd6b6f/pyright-1.1.407.tar.gz", hash = "sha256:099674dba5c10489832d4a4b2d302636152a9a42d317986c38474c76fe562262", size = 4122872, upload-time = "2025-10-24T23:17:15.145Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/53/e4d8ea1391bd4355231be6f91bf239479aa0014260ed3fb5526eeb12a1f2/pyright-1.1.410.tar.gz", hash = "sha256:07a073b8ba6749826773c1269773efa11b93440d9a6aa60419d9a3172d6dc488", size = 4062013, upload-time = "2026-06-01T17:35:48.894Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/93/b69052907d032b00c40cb656d21438ec00b3a471733de137a3f65a49a0a0/pyright-1.1.407-py3-none-any.whl", hash = "sha256:6dd419f54fcc13f03b52285796d65e639786373f433e243f8b94cf93a7444d21", size = 5997008, upload-time = "2025-10-24T23:17:13.159Z" }, + { url = "https://files.pythonhosted.org/packages/d7/33/288b5868fa00846dacf249633719d747893e54aebd196b9968ac1878a5d3/pyright-1.1.410-py3-none-any.whl", hash = "sha256:5e961bed37cacf96b3f7cd7b1da39b350a9239aa2e69138d0e88f728cfaf296c", size = 6082448, upload-time = "2026-06-01T17:35:46.387Z" }, ] [[package]] From 2688adb1c5c9e87ca44c10540b9df4354d663568 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 2 Jun 2026 22:21:36 +0000 Subject: [PATCH 2/3] Fix pyright optional iterable narrowing --- betterproto2/src/betterproto2/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/betterproto2/src/betterproto2/__init__.py b/betterproto2/src/betterproto2/__init__.py index 98221ec..14c21b4 100644 --- a/betterproto2/src/betterproto2/__init__.py +++ b/betterproto2/src/betterproto2/__init__.py @@ -1152,6 +1152,7 @@ def _from_dict_init(cls, mapping: Mapping[str, Any] | Any, *, ignore_unknown_fie if meta.proto_type == TYPE_MESSAGE: if meta.repeated: + assert value is not None value = [_value_from_dict(item, meta, field_cls, ignore_unknown_fields) for item in value] else: value = _value_from_dict(value, meta, field_cls, ignore_unknown_fields) @@ -1170,6 +1171,7 @@ def _from_dict_init(cls, mapping: Mapping[str, Any] | Any, *, ignore_unknown_fie } elif meta.repeated: + assert value is not None value = [_value_from_dict(item, meta, field_cls, ignore_unknown_fields) for item in value] else: From 785d4b58c5b747d09131f929ef22b82ab4a64dd1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 2 Jun 2026 22:24:13 +0000 Subject: [PATCH 3/3] Handle None before repeated field iteration --- betterproto2/src/betterproto2/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/betterproto2/src/betterproto2/__init__.py b/betterproto2/src/betterproto2/__init__.py index 14c21b4..54cb588 100644 --- a/betterproto2/src/betterproto2/__init__.py +++ b/betterproto2/src/betterproto2/__init__.py @@ -1152,7 +1152,10 @@ def _from_dict_init(cls, mapping: Mapping[str, Any] | Any, *, ignore_unknown_fie if meta.proto_type == TYPE_MESSAGE: if meta.repeated: - assert value is not None + if value is None: + raise TypeError( + f"Cannot use None for repeated field '{field_name}'; expected an iterable value." + ) value = [_value_from_dict(item, meta, field_cls, ignore_unknown_fields) for item in value] else: value = _value_from_dict(value, meta, field_cls, ignore_unknown_fields) @@ -1171,7 +1174,8 @@ def _from_dict_init(cls, mapping: Mapping[str, Any] | Any, *, ignore_unknown_fie } elif meta.repeated: - assert value is not None + if value is None: + raise TypeError(f"Cannot use None for repeated field '{field_name}'; expected an iterable value.") value = [_value_from_dict(item, meta, field_cls, ignore_unknown_fields) for item in value] else: