diff --git a/changelog/+branch-graph-version-status.added.md b/changelog/+branch-graph-version-status.added.md new file mode 100644 index 00000000..7546285d --- /dev/null +++ b/changelog/+branch-graph-version-status.added.md @@ -0,0 +1 @@ +Add `graph_version` and `status` properties to `Branch` \ No newline at end of file diff --git a/infrahub_sdk/branch.py b/infrahub_sdk/branch.py index 2b1905ce..4f5e050f 100644 --- a/infrahub_sdk/branch.py +++ b/infrahub_sdk/branch.py @@ -1,6 +1,7 @@ from __future__ import annotations import warnings +from enum import Enum from typing import TYPE_CHECKING, Any, Literal, overload from urllib.parse import urlencode @@ -14,6 +15,13 @@ from .client import InfrahubClient, InfrahubClientSync +class BranchStatus(str, Enum): + OPEN = "OPEN" + NEED_REBASE = "NEED_REBASE" + NEED_UPGRADE_REBASE = "NEED_UPGRADE_REBASE" + DELETING = "DELETING" + + class BranchData(BaseModel): id: str name: str @@ -21,6 +29,8 @@ class BranchData(BaseModel): sync_with_git: bool is_default: bool has_schema_changes: bool + graph_version: int | None = None + status: BranchStatus = BranchStatus.OPEN origin_branch: str | None = None branched_from: str @@ -34,6 +44,8 @@ class BranchData(BaseModel): "is_default": None, "sync_with_git": None, "has_schema_changes": None, + "graph_version": None, + "status": None, } BRANCH_DATA_FILTER = {"@filters": {"name": "$branch_name"}} diff --git a/infrahub_sdk/ctl/branch.py b/infrahub_sdk/ctl/branch.py index b44be462..42d88384 100644 --- a/infrahub_sdk/ctl/branch.py +++ b/infrahub_sdk/ctl/branch.py @@ -46,6 +46,7 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: table.add_column("Sync with Git") table.add_column("Has Schema Changes") table.add_column("Is Default") + table.add_column("Status") # identify the default branch and always print it first default_branch = [branch for branch in branches.values() if branch.is_default][0] @@ -57,6 +58,7 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: "[green]True" if default_branch.sync_with_git else "[#FF7F50]False", "[green]True" if default_branch.has_schema_changes else "[#FF7F50]False", "[green]True" if default_branch.is_default else "[#FF7F50]False", + default_branch.status, ) for branch in branches.values(): @@ -71,6 +73,7 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: "[green]True" if branch.sync_with_git else "[#FF7F50]False", "[green]True" if default_branch.has_schema_changes else "[#FF7F50]False", "[green]True" if branch.is_default else "[#FF7F50]False", + branch.status, ) console.print(table) diff --git a/tests/unit/ctl/conftest.py b/tests/unit/ctl/conftest.py index e63efec1..30ce70d7 100644 --- a/tests/unit/ctl/conftest.py +++ b/tests/unit/ctl/conftest.py @@ -36,6 +36,8 @@ async def mock_branches_list_query(httpx_mock: HTTPXMock) -> HTTPXMock: "origin_branch": "main", "branched_from": "2023-02-17T09:30:17.811719Z", "has_schema_changes": False, + "graph_version": 99, + "status": "OPEN", }, { "id": "7d9f817a-b958-4e76-8528-8afd0c689ada", @@ -45,6 +47,8 @@ async def mock_branches_list_query(httpx_mock: HTTPXMock) -> HTTPXMock: "origin_branch": "main", "branched_from": "2023-02-17T09:30:17.811719Z", "has_schema_changes": True, + "graph_version": None, + "status": "NEED_UPGRADE_REBASE", }, ] } diff --git a/tests/unit/sdk/conftest.py b/tests/unit/sdk/conftest.py index 451a2adb..efa4f845 100644 --- a/tests/unit/sdk/conftest.py +++ b/tests/unit/sdk/conftest.py @@ -1498,6 +1498,8 @@ async def mock_branches_list_query(httpx_mock: HTTPXMock) -> HTTPXMock: "origin_branch": "main", "branched_from": "2023-02-17T09:30:17.811719Z", "has_schema_changes": False, + "graph_version": 99, + "status": "OPEN", }, { "id": "7d9f817a-b958-4e76-8528-8afd0c689ada", @@ -1507,6 +1509,8 @@ async def mock_branches_list_query(httpx_mock: HTTPXMock) -> HTTPXMock: "origin_branch": "main", "branched_from": "2023-02-17T09:30:17.811719Z", "has_schema_changes": True, + "graph_version": None, + "status": "NEED_UPGRADE_REBASE", }, ] }