ó i­:Oc@s7dZdZddlZd„ZeeƒZd ZdS( sÙ ---------------------------- PEP-386 compliant versioning ---------------------------- :pep:`386` defines a standard format for version strings. This module contains a function for creating strings in that format. iiiÿÿÿÿNc Csþg}xß|D]×}t|dtƒrK|jdjtjt|ƒƒƒq t|dtƒrt|djdƒ}n |d}|d krÃ|jd|djtjt|d ƒƒp¸d fƒq |jd |t|d ƒfƒq Wtd j|ƒdƒS(s Return a :pep:`386` version string from a :pep:`386` style version tuple :arg version_info: Nested set of tuples that describes the version. See below for an example. :returns: a version string This function implements just enough of :pep:`386` to satisfy our needs. :pep:`386` defines a standard format for version strings and refers to a function that will be merged into the |stdlib|_ that transforms a tuple of version information into a standard version string. This function is an implementation of that function. Once that function becomes available in the |stdlib|_ we will start using it and deprecate this function. :attr:`version_info` takes the form that :pep:`386`'s :func:`NormalizedVersion.from_parts` uses:: ((Major, Minor, [Micros]), [(Alpha/Beta/rc marker, version)], [(post/dev marker, version)]) Ex: ((1, 0, 0), ('a', 2), ('dev', 3456)) It generates a :pep:`386` compliant version string:: N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN] Ex: 1.0.0a2.dev3456 .. warning:: This function does next to no error checking. It's up to the person defining the version tuple to make sure that the values make sense. If the :pep:`386` compliant version parser doesn't get released soon we'll look at making this function check that the version tuple makes sense before transforming it into a string. It's recommended that you use this function to keep a :data:`__version_info__` tuple and :data:`__version__` string in your modules. Why do we need both a tuple and a string? The string is often useful for putting into human readable locations like release announcements, version strings in tarballs, etc. Meanwhile the tuple is very easy for a computer to compare. For example, kitchen sets up its version information like this:: from kitchen.versioning import version_tuple_to_string __version_info__ = ((0, 2, 1),) __version__ = version_tuple_to_string(__version_info__) Other programs that depend on a kitchen version between 0.2.1 and 0.3.0 can find whether the present version is okay with code like this:: from kitchen import __version_info__, __version__ if __version_info__ < ((0, 2, 1),) or __version_info__ >= ((0, 3, 0),): print 'kitchen is present but not at the right version.' print 'We need at least version 0.2.1 and less than 0.3.0' print 'Currently found: kitchen-%s' % __version__ it.tasciitatbtctrcs%s%sit0s.%s%st(RRRsrc( t isinstancetinttappendtjoint itertoolstimaptstrtunicodetencode(t version_infotver_componentstvaluestmodifier((s?/usr/lib/python2.7/site-packages/kitchen/versioning/__init__.pytversion_tuple_to_string s7 %   - R(iii((iii(sversion_tuple_to_string(t__doc__t__version_info__R Rt __version__t__all__(((s?/usr/lib/python2.7/site-packages/kitchen/versioning/__init__.pyts   I