Source code for pkgcore.bugzilla.enums

"""Bugzilla vocabularies used by bugs.gentoo.org.

Only what pkgcore-adjacent tooling actually writes is enumerated; values read
back off the wire stay plain strings, so anything Gentoo adds later never
breaks parsing.
"""

__all__ = (
    "OPEN_STATUSES",
    "UNRESOLVED",
    "BugCategory",
    "ChartOp",
    "Component",
    "FlagStatus",
    "Join",
    "Product",
    "Resolution",
    "RuntimeTesting",
    "Severity",
    "Status",
)

import enum
import typing


[docs] class Product(enum.StrEnum): """The bugs.gentoo.org products this module knows about""" GENTOO_LINUX = "Gentoo Linux" GENTOO_SECURITY = "Gentoo Security"
[docs] class Component(enum.StrEnum): """Components of Gentoo Linux, plus the security one that matters""" STABILIZATION = "Stabilization" KEYWORDING = "Keywording" CURRENT_PACKAGES = "Current packages" NEW_PACKAGES = "New packages" ECLASSES = "Eclasses" PROFILES = "Profiles" VULNERABILITIES = "Vulnerabilities"
[docs] class Status(enum.StrEnum): """Bug workflow states, there is no NEW, ASSIGNED or CLOSED""" UNCONFIRMED = "UNCONFIRMED" CONFIRMED = "CONFIRMED" IN_PROGRESS = "IN_PROGRESS" RESOLVED = "RESOLVED" VERIFIED = "VERIFIED" @property def is_open(self) -> bool: return self in OPEN_STATUSES
OPEN_STATUSES: typing.Final[tuple["Status", ...]] = ( Status.UNCONFIRMED, Status.CONFIRMED, Status.IN_PROGRESS, ) # selects unresolved bugs in a search; an open bug stores the empty string UNRESOLVED: typing.Final = "---"
[docs] class Resolution(enum.StrEnum): """Resolutions enabled on bugs.gentoo.org. LATER and REMIND are legacy values still set on old bugs, listed so parsing round-trips rather than because anything should write them. """ FIXED = "FIXED" INVALID = "INVALID" WONTFIX = "WONTFIX" LATER = "LATER" REMIND = "REMIND" DUPLICATE = "DUPLICATE" WORKSFORME = "WORKSFORME" CANTFIX = "CANTFIX" NEEDINFO = "NEEDINFO" TEST_REQUEST = "TEST-REQUEST" UPSTREAM = "UPSTREAM" OBSOLETE = "OBSOLETE" PKGREMOVED = "PKGREMOVED"
[docs] class Severity(enum.StrEnum): """Bug severities, QA being Gentoo specific""" BLOCKER = "blocker" CRITICAL = "critical" MAJOR = "major" NORMAL = "normal" MINOR = "minor" TRIVIAL = "trivial" ENHANCEMENT = "enhancement" QA = "QA"
[docs] class FlagStatus(enum.StrEnum): """Status of a Bugzilla flag, CLEARED being write only""" REQUESTED = "?" GRANTED = "+" DENIED = "-" CLEARED = "X"
[docs] class RuntimeTesting(enum.StrEnum): """Values of cf_runtime_testing_required. The field only exists on the Keywording and Stabilization components, and reads back as UNSET everywhere else. """ UNSET = "---" YES = "Yes" NO = "No" MANUAL = "Manual"
[docs] class BugCategory(enum.StrEnum): """Gentoo arch team bug categories, valued by their Bugzilla component""" KEYWORDREQ = "Keywording" STABLEREQ = "Stabilization"
[docs] @classmethod def from_product_component( cls, product: str, component: str ) -> "BugCategory | None": """Classify a bug, returning None if it's neither category""" if product == Product.GENTOO_LINUX: try: return cls(component) except ValueError: pass return None
@property def product(self) -> Product: return Product.GENTOO_LINUX @property def component(self) -> Component: return Component(self.value) @property def summary_suffix(self) -> str: """The conventional trailing word of the bug summary""" return "keywordreq" if self is BugCategory.KEYWORDREQ else "stablereq" @property def verb(self) -> str: """The verb used when describing the request""" return "keyword" if self is BugCategory.KEYWORDREQ else "stabilize"
[docs] class ChartOp(enum.StrEnum): """Operators accepted by Bugzilla's boolean charts, the o<N> params. MATCHES and NOT_MATCHES are only valid against the fulltext content field, and IS_EMPTY/IS_NOT_EMPTY still need a v<N> value even though it's ignored. """ EQUALS = "equals" NOT_EQUALS = "notequals" CASE_SUBSTRING = "casesubstring" SUBSTRING = "substring" NOT_SUBSTRING = "notsubstring" REGEXP = "regexp" NOT_REGEXP = "notregexp" LESS_THAN = "lessthan" LESS_THAN_EQ = "lessthaneq" GREATER_THAN = "greaterthan" GREATER_THAN_EQ = "greaterthaneq" MATCHES = "matches" NOT_MATCHES = "notmatches" ANY_EXACT = "anyexact" ANY_WORDS_SUBSTR = "anywordssubstr" ALL_WORDS_SUBSTR = "allwordssubstr" NO_WORDS_SUBSTR = "nowordssubstr" ANY_WORDS = "anywords" ALL_WORDS = "allwords" NO_WORDS = "nowords" CHANGED_BEFORE = "changedbefore" CHANGED_AFTER = "changedafter" CHANGED_FROM = "changedfrom" CHANGED_TO = "changedto" CHANGED_BY = "changedby" IS_EMPTY = "isempty" IS_NOT_EMPTY = "isnotempty"
[docs] class Join(enum.StrEnum): """How a boolean chart group combines its children, the j<N> params. AND_G requires every condition to match the same row, which is what constraining a single flag or attachment needs. """ AND = "AND" OR = "OR" AND_G = "AND_G"