Source code for verschemes.xorg

# -*- coding: utf-8 -*-
"""verschemes.xorg module

The X.org verschemes module implements the standard
`X.org <http://www.x.org/>`_ `version number scheme
<http://www.x.org/wiki/Development/Documentation/VersionNumberScheme/>`_.

An added rule is to extend the patch number's pre-full-release value (99) to
the minor number as well when preparing for a [major].0 full release.

"""

# Support Python 2 & 3.
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)
from verschemes.future import *

from verschemes import SegmentDefinition, Version


__all__ = []

__all__.extend(['SEGMENTS', 'MAJOR', 'MINOR', 'PATCH', 'SNAPSHOT'])
SEGMENTS = (
    MAJOR,
    MINOR,
    PATCH,
    SNAPSHOT,
) = tuple(range(4))

__all__.append('PRE_FULL_RELEASE')
PRE_FULL_RELEASE = 99

__all__.append('BRANCH_START_SNAPSHOT')
BRANCH_START_SNAPSHOT = 900


__all__.append('XorgVersion')
[docs]class XorgVersion(Version): SEGMENT_DEFINITIONS = ( SegmentDefinition( name='major', ), SegmentDefinition( name='minor', default=0, ), SegmentDefinition( name='patch', default=0, ), SegmentDefinition( name='snapshot', optional=True, default=0, ), )
[docs] def validate(self): """Override for version scheme validations.""" if self.is_pre_full_release: if self.is_release: raise ValueError( "Pre-full-release versions (patch = {}) must have a " "snapshot > 0." .format(PRE_FULL_RELEASE)) elif self.is_development: raise ValueError( "Development versions (0 < snapshot < {}) are only valid for " "development branches (patch = {})." .format(BRANCH_START_SNAPSHOT, PRE_FULL_RELEASE))
@property
[docs] def is_release(self): """Whether the version identifies a release.""" return (self[SNAPSHOT] or 0) == 0
@property
[docs] def is_full_release(self): """Whether the version identifies a full release.""" return self.is_release and self[PATCH] == 0
@property
[docs] def is_pre_full_release(self): """Whether the version is between feature freeze and a full release.""" return self[PATCH] == PRE_FULL_RELEASE
@property
[docs] def is_bugfix_release(self): """Whether the version identifies a bug-fix release.""" return self.is_release and not self.is_full_release
@property
[docs] def is_development(self): """Whether the version is a non-release prior to feature freeze.""" return 0 < self[SNAPSHOT] < BRANCH_START_SNAPSHOT
@property
[docs] def is_branch_start(self): """Whether the version is the start of a release branch.""" return self[SNAPSHOT] == BRANCH_START_SNAPSHOT
@property
[docs] def is_release_candidate(self): """Whether the version identifies a release candidate.""" return self[SNAPSHOT] > BRANCH_START_SNAPSHOT
@property
[docs] def release_candidate(self): """The release candidate number if it is a release candidate.""" return ((self[SNAPSHOT] - BRANCH_START_SNAPSHOT) if self.is_release_candidate else None)
@property
[docs] def stable_branch_suffix(self): """The suffix of the stable branch name if not in development.""" if self.is_development: return major, minor = self[MAJOR], self[MINOR] if self.is_pre_full_release: if minor == PRE_FULL_RELEASE: minor = 0 major += 1 else: minor += 1 return '-{}.{}-branch'.format(major, minor)