#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2024 by the Linux Foundation
"""Data models, enums, exceptions, and constants for ezgb."""
from __future__ import annotations
import enum
from dataclasses import dataclass, field
from datetime import datetime, timezone
_EPOCH_UTC = datetime.min.replace(tzinfo=timezone.utc)
# -- Exceptions --------------------------------------------------------------
[docs]
class EzgbError(Exception):
"""Base exception for all ezgb errors."""
[docs]
class BugNotFoundError(EzgbError):
"""A bug ID could not be resolved or has no operation packs."""
[docs]
class AmbiguousBugIdError(EzgbError):
"""A bug ID prefix matches multiple bugs."""
[docs]
class IdentityNotFoundError(EzgbError):
"""An identity ID could not be resolved."""
[docs]
class GitError(EzgbError):
"""A git subprocess failed unexpectedly."""
[docs]
class CliError(EzgbError):
"""A git-bug CLI write operation failed."""
# -- Enums -------------------------------------------------------------------
[docs]
class Status(enum.Enum):
"""Bug status matching git-bug's common.Status values."""
OPEN = 1
CLOSED = 2
# -- Constants ---------------------------------------------------------------
# git-bug format versions we support
SUPPORTED_BUG_FORMAT: int = 4
SUPPORTED_IDENTITY_FORMAT: int = 2
# Operation type constants (from entities/bug/operation.go)
OP_CREATE: int = 1
OP_SET_TITLE: int = 2
OP_ADD_COMMENT: int = 3
OP_SET_STATUS: int = 4
OP_LABEL_CHANGE: int = 5
OP_EDIT_COMMENT: int = 6
OP_NOOP: int = 7
OP_SET_METADATA: int = 8
# Status values used in operation JSON
STATUS_OPEN: int = 1
STATUS_CLOSED: int = 2
# -- Dataclasses -------------------------------------------------------------
[docs]
@dataclass(frozen=True)
class Identity:
"""A git-bug user identity."""
id: str
name: str
email: str
login: str = ''
[docs]
@dataclass
class Bug:
"""A git-bug bug snapshot reconstructed from operations."""
id: str
title: str
status: Status
creator: Identity
created_at: datetime
labels: set[str]
comments: list[Comment]
metadata: dict[str, str] = field(default_factory=dict[str, str])
[docs]
@dataclass(frozen=True)
class BugSummary:
"""Lightweight bug snapshot for list views.
Contains only the fields needed for display in listings.
Identity resolution is deferred -- *creator_id* holds the raw
identity hash string rather than a resolved Identity object.
Both the git-bug CLI cache and native git-object reads populate
*author_name* (the creator's resolved display name) and
*edited_at* (the last-activity time). *author_name* may fall back
to the raw identity hash if the identity cannot be resolved.
"""
id: str
title: str
status: Status
creator_id: str
created_at: datetime
labels: frozenset[str]
comment_count: int
author_name: str = ''
edited_at: datetime = _EPOCH_UTC