Skip to main content

univers: mostly universal version and version ranges comparison and conversion

Build Status License Python 3.6+

univers was born out of the need for a mostly universal way to store version ranges and to compare two software package versions in VulnerableCode.

Package version ranges and version constraints are useful and essential:

  • When relating a known vulnerability or bug to a range of affected package versions. For instance a statement such as “vulnerability 123 affects package bar, version 3.1 and version 4.2 but not version 5” defines a range of bar versions affected by a vulnerability.

  • When resolving the dependencies of a package to express which subset of the versions are supported. For instance a dependency requirement statement such as “I require package foo, version 2.0 and later versions” defines a range of acceptable foo versions.

Version syntaxes and range notations are quite different across ecosystems, making it is difficult to process versions and version ranges across ecosystems in a consistent way.

Existing tools and libraries typically support a single algorithms to parse and compare versions with a single version range notation for a single package ecosystem.

univers is different:

  • It tracks each ecosystem versioning scheme and how two versions are compared.

  • It support a growing number of package ecosystems versioning in a single library.

  • It can parse version range strings using their native notation (such as an npm range) into the common “vers” notation and internal object model and can return back a native version range string rebuilt from a “vers” range.

  • It is designed to work with Package URLs (purl).

How does univers work ?

univers wraps, embeds and implements multiple version comparison libraries, each focused on a specific ecosystem versioning scheme.

For each scheme, univers provides an implementation for:

  • the version comparison procedure e.g, how to compare two versions,

  • parsing and converting from a native version range notation to the univers normalized and unified internal model,

  • converting a range back to its scheme-native range syntax and to the vers syntax.

univers implements vers, an experimental unified and mostly universal version range syntax. It can parse and convert an existing native version range strings to this unified syntax. For example, this means:

  • converting “>=1.2.3” as used in a Python package into vers:pypi/>=1.2.3,

  • or converting “^1.0.2” as used in an npm package dependency declaration into vers:npm/>=1.0.2|<2.0.0

The supported package ecosystems versioning schemes and underlying libraries include:

  • npm that use the “node-semver” ranges notation and the semver versions syntax This is supported in part by the semantic_version library.

  • pypi: handled by Python’s packaging library and the standard packaging.version module.

  • Rubygems which use a semver-like but not-quite-semver scheme and there can be commonly more than three version segments. Gems also use a slightly different range notation from node-semver with different operators and slightly different semantics: for instance it uses “~>” as a pessimistic operator and supports exclusion with != and does not support “OR” between constraints (that it call requirements). Gem are handled by Python port of the Rubygems requirements and version handling code from the puppeteer tool

  • debian: handled by the debian-inspector library.

  • maven: handled by the embedded pymaven library.

  • rpm: handled by the embedded rpm_vercmp library.

  • golang (using semver)

  • PHP composer

  • ebuild/gentoo: handled by the embedded gentoo_vercmp module.

  • arch linux: handled by the embedded arch utility module borrowed from msys2.

  • Alpine linux: handled using the base Gentoo version support and extras specific to Alpine.

The level of support for each ecosystem may not be even for now and new schemes and support for more package types are implemented on a continuous basis.

Alternative

Rather than using ecosystem-specific version schemes and code, another approach is to use a single procedure for all the versions as implemented in libversion. libversion works in the most common case but may not work correctly when a task that demand precise version comparisons such as for dependency resolution and vulnerability lookup where a “good enough” comparison accuracy is not acceptable. libversion does not handle version range notations.

Installation

$ pip install univers

Examples

Compare two native Python versions:

from univers.versions import PypiVersion
assert PypiVersion("1.2.3") < PypiVersion("1.2.4")

Normalize a version range from an npm:

from univers.version_range import NpmVersionRange
range = NpmVersionRange.from_native("^1.0.2")
assert str(range) == "vers:npm/>=1.0.2|<2.0.0"

Test if a version is within or outside a version range:

from univers.versions import PypiVersion
from univers.version_range import VersionRange

range = VersionRange.from_string("vers:pypi/>=1.2.4")

assert PypiVersion("1.2.4") in range
assert PypiVersion("1.2.3") not in range

Development

Run these commands, starting from a git clone of https://github.com/aboutcode-org/univers

$ ./configure --dev
$ source venv/bin/active
$ pytest -vvs

We use the same development process as other AboutCode projects.

Visit https://github.com/aboutcode-org/univers and https://gitter.im/aboutcode-org/vulnerablecode and https://gitter.im/aboutcode-org/aboutcode for support and chat.

Primary license: Apache-2.0 SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause AND MIT

Acknowledgements, Funding, Support and Sponsoring

This project is funded, supported and sponsored by:

  • Generous support and contributions from users like you!

  • the European Commission NGI programme

  • the NLnet Foundation

  • the Swiss State Secretariat for Education, Research and Innovation (SERI)

  • Google, including the Google Summer of Code and the Google Seasons of Doc programmes

  • Mercedes-Benz Group

  • Microsoft and Microsoft Azure

  • AboutCode ASBL

  • nexB Inc.

Europa logo EC DG Connect logo

NGI logo NLnet foundation logo

AboutCode logo nexB logo

This project was funded through the NGI0 PET Fund, a fund established by NLnet with financial support from the European Commission’s Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 825310.

NGI Zero PET logo https://nlnet.nl/project/VulnerableCode/

This project was funded through the NGI0 Discovery Fund, a fund established by NLnet with financial support from the European Commission’s Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 825322.

NGI Discovery logo https://nlnet.nl/project/vulnerabilitydatabase/

This project was funded through the NGI0 Core Fund, a fund established by NLnet with financial support from the European Commission’s Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101092990.

NGI Zero Core Logo https://nlnet.nl/project/VulnerableCode-enhancements/

This project is funded through the NGI0 Entrust Fund, a fund established by NLnet with financial support from the European Commission’s Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101069594.

NGI Zero Entrust logo https://nlnet.nl/project/FederatedSoftwareMetadata/

This project was funded through the NGI0 Commons Fund, a fund established by NLnet with financial support from the European Commission’s Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101135429. Additional funding is made available by the Swiss State Secretariat for Education, Research and Innovation (SERI).

NGI Zero Commons Logo Swiss logo https://nlnet.nl/project/FederatedCodeNext/

This project was funded through the NGI0 Entrust Fund, a fund established by NLnet with financial support from the European Commission’s Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101069594.

NGI Zero Entrust logo https://nlnet.nl/project/CRAVEX/

Download files

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

Source Distribution

univers-31.0.0.tar.gz (274.1 kB view details)

Uploaded Source

Built Distribution

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

univers-31.0.0-py3-none-any.whl (95.2 kB view details)

Uploaded Python 3

File details

Details for the file univers-31.0.0.tar.gz.

File metadata

  • Download URL: univers-31.0.0.tar.gz
  • Upload date:
  • Size: 274.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.11

File hashes

Hashes for univers-31.0.0.tar.gz
Algorithm Hash digest
SHA256 06a3f9b1e50e86465005d8bb0a56940dab2bee1f00ed8462760212a501d54751
MD5 5db2690765de203145c3cfe2c412987e
BLAKE2b-256 33a09d80562732a303333c927b5e5b631511a8c012bc577c45dd54ef0b266a15

See more details on using hashes here.

File details

Details for the file univers-31.0.0-py3-none-any.whl.

File metadata

  • Download URL: univers-31.0.0-py3-none-any.whl
  • Upload date:
  • Size: 95.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.11

File hashes

Hashes for univers-31.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4ec8eea8a6d24b6348ec7189eb66c95f069a418206c209b3cd69a203656e1edc
MD5 03d9208086c335ec7178092899c54e54
BLAKE2b-256 99d37561fd63da9271e2960e57e9bd20f2c4b8601fb7693b19173cc22446c9e4

See more details on using hashes here.

Release history Release notifications | RSS feed

32.0.1

2 files

31.1.0

2 files

This release

31.0.0 This release

2 files

30.12.1

2 files

30.12.0

2 files

30.11.0

2 files

30.10.1

2 files

30.10.0

2 files

30.9.2

2 files

30.9.1

2 files

30.9.0

2 files

30.8.0

2 files

30.7.0

2 files

30.6.0

2 files

30.5.1

2 files

30.5.0

2 files

30.4.0

2 files

30.3.1

2 files

30.3.0

2 files

30.2.0

2 files

30.1.0

2 files

30.0.0

2 files

21.4.16.6

1 file

21.4.16

2 files

21.4.9

2 files

21.4.8

2 files

0.0.1

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page