|
16 | 16 | import re |
17 | 17 | import time |
18 | 18 | from collections.abc import AsyncIterable |
19 | | -from datetime import UTC, datetime |
| 19 | +from datetime import datetime, timezone |
20 | 20 | from typing import Any |
21 | 21 |
|
22 | 22 | from chat_sdk.adapters.github.cards import card_to_github_markdown |
|
55 | 55 | ThreadInfo, |
56 | 56 | ThreadSummary, |
57 | 57 | WebhookOptions, |
| 58 | + _parse_iso, |
58 | 59 | ) |
59 | 60 |
|
60 | 61 | REVIEW_COMMENT_THREAD_PATTERN = re.compile(r"^([^/]+)/([^:]+):(\d+):rc:(\d+)$") |
@@ -384,11 +385,9 @@ def _parse_issue_comment( |
384 | 385 | }, |
385 | 386 | author=author, |
386 | 387 | metadata=MessageMetadata( |
387 | | - date_sent=datetime.fromisoformat(created_at.replace("Z", "+00:00")) |
388 | | - if created_at |
389 | | - else datetime.now(tz=UTC), |
| 388 | + date_sent=_parse_iso(created_at) if created_at else datetime.now(tz=timezone.utc), |
390 | 389 | edited=edited, |
391 | | - edited_at=datetime.fromisoformat(updated_at.replace("Z", "+00:00")) if edited and updated_at else None, |
| 390 | + edited_at=_parse_iso(updated_at) if edited and updated_at else None, |
392 | 391 | ), |
393 | 392 | attachments=[], |
394 | 393 | ) |
@@ -426,11 +425,9 @@ def _parse_review_comment( |
426 | 425 | }, |
427 | 426 | author=author, |
428 | 427 | metadata=MessageMetadata( |
429 | | - date_sent=datetime.fromisoformat(created_at.replace("Z", "+00:00")) |
430 | | - if created_at |
431 | | - else datetime.now(tz=UTC), |
| 428 | + date_sent=_parse_iso(created_at) if created_at else datetime.now(tz=timezone.utc), |
432 | 429 | edited=edited, |
433 | | - edited_at=datetime.fromisoformat(updated_at.replace("Z", "+00:00")) if edited and updated_at else None, |
| 430 | + edited_at=_parse_iso(updated_at) if edited and updated_at else None, |
434 | 431 | ), |
435 | 432 | attachments=[], |
436 | 433 | ) |
@@ -785,17 +782,17 @@ async def list_threads( |
785 | 782 | }, |
786 | 783 | author=self._parse_author(pr_user), |
787 | 784 | metadata=MessageMetadata( |
788 | | - date_sent=datetime.fromisoformat(pr.get("created_at", "").replace("Z", "+00:00")) |
| 785 | + date_sent=_parse_iso(pr.get("created_at", "").replace("Z", "+00:00")) |
789 | 786 | if pr.get("created_at") |
790 | | - else datetime.now(tz=UTC), |
| 787 | + else datetime.now(tz=timezone.utc), |
791 | 788 | edited=pr.get("created_at") != pr.get("updated_at"), |
792 | 789 | ), |
793 | 790 | ) |
794 | 791 | threads.append( |
795 | 792 | ThreadSummary( |
796 | 793 | id=tid, |
797 | 794 | root_message=root_message, |
798 | | - last_reply_at=datetime.fromisoformat(pr.get("updated_at", "").replace("Z", "+00:00")) |
| 795 | + last_reply_at=_parse_iso(pr.get("updated_at", "").replace("Z", "+00:00")) |
799 | 796 | if pr.get("updated_at") |
800 | 797 | else None, |
801 | 798 | ) |
@@ -928,13 +925,9 @@ async def _get_installation_token(self, installation_id: int) -> str: |
928 | 925 | data = await response.json() |
929 | 926 |
|
930 | 927 | token = data["token"] |
931 | | - # Parse ISO-8601 expiry from GitHub's response |
| 928 | + # Parse ISO-8601 expiry; default 1h if absent |
932 | 929 | expires_at_str = data.get("expires_at", "") |
933 | | - if expires_at_str: |
934 | | - expires_at = datetime.fromisoformat(expires_at_str.replace("Z", "+00:00")).timestamp() |
935 | | - else: |
936 | | - # Default: 1 hour from now (GitHub's default) |
937 | | - expires_at = time.time() + 3600 |
| 930 | + expires_at = _parse_iso(expires_at_str).timestamp() if expires_at_str else time.time() + 3600 |
938 | 931 |
|
939 | 932 | self._installation_token_cache[installation_id] = (token, expires_at) |
940 | 933 | self._logger.debug( |
|
0 commit comments