Version-bump your software with a single command
npx @tessl/cli install tessl/pypi-bump-my-version@1.2.0A comprehensive tool for automating version management in software projects. bump-my-version provides both CLI commands and Python API for incrementing version numbers, updating files, creating SCM commits and tags, and integrating with automated build systems.
pip install bump-my-versionimport bumpversion
from bumpversion import __version__For CLI functionality:
from bumpversion.cli import cliFor programmatic version bumping:
from bumpversion.bump import do_bump, get_next_versionFor configuration management:
from bumpversion.config import get_configuration
from bumpversion.config.models import Config# Install globally
pip install bump-my-version
# Generate a sample configuration
bump-my-version sample-config --destination .bumpversion.toml
# Bump version components
bump-my-version bump patch # 1.0.0 -> 1.0.1
bump-my-version bump minor # 1.0.1 -> 1.1.0
bump-my-version bump major # 1.1.0 -> 2.0.0
# Set specific version
bump-my-version bump --new-version 2.1.0
# Show current configuration and version
bump-my-version show current_version
bump-my-version show new_version --increment patch
# Visualize version bumping options
bump-my-version show-bump
# Replace version in files without committing
bump-my-version replace --new-version 2.2.0 file1.py file2.pyfrom bumpversion.config import get_configuration
from bumpversion.bump import do_bump
# Load configuration from project files
config = get_configuration()
# Perform version bump programmatically
do_bump(
version_part="patch",
new_version=None,
config=config,
config_file=None,
dry_run=False
)bump-my-version follows a modular design with several key components:
Primary command-line interface providing version management functionality through interactive commands with comprehensive configuration options.
@click.group(
context_settings={"help_option_names": ["-h", "--help"]},
add_help_option=True,
)
@click.version_option(version=__version__)
@click.pass_context
def cli(ctx: Context) -> None: ...
def bump(
args: List[str],
config_file: Optional[str],
verbose: int,
allow_dirty: Optional[bool],
current_version: Optional[str],
new_version: Optional[str],
# ... additional parameters
) -> None: ...
def show(
args: List[str],
config_file: Optional[str],
format_: str,
increment: Optional[str],
current_version: Optional[str]
) -> None: ...
def replace(
files: List[str],
config_file: Optional[str],
verbose: int,
allow_dirty: Optional[bool],
current_version: Optional[str],
new_version: Optional[str],
# ... additional parameters
) -> None: ...Programmatic API for version parsing, manipulation, and bumping operations with support for multiple versioning schemes.
def do_bump(
version_part: Optional[str],
new_version: Optional[str],
config: Config,
config_file: Optional[Path] = None,
dry_run: bool = False
) -> None: ...
def get_next_version(
current_version: "Version",
config: Config,
version_part: Optional[str],
new_version: Optional[str]
) -> "Version": ...
class Version:
def __init__(
self,
version_spec: VersionSpec,
components: Dict[str, VersionComponent],
original: Optional[str] = None
): ...
def bump(self, component_name: str) -> "Version": ...
def values(self) -> Dict[str, VersionComponent]: ...Comprehensive configuration system supporting multiple file formats with validation and environment variable overrides.
def get_configuration(
config_file: Optional[str] = None,
**overrides: Any
) -> Config: ...
class Config(BaseSettings):
current_version: str
parse: str
serialize: List[str]
search: str
replace: str
files: List[FileChange]
# ... additional configuration fields
def find_config_file(explicit_file: Optional[str] = None) -> Optional[Path]: ...Pattern-based file modification system for updating version strings across multiple files with configurable search and replace patterns.
class ConfiguredFile:
def __init__(self, file_change: FileChange, version_config: VersionConfig): ...
def update_file(
self,
current_version: Version,
new_version: Version,
context: Dict,
dry_run: bool = False
) -> None: ...
def modify_files(
files: List[ConfiguredFile],
current_version: Version,
new_version: Version,
context: Dict,
dry_run: bool = False
) -> None: ...Source control management integration supporting Git and Mercurial for automated commits, tagging, and repository state management.
class SCMInfo:
tool: Optional[str]
commit_sha: Optional[str]
distance_to_latest_tag: int
current_version: str
branch_name: Optional[str]
repository_root: Path
class Git:
def commit_and_tag(
self,
message: str,
tag_name: Optional[str] = None,
tag_message: Optional[str] = None
) -> None: ...
def is_dirty(self) -> bool: ...Pre-commit, post-commit, and setup hook system for extending functionality with custom automation workflows.
def run_setup_hooks(config: Config, current_version: Version, dry_run: bool = False) -> None: ...
def run_pre_commit_hooks(config: Config, current_version: Version, new_version: Version, dry_run: bool = False) -> None: ...
def run_post_commit_hooks(config: Config, current_version: Version, new_version: Version, dry_run: bool = False) -> None: ...class FileChange(BaseModel):
parse: str
serialize: tuple
search: str
replace: str
regex: bool
ignore_missing_version: bool
ignore_missing_file: bool
filename: Optional[str] = None
glob: Optional[str] = None
glob_exclude: Optional[tuple] = None
key_path: Optional[str] = None
include_bumps: Optional[tuple] = None
exclude_bumps: tuple = Field(default_factory=tuple)
class VersionComponentSpec(BaseModel):
values: Optional[list] = None
optional_value: Optional[str] = None
first_value: Union[str, int, None] = None
independent: bool = False
always_increment: bool = False
calver_format: Optional[str] = None
class SCMConfig:
commit: bool = False
tag: bool = False
commit_args: str = ""
message: str = "Bump version: {current_version} → {new_version}"
tag_name: str = "v{new_version}"
tag_message: str = "Bump version: {current_version} → {new_version}"class VersionConfig:
def __init__(
self,
parse: str,
serialize: Tuple[str],
search: str,
replace: str,
part_configs: Optional[Dict[str, VersionComponentSpec]] = None
): ...
def parse(self, version_string: str, raise_error: bool = False) -> Version: ...
class VersionComponent:
def __init__(self, name: str, spec: VersionComponentSpec): ...
def bump(self, value: str) -> str: ...
def null_value(self) -> str: ...class BumpVersionError(Exception):
"""Base exception for all bump-my-version errors."""
class ConfigurationError(BumpVersionError):
"""Raised when configuration is missing or invalid."""
class VersionNotFoundError(BumpVersionError):
"""Raised when version strings are not found in files."""
class InvalidVersionPartError(BumpVersionError):
"""Raised when an invalid version component is specified."""
class DirtyWorkingDirectoryError(BumpVersionError):
"""Raised when working directory is dirty and not allowed."""