Skip to main content

Access to the project version in Python code for PEP 621-style projects

Project description

Single-source: There is only one truth

single-source helps to reduce the entropy in your Python project by keeping single source of truth.

The targets of this library are modern Python projects which want to have one source of truth for version, name and etc.

At the moment, the library provides the single point for a package version.

It supports Python 3.8+.

Quick start

# root_package/__init__.py
from pathlib import Path
from single_source import get_version

__version__ = get_version(__name__, Path(__file__).parent.parent)

Root of the problem

You use modern pyproject.toml and want to keep the version of your package here:

# pyproject.toml
[tool.poetry]
name = "modern-project"
version = "0.1.0"

Let's imagine the version of your package is required in some place of the code.

Since you need the version in your Python code, you may want to duplicate the version by putting it as a string variable to some python file:

# modern_project/__init__.py
__version__ = "0.1.0"

# modern_project/version.py
version = "0.1.0"

Then you realize you don't want to have the version in a python file and in pyproject.toml at the same time. It's harder to keep them consistent and easier to forget to bump both versions before release.

Also, you don't want to build the wheel by creating some script for auto incrementing the version in both places (and use it in your CI flow, for example). Instead you want use poetry version commands.

Installation

You can install single-source via pip

pip3 install single-source

or via poetry

poetry add single-source

The library also available as a conda package in conda-forge channel

conda install single-source --channel conda-forge

Advanced usage

Changing default value

If it's not possible to get the version from package metadata or there is no pyproject.toml get_version returns "" - empty string by default. You can change this value by providing a value as a default_return keyword argument.

from pathlib import Path
from single_source import get_version

path_to_pyproject_dir = Path(__file__).parent.parent
__version__ = get_version(__name__, path_to_pyproject_dir, default_return=None)

Raising an exception

You may want to raise an exception in case the version of the package has not been found.

from pathlib import Path
from single_source import get_version, VersionNotFoundError

path_to_pyproject_dir = Path(__file__).parent.parent
try:
    __version__ = get_version(__name__, path_to_pyproject_dir, fail=True)
except VersionNotFoundError:
    pass

Not only pyproject.toml

You can use single-source even if you still store the version of your library in setup.py or in any other utf-8 encoded text file.

First, try without custom regex, probably it can parse the version

If the default internal regex does not find the version in your file, the only thing you need to provide is a custom regex to get_version:

from single_source import get_version

custom_regex = r"\s*version\s*=\s*[\"']\s*([-.\w]{3,})\s*[\"']\s*"

path_to_file = "~/my-project/some_file_with_version.txt"
__version__ = get_version(__name__, path_to_file, version_regex=custom_regex)

Version must be in the first group () in the custom regex.

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

License

MIT

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

single_source-0.4.0.tar.gz (4.8 kB view details)

Uploaded Source

Built Distribution

single_source-0.4.0-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file single_source-0.4.0.tar.gz.

File metadata

  • Download URL: single_source-0.4.0.tar.gz
  • Upload date:
  • Size: 4.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.3 Darwin/23.5.0

File hashes

Hashes for single_source-0.4.0.tar.gz
Algorithm Hash digest
SHA256 7917aa113bda60072f01952e2966cd7247f0ec16fe52a1555f3c066b553e98b4
MD5 c390c767c8847d49c2331187fbe948dd
BLAKE2b-256 85c5096cda37599fb12f9930266ebb66e72e0ef3c39eb8be1934025f44e9c7ed

See more details on using hashes here.

File details

Details for the file single_source-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: single_source-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.3 Darwin/23.5.0

File hashes

Hashes for single_source-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 38880b16e6e0ca2e012f85dc3820eb31999ace5f1d9a588395ea38f8bd0775f5
MD5 08519458458d9968279a5594c95dec3b
BLAKE2b-256 7f34c26bc3fbd88437ae3417f57f10c5eff926e095cc3d61a235478907c28b2d

See more details on using hashes here.

Supported by

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