All Projects → mtkennerly → Dunamai

mtkennerly / Dunamai

Licence: mit
Dynamic versioning library and CLI

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Dunamai

Poetry Dynamic Versioning
Plugin for Poetry to enable dynamic versioning based on VCS tags
Stars: ✭ 131 (+54.12%)
Mutual labels:  versioning, semantic-versioning, subversion
React Native Version
🔢 Version your React Native or Expo app in a `npm version` fashion.
Stars: ✭ 408 (+380%)
Mutual labels:  versioning, cli, semantic-versioning
Backport
A simple CLI tool that automates the process of backporting commits on a GitHub repo
Stars: ✭ 154 (+81.18%)
Mutual labels:  versioning, cli
Versioning
Gradle plug-in to generate version information from the SCM branch (Git or Svn)
Stars: ✭ 157 (+84.71%)
Mutual labels:  versioning, subversion
versiontag
Bash command to automate tag semantic versioning
Stars: ✭ 40 (-52.94%)
Mutual labels:  versioning, semantic-versioning
Version
Represent and compare versions via semantic versioning (SemVer) in Swift
Stars: ✭ 160 (+88.24%)
Mutual labels:  versioning, semantic-versioning
Semver
Semantic versioning helper library for PHP
Stars: ✭ 144 (+69.41%)
Mutual labels:  versioning, semantic-versioning
Hatch
A modern project, package, and virtual env manager for Python
Stars: ✭ 2,268 (+2568.24%)
Mutual labels:  versioning, cli
Python Semver
Python package to work with Semantic Versioning (http://semver.org/)
Stars: ✭ 264 (+210.59%)
Mutual labels:  versioning, semantic-versioning
Axion Release Plugin
Gradle release & version management plugin.
Stars: ✭ 372 (+337.65%)
Mutual labels:  versioning, semantic-versioning
sv4git
Semantic version and conventional commits for git
Stars: ✭ 33 (-61.18%)
Mutual labels:  versioning, semantic-versioning
Standard Version
🏆 Automate versioning and CHANGELOG generation, with semver.org and conventionalcommits.org
Stars: ✭ 5,806 (+6730.59%)
Mutual labels:  versioning, cli
Nve
Run any command on specific Node.js versions
Stars: ✭ 531 (+524.71%)
Mutual labels:  versioning, cli
Node Installed Check
Checks that all dependencies in your package.json have supported versions installed and complies with your specified node engine version range
Stars: ✭ 67 (-21.18%)
Mutual labels:  versioning, cli
Medium Cli
Medium via CLI
Stars: ✭ 81 (-4.71%)
Mutual labels:  cli
Opaline
NextJS for CLI tools
Stars: ✭ 84 (-1.18%)
Mutual labels:  cli
V2gen
A powerful cross-platform CLI client for V2Ray subscription. 跨平台V2Ray命令行订阅管理客户端
Stars: ✭ 82 (-3.53%)
Mutual labels:  cli
Pg activity
pg_activity is a top like application for PostgreSQL server activity monitoring.
Stars: ✭ 1,232 (+1349.41%)
Mutual labels:  cli
Somafm Cli
🎵 Listen to SomaFM in your terminal via pure bash
Stars: ✭ 84 (-1.18%)
Mutual labels:  cli
Git Copy History
Copy commit history from another repository
Stars: ✭ 84 (-1.18%)
Mutual labels:  cli

Dunamai

Version License: MIT

Dunamai is a Python 3.5+ library and command line tool for producing dynamic, standards-compliant version strings, derived from tags in your version control system. This facilitates uniquely identifying nightly or per-commit builds in continuous integration and releasing new versions of your software simply by creating a tag.

Dunamai is also available as a GitHub Action.

Features

Usage

Install with pip install dunamai, and then use as either a CLI:

# Suppose you are on commit g29045e8, 7 commits after the v0.2.0 tag.
# Note that the "v" prefix on the tag is required, unless you specify
# a different tag style using "--pattern".

# Auto-detect the version control system and generate a version:
$ dunamai from any
0.2.0.post7.dev0+g29045e8

# Or use an explicit VCS and style:
$ dunamai from git --no-metadata --style semver
0.2.0-post.7

# Custom formats:
$ dunamai from any --format "v{base}+{distance}.{commit}"
v0.2.0+7.g29045e8

# If you'd prefer to frame the version in terms of progress toward the next
# release rather than distance from the latest one, you can bump it:
$ dunamai from any --bump
0.2.1.dev7+g29045e8

# Validation of custom formats:
$ dunamai from any --format "v{base}" --style pep440
Version 'v0.2.0' does not conform to the PEP 440 style

# Validate your own freeform versions:
$ dunamai check 0.01.0 --style semver
Version '0.01.0' does not conform to the Semantic Versioning style

# More info:
$ dunamai --help
$ dunamai from --help
$ dunamai from git --help

Or as a library:

from dunamai import Version, Style

# Let's say you're on commit g644252b, which is tagged as v0.1.0.
version = Version.from_git()
assert version.serialize() == "0.1.0"

# Let's say there was a v0.1.0rc5 tag 44 commits ago
# and you have some uncommitted changes.
version = Version.from_any_vcs()
assert version.serialize() == "0.1.0rc5.post44.dev0+g644252b"
assert version.serialize(metadata=False) == "0.1.0rc5.post44.dev0"
assert version.serialize(dirty=True) == "0.1.0rc5.post44.dev0+g644252b.dirty"
assert version.serialize(style=Style.SemVer) == "0.1.0-rc.5.post.44+g644252b"

The serialize() method gives you an opinionated, PEP 440-compliant default that ensures that versions for untagged commits are compatible with Pip's --pre flag. The individual parts of the version are also available for you to use and inspect as you please:

assert version.base == "0.1.0"
assert version.stage == "rc"
assert version.revision == 5
assert version.distance == 44
assert version.commit == "g644252b"
assert version.dirty is True

# Available if the latest tag includes metadata, like v0.1.0+linux:
assert version.tagged_metadata == "linux"

Comparison to Versioneer

Versioneer is another great library for dynamic versions, but there are some design decisions that prompted the creation of Dunamai as an alternative:

  • Versioneer requires a setup.py file to exist, or else versioneer install will fail, rendering it incompatible with non-setuptools-based projects such as those using Poetry or Flit. Dunamai can be used regardless of the project's build system.
  • Versioneer has a CLI that generates Python code which needs to be committed into your repository, whereas Dunamai is just a normal importable library with an optional CLI to help statically include your version string.
  • Versioneer produces the version as an opaque string, whereas Dunamai provides a Version class with discrete parts that can then be inspected and serialized separately.
  • Versioneer provides customizability through a config file, whereas Dunamai aims to offer customizability through its library API and CLI for both scripting support and use in other libraries.

Integration

  • Setting a __version__ statically:

    $ echo "__version__ = '$(dunamai from any)'" > your_library/_version.py
    
    # your_library/__init__.py
    from your_library._version import __version__
    

    Or dynamically (but Dunamai becomes a runtime dependency):

    # your_library/__init__.py
    import dunamai as _dunamai
    __version__ = _dunamai.get_version("your-library", third_choice=_dunamai.Version.from_any_vcs).serialize()
    
  • setup.py (no install-time dependency on Dunamai as long as you use wheels):

    from setuptools import setup
    from dunamai import Version
    
    setup(
        name="your-library",
        version=Version.from_any_vcs().serialize(),
    )
    

    Or you could use a static inclusion approach as in the prior example.

  • Poetry:

    $ poetry version $(dunamai from any)
    

Development

This project is managed using Poetry. Development requires Python 3.6+ because of Black.

  • If you want to take advantage of the default VSCode integration, then first configure Poetry to make its virtual environment in the repository:
    poetry config settings.virtualenvs.in-project true
    
  • After cloning the repository, activate the tooling:
    poetry install
    poetry run pre-commit install
    
  • Run unit tests:
    poetry run pytest --cov
    poetry run tox
    
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].