[Reliability] Молчаливая потеря данных: недоступные задачи выпадают из отчёта, сбой справочника активностей глотается #61

Closed
opened 2026-07-16 18:25:02 +07:00 by artem.kokos · 0 comments
Owner

Проблема

Два места в client.py молча теряют данные — пользователь не узнает, что отчёт неполон.

1. Задачи, не вернувшиеся из issue.filter, исчезают из отчёта вместе с часами (client.py:326-329):

for issue in issues:
    iid = issue.id
    if iid not in spent_time:
        continue

Цикл идёт только по вернувшимся задачам. Если задача удалена или у пользователя нет прав на её просмотр, issue.filter(issue_id=...) её не вернёт — и учтённые на ней часы не попадут в отчёт. Итоговые часы занижаются без какого-либо признака проблемы.

2. Сбой загрузки справочника активностей глотается (client.py:121-125):

try:
    activities = redmine.enumeration.filter(resource="time_entry_activities")
    return {int(a.id): str(a.name) for a in activities}
except Exception:
    return {}

При любой ошибке (нет прав, сеть, HTTP 500) режим --by-activity молча деградирует: разбивки нет, а причина не видна.

Рекомендации

  1. Сравнивать множество spent_time.keys() с ID вернувшихся задач; при расхождении — предупреждение в stderr со списком пропущенных ID и суммой потерянных часов.
  2. При сбое справочника активностей — предупреждение в stderr (причина + что разбивка по активностям отключена) вместо молчаливого return {}.
  3. Тесты: часть задач не вернулась → warning с ID и часами; enumeration.filter бросает исключение → warning и пустой справочник.

Связанные места

  • redmine_reporter/client.py:320-335 (сборка результата)
  • redmine_reporter/client.py:118-128 (_load_time_entry_activities)

Критерии приёмки

  • Пропущенные задачи видны в stderr: ID и сумма потерянных часов.
  • Сбой справочника активностей сопровождается предупреждением.
  • Добавлены тесты на оба случая.
## Проблема Два места в `client.py` молча теряют данные — пользователь не узнает, что отчёт неполон. **1. Задачи, не вернувшиеся из `issue.filter`, исчезают из отчёта вместе с часами** (`client.py:326-329`): ```python for issue in issues: iid = issue.id if iid not in spent_time: continue ``` Цикл идёт только по вернувшимся задачам. Если задача удалена или у пользователя нет прав на её просмотр, `issue.filter(issue_id=...)` её не вернёт — и учтённые на ней часы не попадут в отчёт. Итоговые часы занижаются без какого-либо признака проблемы. **2. Сбой загрузки справочника активностей глотается** (`client.py:121-125`): ```python try: activities = redmine.enumeration.filter(resource="time_entry_activities") return {int(a.id): str(a.name) for a in activities} except Exception: return {} ``` При любой ошибке (нет прав, сеть, HTTP 500) режим `--by-activity` молча деградирует: разбивки нет, а причина не видна. ## Рекомендации 1. Сравнивать множество `spent_time.keys()` с ID вернувшихся задач; при расхождении — предупреждение в stderr со списком пропущенных ID и суммой потерянных часов. 2. При сбое справочника активностей — предупреждение в stderr (причина + что разбивка по активностям отключена) вместо молчаливого `return {}`. 3. Тесты: часть задач не вернулась → warning с ID и часами; `enumeration.filter` бросает исключение → warning и пустой справочник. ## Связанные места - `redmine_reporter/client.py:320-335` (сборка результата) - `redmine_reporter/client.py:118-128` (`_load_time_entry_activities`) ## Критерии приёмки - [ ] Пропущенные задачи видны в stderr: ID и сумма потерянных часов. - [ ] Сбой справочника активностей сопровождается предупреждением. - [ ] Добавлены тесты на оба случая.
artem.kokos added the redminereliability labels 2026-07-16 18:25:02 +07:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: artem.kokos/redmine-reporter#61