From: Tamir Duberstein <tamird@kernel.org>
To: "Kernel.org Tools" <tools@kernel.org>
Cc: Konstantin Ryabitsev <konstantin@linuxfoundation.org>,
Tamir Duberstein <tamird@kernel.org>
Subject: [PATCH ezgb v2 2/3] Enable strict pyright source checks
Date: Fri, 18 Sep 2026 18:03:22 -0400 [thread overview]
Message-ID: <20260918-stronger-type-checking-v2-2-3ddc31ba2616@kernel.org> (raw)
In-Reply-To: <20260918-stronger-type-checking-v2-0-3ddc31ba2616@kernel.org>
Remove the blanket unknown-type and private-usage exemptions now that
JSON and git objects are narrowed before use. Limit the private-usage
exception to tests, which intentionally exercise internal helpers.
Move the shared date parser to module scope so GitBugRepo no longer
calls a private BugReader method, and give dataclass factories explicit
element types.
Signed-off-by: Tamir Duberstein <tamird@kernel.org>
Assisted-by: LLM
---
pyproject.toml | 13 +++----------
src/ezgb/__init__.py | 8 +++-----
src/ezgb/_models.py | 4 ++--
src/ezgb/_reader.py | 40 ++++++++++++++++++++--------------------
4 files changed, 28 insertions(+), 37 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 3f2ddb9..28289fe 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -61,16 +61,9 @@ quote-style = "single"
# pyright tries to type-check every package in each one).
exclude = [".venv", ".venv-*"]
typeCheckingMode = "strict"
-
-# pygit2 ships no type information, so member/variable/argument types coming
-# out of it resolve to Unknown. Relax the strict "unknown type" reports
-# rather than sprinkling casts across every git-object access site.
-reportUnknownArgumentType = false
-reportUnknownMemberType = false
-reportUnknownVariableType = false
-
-# False positives caused by underscore-prefixed helpers used across modules.
-reportPrivateUsage = false
+executionEnvironments = [
+ { root = "tests", reportPrivateUsage = false },
+]
[tool.ty.rules]
all = "error"
diff --git a/src/ezgb/__init__.py b/src/ezgb/__init__.py
index eb65cfc..1f7d0ab 100644
--- a/src/ezgb/__init__.py
+++ b/src/ezgb/__init__.py
@@ -23,7 +23,7 @@ from ezgb._models import (
Status,
UnsupportedFormatError,
)
-from ezgb._reader import BugReader
+from ezgb._reader import BugReader, parse_since
from ezgb._types import JsonValue
from ezgb._writer import BugWriter
@@ -77,9 +77,7 @@ class GitBugRepo:
since = since.replace(tzinfo=timezone.utc)
return int(since.timestamp())
# str -- delegate to the reader's parser
- from ezgb._reader import BugReader
-
- return BugReader._parse_since(since)
+ return parse_since(since)
def list_bugs(
self,
@@ -207,7 +205,7 @@ class GitBugRepo:
author_id = author.get('id', '') if isinstance(author, dict) else ''
raw_labels = raw.get('labels') or []
if isinstance(raw_labels, list):
- labels = frozenset(str(lb) for lb in raw_labels)
+ labels: frozenset[str] = frozenset(str(lb) for lb in raw_labels)
else:
labels = frozenset()
comment_count = raw.get('comments', 0)
diff --git a/src/ezgb/_models.py b/src/ezgb/_models.py
index 72eb759..426895a 100644
--- a/src/ezgb/_models.py
+++ b/src/ezgb/_models.py
@@ -96,7 +96,7 @@ class Comment:
text: str
created_at: datetime
count: int
- attachment_ids: list[str] = field(default_factory=list)
+ attachment_ids: list[str] = field(default_factory=list[str])
@dataclass
@@ -110,7 +110,7 @@ class Bug:
created_at: datetime
labels: set[str]
comments: list[Comment]
- metadata: dict[str, str] = field(default_factory=dict)
+ metadata: dict[str, str] = field(default_factory=dict[str, str])
@dataclass(frozen=True)
diff --git a/src/ezgb/_reader.py b/src/ezgb/_reader.py
index fe918ec..769604d 100644
--- a/src/ezgb/_reader.py
+++ b/src/ezgb/_reader.py
@@ -56,6 +56,26 @@ def _is_dict_values(value: dict[_K, _T], value_ty: type[_U]) -> TypeGuard[dict[_
return all(isinstance(value, value_ty) for value in value.values())
+def parse_since(since: str) -> int:
+ """Parse a datetime string to a unix timestamp.
+
+ Accepts ISO-8601 variants and ``YYYYMMDDHHMMSS``.
+ """
+ since = since.strip()
+ for fmt in (
+ '%Y-%m-%d %H:%M:%S',
+ '%Y%m%d%H%M%S',
+ '%Y-%m-%dT%H:%M:%SZ',
+ '%Y-%m-%dT%H:%M:%S',
+ ):
+ try:
+ dt = datetime.strptime(since, fmt).replace(tzinfo=timezone.utc)
+ return int(dt.timestamp())
+ except ValueError:
+ continue
+ raise ValueError('cannot parse since=%s' % since)
+
+
def _combine_ids(primary: str, secondary: str) -> str:
"""Interleave primary and secondary IDs into a CombinedId.
@@ -412,26 +432,6 @@ class BugReader:
"""Convert a unix timestamp to a timezone-aware datetime."""
return datetime.fromtimestamp(unix_ts, tz=timezone.utc)
- @staticmethod
- def _parse_since(since: str) -> int:
- """Parse a datetime string to a unix timestamp.
-
- Accepts ISO-8601 variants and ``YYYYMMDDHHMMSS``.
- """
- since = since.strip()
- for fmt in (
- '%Y-%m-%d %H:%M:%S',
- '%Y%m%d%H%M%S',
- '%Y-%m-%dT%H:%M:%SZ',
- '%Y-%m-%dT%H:%M:%S',
- ):
- try:
- dt = datetime.strptime(since, fmt).replace(tzinfo=timezone.utc)
- return int(dt.timestamp())
- except ValueError:
- continue
- raise ValueError('cannot parse since=%s' % since)
-
def build_bug(
self,
bid: str,
--
2.56.0.rc0.692.g34fd115c35.frankengit
next prev parent reply other threads:[~2026-09-18 22:03 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-18 22:03 [PATCH ezgb v2 0/3] Tighten JSON and source type checks Tamir Duberstein
2026-09-18 22:03 ` [PATCH ezgb v2 1/3] Narrow JSON types and type test doubles Tamir Duberstein
2026-09-18 22:03 ` Tamir Duberstein [this message]
2026-09-18 22:03 ` [PATCH ezgb v2 3/3] Document local CI checks Tamir Duberstein
2026-10-05 10:57 ` [PATCH ezgb v2 0/3] Tighten JSON and source type checks Konstantin Ryabitsev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260918-stronger-type-checking-v2-2-3ddc31ba2616@kernel.org \
--to=tamird@kernel.org \
--cc=konstantin@linuxfoundation.org \
--cc=tools@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.