Source code for semantic_release.commit_parser.conventional.options

from __future__ import annotations

from itertools import zip_longest
from typing import Tuple

from pydantic.dataclasses import dataclass

from semantic_release.commit_parser._base import ParserOptions
from semantic_release.enums import LevelBump


[docs] @dataclass class ConventionalCommitParserOptions(ParserOptions): """Options dataclass for the ConventionalCommitParser.""" minor_tags: Tuple[str, ...] = ("feat",) """Commit-type prefixes that should result in a minor release bump.""" patch_tags: Tuple[str, ...] = ("fix", "perf") """Commit-type prefixes that should result in a patch release bump.""" other_allowed_tags: Tuple[str, ...] = ( "build", "chore", "ci", "docs", "style", "refactor", "test", ) """Commit-type prefixes that are allowed but do not result in a version bump.""" allowed_tags: Tuple[str, ...] = ( *minor_tags, *patch_tags, *other_allowed_tags, ) """ All commit-type prefixes that are allowed. These are used to identify a valid commit message. If a commit message does not start with one of these prefixes, it will not be considered a valid commit message. """ default_bump_level: LevelBump = LevelBump.NO_RELEASE """The minimum bump level to apply to valid commit message.""" parse_squash_commits: bool = True """Toggle flag for whether or not to parse squash commits""" ignore_merge_commits: bool = True """Toggle flag for whether or not to ignore merge commits""" @property def tag_to_level(self) -> dict[str, LevelBump]: """A mapping of commit tags to the level bump they should result in.""" return self._tag_to_level def __post_init__(self) -> None: self._tag_to_level: dict[str, LevelBump] = { str(tag): level for tag, level in [ # we have to do a type ignore as zip_longest provides a type that is not specific enough # for our expected output. Due to the empty second array, we know the first is always longest # and that means no values in the first entry of the tuples will ever be a LevelBump. We # apply a str() to make mypy happy although it will never happen. *zip_longest(self.allowed_tags, (), fillvalue=self.default_bump_level), *zip_longest(self.patch_tags, (), fillvalue=LevelBump.PATCH), *zip_longest(self.minor_tags, (), fillvalue=LevelBump.MINOR), ] if "|" not in str(tag) }