ó
²<ac           @   sØ  d  d l  Z  d  d l Z d  d l m Z d  d l m Z d  d l m Z d  d l m	 Z	 d g Z
 d Z d Z e j e ƒ Z e  j e ƒ Z e j d	 ƒ Z e j d
 ƒ Z e s· e re ƒ  Z e j d ƒ e sì e j d d ƒ d Z n  e se j d d ƒ j d d ƒ Z qn  y# e d „  e j d ƒ Dƒ ƒ Z Wn e k
 rYe j d ƒ n Xy# e d „  e j d ƒ Dƒ ƒ Z
 Wn e k
 re j d ƒ n Xd d d „ Z d „  Z d „  Z d „  Z  d d „ Z! d S(   iÿÿÿÿN(   t   SafeConfigParser(   t   environ(   t   exists(   t   GeneratorTypei   i   s   (-)?(\d\.\d+)(?:(-)(\d\.\d+)?)?t   DEBPYTHON_SUPPORTEDt   DEBPYTHON_DEFAULTs!   /usr/share/python/debian_defaultst   DEFAULTs   default-versioni   s   supported-versionst   pythont    c         c   s   |  ] } t  | ƒ Vq d  S(   N(   t   int(   t   .0t   i(    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>3   s    t   .s   cannot read debian_defaultsc         c   s4   |  ]* } t  d  „  | j ƒ  j d ƒ Dƒ ƒ Vq d S(   c         s   s   |  ] } t  | ƒ Vq d  S(   N(   R	   (   R
   t   j(    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>7   s    R   N(   t   tuplet   stript   split(   R
   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>7   s   t   ,c            s&  t  |  t ƒ r t |  ƒ }  n  |  s= t |  ƒ d d g k rL t t ƒ } n’ |  d d k rb d n |  d ‰ |  d d k r‚ d	 n |  d ‰  ˆ ˆ  k r¿ t ˆ t k r° ˆ f n t ƒ  ƒ } n t ‡  ‡ f d †  t Dƒ ƒ } | rý t d „  | Dƒ ƒ } n% | t k r"t d „  | Dƒ ƒ } n  | S(
   s>  Return a set of requested and supported Python versions.

    :param available: if set to `True`, return installed versions only,
        if set to `False`, return requested versions that are not installed.
        By default returns all requested versions.
    :type available: bool

    >>> sorted(get_requested_versions([(2, 5), (3, 0)]))
    [(2, 7)]
    >>> sorted(get_requested_versions('')) == sorted(SUPPORTED)
    True
    >>> sorted(get_requested_versions([None, None])) == sorted(SUPPORTED)
    True
    >>> get_requested_versions([(5, 0), None])
    set([])
    i    i   ic   c         3   s1   |  ]' } ˆ | k o  ˆ  k  n r | Vq d  S(   N(    (   R
   t   v(   t   maxvt   minv(    s&   /usr/share/python/debpython/version.pys	   <genexpr>Y   s    c         s   s%   |  ] } t  d  | ƒ r | Vq d S(   s   /usr/bin/python%d.%dN(   R   (   R
   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>\   s    c         s   s%   |  ] } t  d  | ƒ s | Vq d S(   s   /usr/bin/python%d.%dN(   R   (   R
   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>_   s    N(   i    i    (   ic   ic   (	   t
   isinstancet
   basestringt   parse_vranget   listt   Nonet   sett	   SUPPORTEDR   t   False(   t   vranget	   availablet   versions(    (   R   R   s&   /usr/share/python/debpython/version.pyt   get_requested_versions=   s      'c         C   sL  |  d k r d St j |  ƒ } | s8 t d |  ƒ ‚ n  | j ƒ  } t | ƒ j d ƒ d k rŒ t d „  | d j d ƒ Dƒ ƒ } | | f Sd } } | d r­ | d } n | d } | d } | ræ t d	 „  | j d ƒ Dƒ ƒ n d } | rt d
 „  | j d ƒ Dƒ ƒ n d } | rB| rB| | k rBt d |  ƒ ‚ n  | | f S(   sƒ  Return minimum and maximum Python version from given range.

    >>> parse_vrange('2.4-')
    ((2, 4), None)
    >>> parse_vrange('2.4-2.6')
    ((2, 4), (2, 6))
    >>> parse_vrange('2.4-3.0')
    ((2, 4), (3, 0))
    >>> parse_vrange('-2.7')
    (None, (2, 7))
    >>> parse_vrange('2.5')
    ((2, 5), (2, 5))
    >>> parse_vrange('') == parse_vrange('-') == (None, None)
    True
    R   t   -s   version range is invalid: %si   c         s   s   |  ] } t  | ƒ Vq d  S(   N(   R	   (   R
   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>~   s    i   R   i    c         s   s   |  ] } t  | ƒ Vq d  S(   N(   R	   (   R
   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>ˆ   s    c         s   s   |  ] } t  | ƒ Vq d  S(   N(   R	   (   R
   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>‰   s    (   R   R!   N(   NN(	   R   t   RANGE_REt   matcht
   ValueErrort   groupsR   t   countR   R   (   t   valueR#   R%   R   R   (    (    s&   /usr/share/python/debpython/version.pyR   e   s&    #




++c         C   s­   t  |  t ƒ r |  St  |  t t f ƒ rS t  |  d t ƒ rS d j d „  |  Dƒ ƒ Sg  } xM |  D]E } t  | t ƒ r… | j | ƒ q` | j d j d „  | Dƒ ƒ ƒ q` W| S(   s¨   
    >>> vrepr(([2, 7], [3, 2]))
    ['2.7', '3.2']
    >>> vrepr(('2.6', '3.1'))
    ['2.6', '3.1']
    >>> vrepr('2.7')
    '2.7'
    >>> vrepr((2, 7))
    '2.7'
    i    R   c         s   s   |  ] } t  | ƒ Vq d  S(   N(   t   str(   R
   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>    s    c         s   s   |  ] } t  | ƒ Vq d  S(   N(   R(   (   R
   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>§   s    (   R   R   R   R   R	   t   joint   append(   R'   t   resultt   version(    (    s&   /usr/share/python/debpython/version.pyt   vrepr‘   s    $c         C   s.   |  s
 d St  d „  |  j d d ƒ Dƒ ƒ d  S(   s•   Return pair of integers that represent version.

    >>> getver('2.5')
    (2, 5)
    >>> getver('2.6.4')
    (2, 6)
    >>> getver(None)
    ''
    R   c         s   s   |  ] } t  | ƒ Vq d  S(   N(   R	   (   R
   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>·   s    R   i   (   R   R   (   R'   (    (    s&   /usr/share/python/debpython/version.pyt   getver«   s    
c         C   s—   g  } g  } x[ t  |  ƒ D]M } t | t ƒ r= t | ƒ } n  | t k  rY | j | ƒ q | j | ƒ q W| j t | ƒ ƒ | r“ | r“ t | ƒ S| S(   s£  Return sorted list of versions starting with default Python
    version (if available) then list of suppored versions greater than default
    one followed by reversed list of older versions.

    List of versions sorted this way can be used in Depends field.

    :param vrepr: return string represenatations of versions, by default the
        same format is used as in :param:`versions`

    >>> debsorted([(2, 6), (3, 1), (2, 5), (2, 4), (2, 7)])[0] == DEFAULT
    True
    >>> debsorted(('2.4', '3.2', '2.6', '2.7'))[-1]
    (2, 4)
    >>> debsorted(set([(2, 1), (2, 2)]))
    [(2, 2), (2, 1)]
    >>> debsorted([(2, 1), (2, 2)], return_str=True)
    ['2.2', '2.1']
    (	   t   sortedR   R   R.   R   R*   t   extendt   reversedR-   (   R   t
   return_strR+   t   old_versionsR,   (    (    s&   /usr/share/python/debpython/version.pyt	   debsortedº   s    
(   i   i   (   i   i   ("   t   loggingt   ret   ConfigParserR    t   osR   t   os.pathR   t   typesR   R   R   t   RANGE_PATTERNt   compileR"   t	   getLoggert   __name__t   logt   gett
   _supportedt   _defaultt   _configt   readt   replaceR   R   t	   Exceptiont	   exceptionR   R    R   R-   R.   R4   (    (    (    s&   /usr/share/python/debpython/version.pyt   <module>   sD   		#	(	,		