Skip to content

[benchmark][Python] feat(ecosystem): Implement cross-system issue synchronization - #12

Open
hsander wants to merge 1 commit into
benchmark/sentry/pr-77754-basefrom
benchmark/sentry/pr-77754
Open

hsander wants to merge 1 commit into
benchmark/sentry/pr-77754-basefrom
benchmark/sentry/pr-77754

Conversation

@hsander

@hsander hsander commented Jul 1, 2026

Copy link
Copy Markdown
Owner

Benchmark fixture for sentry PR #77754.\n\nGolden comments: benchmark/golden_comments/sentry.json — PR 77754.

class AssignmentSource:
source_name: str
integration_id: int
queued: datetime = timezone.now()

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 Значение по умолчанию timezone.now() для поля queued вычисляется однократно при импорте модуля

В frozen-датаклассе AssignmentSource поле queued объявлено как queued: datetime = timezone.now(). В Python значения по умолчанию для полей dataclass вычисляются один раз — в момент определения класса (при импорте модуля), а не при создании каждого экземпляра. В результате все объекты, созданные через from_integration или from_dict без явного указания queued, получат один и тот же таймстамп — время первого импорта модуля. Следует использовать field(default_factory=timezone.now).

@@ -1,32 +1,53 @@
from typing import TYPE_CHECKING

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Потеря типа datetime при round-trip to_dict()/from_dict() через Celery kwargs

Функция sync_group_assignee_outbound передаёт результат assignment_source.to_dict() (где queued имеет тип datetime) как assignment_source_dict в sync_assignee_outbound.apply_async(kwargs=...). При JSON-сериализации Celery datetime превращается в строку. Метод from_dict вызывает cls(**input_dict), сохраняя строку вместо datetime. Объявленный тип поля нарушается, что может привести к ошибкам при сравнении или форматировании даты downstream. Рекомендуется явно парсить строку обратно в datetime в from_dict.

result = AssignmentSource.from_dict(data)
assert result is None

def test_from_dict_inalid_data(self):

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Опечатка в имени теста: test_from_dict_inalid_data

Имя тестового метода содержит опечатку — inalid вместо invalid. Это снижает читаемость и обнаруживаемость теста при поиске.

return False

def get_group_title(self, group, event, **kwargs):
outbound_assignee_key: ClassVar[str | None] = None

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Базовый метод should_sync игнорирует параметр sync_source

Сигнатура IssueBasicIntegration.should_sync расширена параметром sync_source: AssignmentSource | None = None, но тело метода безусловно возвращает False, не используя новый аргумент. Это допустимо как no-op базовая реализация, но отсутствует docstring или комментарий, поясняющий, что логика предотвращения циклов реализована только в подклассах. Будущие читатели могут ошибочно предположить, что базовый класс выполняет проверку циклов. Рекомендуется добавить комментарий с описанием намерения.

@hsander

hsander commented Jul 1, 2026

Copy link
Copy Markdown
Owner Author

🔍 Автоматическое ревью кода

Краткий итог

Синтез ревью: 7 уникальных групп замечаний по 2 исходн. выполнениям; 4 для публикации (критических: 0, высоких: 1, средних: 1, низких: 2, мелких: 0).

Замечания

🟠 Важно

  • [src/python/src/sentry/integrations/services/assignment_source.py:18] Значение по умолчанию timezone.now() для поля queued вычисляется однократно при импорте модуля — В frozen-датаклассе AssignmentSource поле queued объявлено как queued: datetime = timezone.now(). В Python значения по умолчанию для полей dataclass вычисляются один раз — в момент определения класса (при импорте модуля), а не при создании каждого экземпляра. В результате все объекты, созданные через from_integration или from_dict без явного указания queued, получат один и тот же таймстамп — время первого импорта модуля. Следует использовать field(default_factory=timezone.now).

💡 Дополнительно

  • [src/python/src/sentry/integrations/utils/sync.py:1] Потеря типа datetime при round-trip to_dict()/from_dict() через Celery kwargs — Функция sync_group_assignee_outbound передаёт результат assignment_source.to_dict() (где queued имеет тип datetime) как assignment_source_dict в sync_assignee_outbound.apply_async(kwargs=...). При JSON-сериализации Celery datetime превращается в строку. Метод from_dict вызывает cls(**input_dict), сохраняя строку вместо datetime. Объявленный тип поля нарушается, что может привести к ошибкам при сравнении или форматировании даты downstream. Рекомендуется явно парсить строку обратно в datetime в from_dict.
  • [src/python/tests/sentry/integrations/services/test_assignment_source.py:13] Опечатка в имени теста: test_from_dict_inalid_data — Имя тестового метода содержит опечатку — inalid вместо invalid. Это снижает читаемость и обнаруживаемость теста при поиске.
  • [src/python/src/sentry/integrations/mixins/issues.py:15] Базовый метод should_sync игнорирует параметр sync_source — Сигнатура IssueBasicIntegration.should_sync расширена параметром sync_source: AssignmentSource | None = None, но тело метода безусловно возвращает False, не используя новый аргумент. Это допустимо как no-op базовая реализация, но отсутствует docstring или комментарий, поясняющий, что логика предотвращения циклов реализована только в подклассах. Будущие читатели могут ошибочно предположить, что базовый класс выполняет проверку циклов. Рекомендуется добавить комментарий с описанием намерения.

Автоматическое ревью от Review Engine v2.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant