Fix version display, deterministic sort, remove duplicate sort

get_version() now returns version.name instead of str(version), which
returned the numeric ID from redminelib.resources.Version. Falls back
to str() when .name is absent (#14).

Add issue.id as tertiary sort key in build_grouped_report so tasks
within the same project+version group always appear in the same order
regardless of API response ordering (#33).

Remove redundant sort from client.fetch_issues_with_spent_time — the
sort already runs in report_builder.build_grouped_report, so doing it
twice wastes CPU. Also remove the now-unused get_version import (#32).

Closes #14, closes #32, closes #33
This commit is contained in:
Артём Кокос
2026-06-25 23:32:14 +07:00
parent 3a6d1b7ba7
commit dbc4cf960a
5 changed files with 50 additions and 7 deletions

View File

@@ -78,3 +78,35 @@ def test_get_version_none_attribute():
fixed_version = None
assert get_version(MockIssue()) == "<N/A>"
def test_get_version_with_redminelib_version_object():
"""redminelib Version: str() возвращает ID, .name — человекочитаемое имя."""
class MockVersion:
"""Имитирует redminelib.resources.Version — str() даёт ID."""
def __init__(self, vid, name):
self.id = vid
self.name = name
def __str__(self):
return str(self.id)
class MockIssue:
fixed_version = MockVersion(42, "v2.5.0")
assert get_version(MockIssue()) == "v2.5.0"
def test_get_version_falls_back_to_str_when_no_name():
"""Если у объекта версии нет .name — fallback на str()."""
class MockVersionNoName:
def __str__(self):
return "fallback-id"
class MockIssue:
fixed_version = MockVersionNoName()
assert get_version(MockIssue()) == "fallback-id"