Commit b95567f0 authored by Jan Reimes's avatar Jan Reimes
Browse files

feat(utils): add normalize_release_label and infer_working_groups_from_ids

- normalize_release_label(): converts release number to Rel-N label
- infer_working_groups_from_ids(): infers WG enum from TDoc ID prefixes
parent 2a70b2b8
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -429,6 +429,24 @@ def normalize_release_version(release: str) -> str:
    return ".".join(parts)


def normalize_release_label(release: str | None) -> str | None:
    """Normalize a release number to a standard label.

    Args:
        release: Release number (e.g., "18") or special value ("latest")

    Returns:
        "Rel-{number}" for numeric values, "latest" for "latest", None for
        None or empty string.
    """
    if release is None or release == "":
        return None
    if release.lower() == "latest":
        return "latest"
    cleaned = release.strip()
    return f"Rel-{cleaned}"


def normalize_working_group_alias(alias: str) -> WorkingGroup:
    """Normalize working group aliases to canonical working group enums.

+32 −0
Original line number Diff line number Diff line
@@ -138,3 +138,35 @@ def collect_spec_numbers(specs: list[str] | None, spec_file: Path | None) -> lis
        return []

    return expand_spec_ranges_batch(collected)


def infer_working_groups_from_ids(tdoc_ids: list[str]) -> list[WorkingGroup]:
    """Infer working groups from TDoc ID prefixes.

    The first character of a TDoc ID determines the working group:
    - R → RAN
    - S → SA
    - C or T → CT

    Args:
        tdoc_ids: List of TDoc identifiers (e.g., ["R1-2301234", "S4-2301890"])

    Returns:
        Deduplicated list of inferred working groups.
    """
    working_groups: list[WorkingGroup] = []
    for tdoc_id in tdoc_ids:
        if not tdoc_id:
            continue
        first_char = tdoc_id[0].upper()
        if first_char == "R":
            wg = WorkingGroup.RAN
        elif first_char == "S":
            wg = WorkingGroup.SA
        else:
            wg = WorkingGroup.CT

        if wg not in working_groups:
            working_groups.append(wg)

    return working_groups