Source code for mass_driver.models.forge

"""Base definition of Forge, applying changes across git Repositories"""

from enum import Enum

from pydantic import BaseModel, BaseSettings

from mass_driver.models.repository import BranchName

PRStatus = dict[str, bool]
"""The status of a specific PR, as series of flags and bool-predicate.

Keys must be sorted (inserted) from most PR-completed (PR is merged/closed) to least
completed (unreviewed, draft, review-rejected, merge conflicts...)
"""


[docs] class Forge(BaseSettings): """Base class for git Forges like Github"""
[docs] def create_pr( self, forge_repo_url: str, base_branch: BranchName, head_branch: BranchName, pr_title: str, pr_body: str, draft: bool, ) -> str: """Send a PR to forge_repo for given branch of repo_path. Returns PR HTML URL""" raise NotImplementedError("Forge base class can't create PR, use derived")
[docs] def get_pr_status(self, pr: str) -> str: """Get the status of a single given PR, used as key to group PRs by status""" raise NotImplementedError("Forge base class can't get PR status, use derived")
@property def pr_statuses(self) -> list[str]: """A list of possible PR statuses that will be returned by get_pr_status. List is sorted from most complete (accepted-and-merged) to least completed (not merged, not review-approved, has merge-conflicts). The returned list's ordering is used by the view-pr mass-driver command to show the PRs by status, from most completed to least completed. """ raise NotImplementedError("Forge base class can't list PR status, use derived")
[docs] class Config: """Configuration of the Forge class""" underscore_attrs_are_private = True """Ensure that _api is treated private""" env_prefix = "FORGE_"
[docs] class PROutcome(str, Enum): """The category of result after using a Forge over a single repository""" PR_CREATED = "PR_CREATED" """The PR was created correctly""" PR_FAILED = "PR_FAILED" """The PR failed to be created"""
[docs] class PRResult(BaseModel): """The result of applying a patch on a repo""" outcome: PROutcome """The kind of result that PR creation had""" pr_html_url: str | None = None """The HTML URL of the PR that was generated, if any""" details: str | None = None """Details of the PR creation of this repo, if any"""