Manage properly semver in your repository
Project description
Semversioner
The easiest way to manage semantic versioning in your project and generate CHANGELOG.md files automatically.
Semversioner provides the tooling to automate the semver release process for libraries, docker images, microservices, and more.
This project was inspired by the way AWS manages their versioning for AWS-cli.
Semantic Versioning
The semantic versioning spec involves several possible variations, but to simplify, in Semversioner we are using the three-part version number:
<major>.<minor>.<patch>
Constructed with the following guidelines:
- Breaking backward compatibility or major features bumps the major (and resets the minor and patch).
- New additions without breaking backward compatibility bumps the minor (and resets the patch).
- Bug fixes and misc changes bumps the patch.
An example would be 1.0.0.
How it works
At any given time, the .semversioner/ directory looks like:
.semversioner
├── next-release
│ ├── minor-20181227010225.json
│ └── major-20181228010225.json
├── 1.1.0.json
├── 1.1.1.json
└── 1.1.2.json
The release process takes everything in the next-release directory and aggregates them all together in a single JSON file for that release (e.g., 1.12.0.json). This JSON file is a list of all the individual JSON files from next-release.
Install
pip install semversioner
Usage
You can use the --help option on any command to see the available options:
semversioner --help
Adding changesets
In your local environment, you can use the CLI to create the different changeset files that will be committed with your code. This ensures that every pull request or commit contains its own self-contained change description and version bump intention.
semversioner add-change --type patch --description "Fix security vulnerability with authentication."
Allowed --type values are: major, minor, patch.
You can also add custom attributes to the changeset file that will be available later in your release template. Use the --attributes flag in key=value format (you can pass it multiple times):
semversioner add-change --type patch \
--description "My custom changelog message with attributes." \
--attributes pr_id=322 \
--attributes issue_id=123
Checking working directory status
You can check the status of your working directory to see the current version, the computed next version, and any unreleased changes:
semversioner status
Example output:
Version: 1.0.0
Next version: 1.1.0
Unreleased changes:
minor: Added new authentication feature
(use "semversioner release" to release the next version)
Enforcing changesets in CI/CD (Check)
In your CI/CD pipeline, it's often useful to enforce that a PR includes a changeset before merging. You can use the check command to verify that there are unreleased changes in the .semversioner/next-release/ directory.
semversioner check
If no changes are found, the command exits with a non-zero status code (-1) and prints an error message.
Releasing a new version
When you are ready to create a release (usually in your CI/CD tool on the main branch), you run the release command. This automatically computes the new version number based on the unreleased changes, generates a new version JSON file, and clears the next-release directory.
semversioner release
Generating the Changelog
As part of your release workflow, you can generate the changelog file with all aggregated changes.
semversioner changelog > CHANGELOG.md
Customizing the changelog template
You can customize the changelog by creating a template and passing it as a parameter to the command. For example:
semversioner changelog --template .semversioner/config/template.j2
The template uses Jinja2, a templating language for Python. A basic example:
# Changelog
{% for release in releases %}
## {{ release.version }}
{% for change in release.changes %}
- {{ change.type }}: {{ change.description }}
{% endfor %}
{% endfor %}
If you included custom attributes (e.g., pr_id, issue_id) using the add-change command, you can reference them in your template. You also have access to current_version:
# Changelog
Note: version releases in the 0.x.y range may introduce breaking changes.
# Current version: {{ current_version }}
{% for release in releases %}
## {{ release.version }}{{ ' (' + release.created_at.strftime('%Y-%m-%d') + ')' if release.created_at }}
{% for change in release.changes %}
- {{ change.type }}: {{ change.description }}{{ ' (#' + change.attributes.pr_id + ')' if change.attributes }}{{ ' (J' + change.attributes.issue_id + ')' if change.attributes }}
{% endfor %}
{% endfor %}
Filtering the changelog
You can filter the changelog by only showing changes for a specific version:
semversioner changelog --version "1.0.0"
Alternatively, you can filter changes for the last released version:
semversioner changelog --version $(semversioner current-version)
Getting the current version
You can retrieve the currently released version of your project:
semversioner current-version
Getting the next version
As part of the CI/CD workflow, sometimes you want to release dev, rc, or other pre-release packages. For this purpose, the next-version command can be issued to compute the upcoming version based on the current changeset. This will not modify any files on disk.
semversioner next-version
Global Options
--path: Specify a custom base path for your project. Defaults to the current directory. Example:semversioner --path /path/to/project release
License
Copyright (c) 2026 Raul Gomis. MIT licensed, see LICENSE file.
Made with ♥ by Raul Gomis.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file semversioner2-3.2.0.tar.gz.
File metadata
- Download URL: semversioner2-3.2.0.tar.gz
- Upload date:
- Size: 13.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2999c9c2103f19fb97239deb6f8b99b97f06f82e21f460fc8a214220d7aa1ca2
|
|
| MD5 |
693cbb27ca391d4519ac44bd530b59ca
|
|
| BLAKE2b-256 |
701c225baa314a39cb4bf8f34e2b861919ccfbea37a5ec8822ce430500f7361b
|
File details
Details for the file semversioner2-3.2.0-py3-none-any.whl.
File metadata
- Download URL: semversioner2-3.2.0-py3-none-any.whl
- Upload date:
- Size: 13.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec71841dcb2ac30dc99247ad18bd471e9b460ea9539dd3ab9d57ace60db4bd09
|
|
| MD5 |
35efb17b11e3376e3a90f5d9eff89ae4
|
|
| BLAKE2b-256 |
8f1dc83b06ac178d9c5f39c8fd4d49052b4b844a37c727f3b64fc708264b1229
|