Skip to main content

Manage properly semver in your repository

Project description

Semversioner

The easiest way to manage semantic versioning in your project and generate CHANGELOG.md file automatically.

Semversioner will provide the tooling to automate semver release process for libraries, docker images, etc.

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 next-release 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

Bumping the version

In your local environment your will use the CLI to create the different changeset files that will be committed with your code. For example:

semversioner add-change --type patch --description "Fix security vulnerability with authentication."

Then, in your CI/CD tool you will need to release (generating automatically version number) and creating the the changelog file.

semversioner release

Generating Changelog

As a part of your CI/CD workflow, you will be able to generate the changelog file with all changes.

semversioner changelog > CHANGELOG.md

You can customize the changelog by creating a template and passing it as parameter to the command. For example:

semversioner changelog --template .semversioner/config/template.j2

The template is using Jinja2, a templating language for Python. For example:

# Changelog
{% for release in releases %}

## {{ release.version }}

{% for change in release.changes %}
- {{ change.type }}: {{ change.description }}
{% endfor %}
{% endfor %}

Since semversioner 2.0 you can also add custom attributes to the changeset file that will be available in the release template:

semversioner add-change --type patch --description "My custom changelog message with attributes." --attributes pr_id=322 --attributes issue_id=123

Then, you can show the attributes in the changelog template. For example:

# Changelog
Note: version releases in the 0.x.y range may introduce breaking changes.

# Current version: {{ current_version }}

{% for release in releases %}

## {{ release.version }} (<DATE>)

{% 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 %}

You can filter the changelog by only showing changes for a specific version:

semversioner changelog --version "1.0.0"

Alternatively, you can use the following command to filter changes by the last released version:

semversioner changelog --version $(semversioner current-version)

Getting 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 next version based on the current change set. This will not change any files on disk, and they are as such preserved for any future release.

semversioner next-version

License

Copyright (c) 2023 Raul Gomis. MIT licensed, see LICENSE file.


Made with ♥ by Raul Gomis <https://twitter.com/rgomis>.

Changelog

Note: version releases in the 0.x.y range may introduce breaking changes.

2.1.2

  • patch: Add test coverage calculation and GitHub Actions integration

2.1.1

  • patch: Add Python 3.14 to supported versions and CI test matrix

2.1.0

  • minor: Expose current_version to changelog templates.

2.0.8

  • patch: Fix file creation race condition

2.0.7

  • patch: Fix deprecated datetime.utcnow() usage by replacing with datetime.now(timezone.utc) for Python 3.12+ compatibility

2.0.6

  • patch: Bump jinja2 from 3.1.4 to 3.1.6.

2.0.5

  • patch: move main logic into main.py

2.0.4

  • patch: Include CHANGELOG.md into package.

2.0.3

  • patch: Bump jinja2 from 3.1.3 to 3.1.4 to patch CVE-2024-34064.

2.0.2

  • patch: Bump jinja2 from 3.1.2 to 3.1.3 to fix CVE-2024-22195.

2.0.1

  • patch: Add documentation for custom attributes in the changelog template.

2.0.0

  • major: Drop support for Python 3.6 and 3.7 as they are not maintained. Minimum supported version is Python 3.8.
  • major: Upgrade project third-party dependencies to latest version.
  • minor: Add support for custom properties in changeset files.
  • minor: Change deletion logic in next-release folder: only delete json files, and delete the folder only if empty. This will allow to keep the next-release folder if it contains other files such as .gitkeep for example.
  • minor: Change json mapper to use granurality of seconds instead of milliseconds for created_at field in releases.
  • patch: Clean up README Markdown syntax.

1.7.0

  • minor: Validated JSON extension in the folder.
  • patch: Upgraded development libraries to latest version.

1.6.0

  • minor: Decreased packaging minimum version requirements to version 21.0

1.5.2

  • patch: Internal: improve CI/CD workflow

1.5.1

  • patch: Fix install packaging module to fix module issues.

1.5.0

  • minor: Fix remove StrictVersion deprecation notice by switching to package.version parse method.
  • patch: Internal: Support python 3.11 in Github actions.

1.4.1

  • patch: Fixed CVE-2022-40898 in pypa/wheel (development library).
  • patch: Update development dependencies to the latest version.

1.4.0

  • minor: Add support for storing release datetime in order to display it in the changelog.
  • patch: All tests are now able to be run on Windows
  • patch: Fix: bug showing incorrect error using release command with no changesets created.

1.3.0

  • minor: Add CLI command to detect missing changeset files before merging to the destination branch.
  • minor: Add exception handling support to use Semversioner as a library.
  • patch: Fix next-version error command color.

1.2.0

  • minor: Added command next-version, to compute the version of the next release, without actually performing the release

1.1.0

  • minor: Expose models to use semversioner as a library.
  • minor: Use models for better encapsulation and code refactoring.

1.0.0

  • major: Drop support for Python 3.6.
  • minor: Add type hinting.
  • minor: Bump click dependency to 8.0.3.
  • minor: Bump jinja2 dependency to 3.0.3.
  • patch: Add Python 3.10 testing in the CI/CD process.
  • patch: Bump importlib_resources dependency to 5.4.0.
  • patch: Bump pytest dependency to 6.2.5.
  • patch: Bump twine dependency to 3.7.1.
  • patch: Bump wheel dependency to 0.37.0.
  • patch: Remove unnecessary dependency: colorama.
  • patch: Rename semversioner directory to .semversioner.

0.13.0

  • minor: Add support for custom changelog template
  • patch: Fix security vulnerability with jinja2 CVE-2020-28493

0.12.0

  • minor: Improved performance by supporting multiple changeset files per second
  • minor: Status command now sorts unreleased changes by type and description in order to display consistent results
  • patch: Internal code refactor to improve code readability and maintanability

0.11.0

  • minor: Add '--version' filter to the 'changelog' command to display the changelog only for a specific version

0.10.0

  • minor: Add new 'status' command to display the state of the working directory and unreleased changes
  • patch: Fix build and deployment configuration
  • patch: Refactor method names and code for better code readability and testability

0.9.0

  • minor: Deprecated .changes directory in favour of .semversioner directory
  • patch: Internal refactor to improve code quality and test coverage

0.8.1

  • patch: Fix installer error when referencing to LICENSE file

0.8.0

  • minor: Enabled autocompletion by default

0.7.1

  • patch: Improve docs for open source

0.7.0

  • minor: Fail with error code when no changes are provided in the release command

0.6.16

  • patch: Fix bug: add require module in setup.py

0.6.15

  • patch: Fix packaging for LICENSE
  • patch: Improve README.md documentation
  • patch: Use jinja2 template engine internally to generate the changelog

0.6.14

  • patch: Update docs

0.6.13

  • patch: Fix README.md

0.6.12

  • patch: Fix long description content type

0.6.11

  • patch: Add README.md file

0.6.10

  • patch: Fix code consistency

0.6.9

  • patch: Fix packaging

0.6.8

  • patch: Tag the repository when releasing

0.6.7

  • patch: Fix tests and improve coverage

0.6.6

  • minor: Initial version

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

semversioner-2.1.2.tar.gz (16.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

semversioner-2.1.2-py2.py3-none-any.whl (13.8 kB view details)

Uploaded Python 2Python 3

File details

Details for the file semversioner-2.1.2.tar.gz.

File metadata

  • Download URL: semversioner-2.1.2.tar.gz
  • Upload date:
  • Size: 16.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.18

File hashes

Hashes for semversioner-2.1.2.tar.gz
Algorithm Hash digest
SHA256 0fedfd2ab191c2c1b1ad41b7356d96d6a9409755eb2a0eb52aedd30bee66cd28
MD5 c89c5ab716ea17b8969314df3e4e2280
BLAKE2b-256 6750d8e1060077374ccb60278456430f24d82e18766c934104569d228e43e2c5

See more details on using hashes here.

File details

Details for the file semversioner-2.1.2-py2.py3-none-any.whl.

File metadata

  • Download URL: semversioner-2.1.2-py2.py3-none-any.whl
  • Upload date:
  • Size: 13.8 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.18

File hashes

Hashes for semversioner-2.1.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 2c07573470f5fa213f05e85c68f50eefab5816d9d71e617830649630d9394491
MD5 6e590a808402ed75c99282d399fe9e6b
BLAKE2b-256 510f147a529f03f046ffc2a013707d5a473df3ff8d3d0a20584b1d959b880b8a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page