(cls, version_string, partial=False)
return cls(version, partial=partial)
Coerce an arbitrary version string into a semver-compatible one.

        The rule is:
        - If not enough components, fill minor/patch with zeroes; unless
          partial=True
        - If more than 3 dot-separated components, extra components are "build"
          data. If some "build" data already appeared, append it to the
          extra components

        Examples:
            >>> Version.coerce('0.1')
            Version(0, 1, 0)
            >>> Version.coerce('0.1.2.3')
            Version(0, 1, 2, (), ('3',))
            >>> Version.coerce('0.1.2.3+4')
            Version(0, 1, 2, (), ('3', '4'))
            >>> Version.coerce('0.1+2-3+4_5')
            Version(0, 1, 0, (), ('2-3', '4-5'))
Coerce an arbitrary version string into a semver-compatible one.
Coerce an arbitrary version string into a semver - compatible one .
def coerce(cls, version_string, partial=False):
        """Coerce an arbitrary version string into a semver-compatible one.

        The rule is:
        - If not enough components, fill minor/patch with zeroes; unless
          partial=True
        - If more than 3 dot-separated components, extra components are "build"
          data. If some "build" data already appeared, append it to the
          extra components

        Examples:
            >>> Version.coerce('0.1')
            Version(0, 1, 0)
            >>> Version.coerce('0.1.2.3')
            Version(0, 1, 2, (), ('3',))
            >>> Version.coerce('0.1.2.3+4')
            Version(0, 1, 2, (), ('3', '4'))
            >>> Version.coerce('0.1+2-3+4_5')
            Version(0, 1, 0, (), ('2-3', '4-5'))
        """
        base_re = re.compile(r'^\d+(?:\.\d+(?:\.\d+)?)?')

        match = base_re.match(version_string)
        if not match:
            raise ValueError(
                "Version string lacks a numerical component: %r"
                % version_string
            )

        version = version_string[:match.end()]
        if not partial:
            # We need a not-partial version.
            while version.count('.') < 2:
                version += '.0'

        # Strip leading zeros in components
        # Version is of the form nn, nn.pp or nn.pp.qq
        version = '.'.join(
            # If the part was '0', we end up with an empty string.
            part.lstrip('0') or '0'
            for part in version.split('.')
        )

        if match.end() == len(version_string):
            return Version(version, partial=partial)

        rest = version_string[match.end():]

        # Cleanup the 'rest'
        rest = re.sub(r'[^a-zA-Z0-9+.-]', '-', rest)

        if rest[0] == '+':
            # A 'build' component
            prerelease = ''
            build = rest[1:]
        elif rest[0] == '.':
            # An extra version component, probably 'build'
            prerelease = ''
            build = rest[1:]
        elif rest[0] == '-':
            rest = rest[1:]
            if '+' in rest:
                prerelease, build = rest.split('+', 1)
            else:
                prerelease, build = rest, ''
        elif '+' in rest:
            prerelease, build = rest.split('+', 1)
        else:
            prerelease, build = rest, ''

        build = build.replace('+', '.')

        if prerelease:
            version = '%s-%s' % (version, prerelease)
        if build:
            version = '%s+%s' % (version, build)

        return cls(version, partial=partial)
def coerce ( cls , version_string , partial = False ) : base_re = re . compile ( r'^\d+(?:\.\d+(?:\.\d+)?)?' ) match = base_re . match ( version_string ) if not match : raise ValueError ( "Version string lacks a numerical component: %r" % version_string ) version = version_string [ : match . end ( ) ] if not partial : # We need a not-partial version. while version . count ( '.' ) < 2 : version += '.0' # Strip leading zeros in components # Version is of the form nn, nn.pp or nn.pp.qq version = '.' . join ( # If the part was '0', we end up with an empty string. part . lstrip ( '0' ) or '0' for part in version . split ( '.' ) ) if match . end ( ) == len ( version_string ) : return Version ( version , partial = partial ) rest = version_string [ match . end ( ) : ] # Cleanup the 'rest' rest = re . sub ( r'[^a-zA-Z0-9+.-]' , '-' , rest ) if rest [ 0 ] == '+' : # A 'build' component prerelease = '' build = rest [ 1 : ] elif rest [ 0 ] == '.' : # An extra version component, probably 'build' prerelease = '' build = rest [ 1 : ] elif rest [ 0 ] == '-' : rest = rest [ 1 : ] if '+' in rest : prerelease , build = rest . split ( '+' , 1 ) else : prerelease , build = rest , '' elif '+' in rest : prerelease , build = rest . split ( '+' , 1 ) else : prerelease , build = rest , '' build = build . replace ( '+' , '.' ) if prerelease : version = '%s-%s' % ( version , prerelease ) if build : version = '%s+%s' % ( version , build ) return cls ( version , partial = partial )