• Stars
    star
    266
  • Rank 153,272 (Top 4 %)
  • Language
    Python
  • License
    BSD 2-Clause "Sim...
  • Created over 12 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Semantic version comparison for Python (see http://semver.org/)

Introduction

This small python library provides a few tools to handle SemVer in Python. It follows strictly the 2.0.0 version of the SemVer scheme.

Latest Version Supported Python versions Wheel status License

Links

Getting started

Install the package from PyPI, using pip:

pip install semantic-version

Or from GitHub:

$ git clone git://github.com/rbarrois/python-semanticversion.git

Import it in your code:

import semantic_version

This module provides classes to handle semantic versions:

  • Version represents a version number (0.1.1-alpha+build.2012-05-15)
  • BaseSpec-derived classes represent requirement specifications (>=0.1.1,<0.3.0):
    • SimpleSpec describes a natural description syntax
    • NpmSpec is used for NPM-style range descriptions.

Versions

Defining a Version is quite simple:

>>> import semantic_version
>>> v = semantic_version.Version('0.1.1')
>>> v.major
0
>>> v.minor
1
>>> v.patch
1
>>> v.prerelease
[]
>>> v.build
[]
>>> list(v)
[0, 1, 1, [], []]

If the provided version string is invalid, a ValueError will be raised:

>>> semantic_version.Version('0.1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/rbarrois/dev/semantic_version/src/semantic_version/base.py", line 64, in __init__
    major, minor, patch, prerelease, build = self.parse(version_string, partial)
  File "/Users/rbarrois/dev/semantic_version/src/semantic_version/base.py", line 86, in parse
    raise ValueError('Invalid version string: %r' % version_string)
ValueError: Invalid version string: '0.1'

One may also create a Version with named components:

>>> semantic_version.Version(major=0, minor=1, patch=2)
Version('0.1.2')

In that case, major, minor and patch are mandatory, and must be integers. prerelease and build, if provided, must be tuples of strings:

>>> semantic_version.Version(major=0, minor=1, patch=2, prerelease=('alpha', '2'))
Version('0.1.2-alpha.2')

Some user-supplied input might not match the semantic version scheme. For such cases, the Version.coerce method will try to convert any version-like string into a valid semver version:

>>> Version.coerce('0')
Version('0.0.0')
>>> Version.coerce('0.1.2.3.4')
Version('0.1.2+3.4')
>>> Version.coerce('0.1.2a3')
Version('0.1.2-a3')

Working with versions

Obviously, versions can be compared:

>>> semantic_version.Version('0.1.1') < semantic_version.Version('0.1.2')
True
>>> semantic_version.Version('0.1.1') > semantic_version.Version('0.1.1-alpha')
True
>>> semantic_version.Version('0.1.1') <= semantic_version.Version('0.1.1-alpha')
False

You can also get a new version that represents a bump in one of the version levels:

>>> v = semantic_version.Version('0.1.1+build')
>>> new_v = v.next_major()
>>> str(new_v)
'1.0.0'
>>> v = semantic_version.Version('1.1.1+build')
>>> new_v = v.next_minor()
>>> str(new_v)
'1.2.0'
>>> v = semantic_version.Version('1.1.1+build')
>>> new_v = v.next_patch()
>>> str(new_v)
'1.1.2'

Requirement specification

python-semanticversion provides a couple of ways to describe a range of accepted versions:

  • The SimpleSpec class provides a simple, easily understood scheme -- somewhat inspired from PyPI range notations;

  • The NpmSpec class supports the whole NPM range specification scheme:

    >>> Version('0.1.2') in NpmSpec('0.1.0-alpha.2 .. 0.2.4')
    True
    >>> Version('0.1.2') in NpmSpec('>=0.1.1 <0.1.3 || 2.x')
    True
    >>> Version('2.3.4') in NpmSpec('>=0.1.1 <0.1.3 || 2.x')
    True

The SimpleSpec scheme

Basic usage is simply a comparator and a base version:

>>> s = SimpleSpec('>=0.1.1')  # At least 0.1.1
>>> s.match(Version('0.1.1'))
True
>>> s.match(Version('0.1.1-alpha1'))  # pre-release doesn't satisfy version spec
False
>>> s.match(Version('0.1.0'))
False

Combining specifications can be expressed as follows:

>>> SimpleSpec('>=0.1.1,<0.3.0')

Simpler test syntax is also available using the in keyword:

>>> s = SimpleSpec('==0.1.1')
>>> Version('0.1.1+git7ccc72') in s  # build variants are equivalent to full versions
True
>>> Version('0.1.1-alpha1') in s     # pre-release variants don't match the full version.
False
>>> Version('0.1.2') in s
False

Refer to the full documentation at https://python-semanticversion.readthedocs.io/en/latest/ for more details on the SimpleSpec scheme.

Using a specification

The SimpleSpec.filter method filters an iterable of Version:

>>> s = SimpleSpec('>=0.1.0,<0.4.0')
>>> versions = (Version('0.%d.0' % i) for i in range(6))
>>> for v in s.filter(versions):
...     print v
0.1.0
0.2.0
0.3.0

It is also possible to select the 'best' version from such iterables:

>>> s = SimpleSpec('>=0.1.0,<0.4.0')
>>> versions = (Version('0.%d.0' % i) for i in range(6))
>>> s.select(versions)
Version('0.3.0')

Contributing

In order to contribute to the source code:

When submitting patches or pull requests, you should respect the following rules:

  • Coding conventions are based on PEP 8
  • The whole test suite must pass after adding the changes
  • The test coverage for a new feature must be 100%
  • New features and methods should be documented in the reference section and included in the changelog
  • Include your name in the contributors section

Note

All files should contain the following header:

# -*- encoding: utf-8 -*-
# Copyright (c) The python-semanticversion project

More Repositories

1

xworkflows

Python "state machine" module
Python
188
star
2

aionotify

Simple, asyncio-based inotify library for Python
Python
116
star
3

django_xworkflows

Library to plug xworkflows into django models.
Python
106
star
4

throttle

UNMAINTAINED - A simple Python throttling lib relying on the token bucket algorithm
Python
38
star
5

mpdlcd

A small tool to display MPD status on a lcdproc server
Python
31
star
6

python-ldap

Git mirror of http://sourceforge.net/p/python-ldap/code/, predecessor of github.com/pyldap/pyldap
Python
28
star
7

inputexec

Simple program to execute commands on keypress on headless Linux
Python
21
star
8

nss-systemcerts

Create a system-wide NSS certificate database (https://wiki.mozilla.org/NSS) based on system-wide certificates (/etc/ssl/certs)
Shell
12
star
9

restricted_pkg

[OBSOLETE] Enforcing use of a private PyPI mirror in your setup.py script
Python
10
star
10

yubico-yubiserve

Standalone Yubico validation server
Python
10
star
11

tdparser

An easy to use parser library for Python, based on the TopDown parsing algorithm.
Python
10
star
12

fslib

Python wrapper around low-level FS-related calls, with support for advanced FS stacking
Python
8
star
13

volatildap

Temporary LDAP server launcher for testing purposes
Python
7
star
14

kconfgen

A generator of (minimal) Linux kernel configuration files.
Python
5
star
15

django-batchform

Generic view to fill a batch of identical forms from the cells of an uploaded file (csv/xlsx/odt).
Python
4
star
16

djadmin_export

Flexible export actions for Django admin
Python
4
star
17

django-shareddb

Faster tests in multi-thread, single control flow setups
Python
4
star
18

pydist

Tools to auto-convert Python modules into debian/gentoo packages
Python
4
star
19

bicti

Simple startup tool for docker containers
Python
2
star
20

python-inspector

Extensions to Python inspect.py module.
Python
2
star
21

confutils

Enhanced configuration file related tools for Python
Python
1
star
22

djpyro

Django/Pyro adapter, intended for remote control (e.g. integration testing)
Python
1
star
23

extypes

Enhancements over Python's standard types
Python
1
star
24

django-registration

Forked from https://bitbucket.org/ubernostrum/django-registration
Python
1
star
25

cliform

Convert a Django Form to an interactive command line prompt
Python
1
star
26

portage-mod_jabber

A XMPP elog module for Gentoo portage, based on http://svn.usrportage.de/portage-mod_jabber/. Fully rewritten.
Python
1
star
27

quern

Versatile image builder, targeting embedded systems, bare-metal servers and containers.
Python
1
star