ó
}k^c           @   sö  d  d l  Z  d  d l Z d  d l m Z d  d l m Z d  d l m Z m Z 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
 re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 „  Z# d „  Z$ d d „ Z% d S(    iÿÿÿÿN(   t   SafeConfigParser(   t   environ(   t   existst   dirnamet   join(   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	  d „  } t  } d } } t ƒ  } xä |  j d ƒ D]Ó } | j ƒ  } | d k rV q2 n | d k rn t } q2 n  t j d | ƒ } | rŸ d | j d ƒ } q2 n  t j d | ƒ } | rÐ d | j d ƒ } q2 n  t j d	 | ƒ } | r2 | j	 d | j d
 ƒ ƒ q2 q2 Wt
 | ƒ d k r=| j ƒ  } t | ƒ t | ƒ f S| r]| r]t | ƒ d
 } n  | rÛt | d | rx| n d | r‡| n d f ƒ ƒ }	 |	 s°t d |  ƒ ‚ n  t |	 k rÆt t f S|	 d
 |	 d
 f Sn  | rít | ƒ n d | rt | ƒ n d f S(   s×  Parse XS-Python-Version.

    >>> parse_pycentral_vrange('current') == (DEFAULT, DEFAULT)
    True
    >>> parse_pycentral_vrange('all')
    (None, None)
    >>> parse_pycentral_vrange('all, >= 2.4')
    ((2, 4), None)
    >>> parse_pycentral_vrange('all, << 3.0')
    (None, (3, 0))
    >>> parse_pycentral_vrange('2.6')
    ((2, 6), (2, 6))
    >>> parse_pycentral_vrange('2.5, 2.6')
    ((2, 5), None)
    >>> parse_pycentral_vrange('>= 2.6.3')
    ((2, 6), None)
    c         S   s   t  t |  ƒ ƒ S(   N(   R"   R   (   t   x(    (    s&   /usr/share/python/debpython/version.pyt   <lambda>£   R
   R   t   allt   currents   >=\s*([\d\.]+)s   %.3si   s   <<\s*([\d\.]+)s	   ^[\d\.]+$i    s   %s-%sR
   s9   version range doesn't match installed Python versions: %sN(   R   R   R   R   R   t   Truet   reR%   t   groupt   addt   lent   popt   getvert   sortedR&   R   (
   R)   t   getR-   R   R   t	   hardcodedt   itemR%   t   verR!   (    (    s&   /usr/share/python/debpython/version.pyt   parse_pycentral_vrange‘   sJ    	
	!
c         C   sõ   |  d |  d k o d k n r( d S|  d |  d k rW d j d „  |  d Dƒ ƒ S|  d d k r† d d j d „  |  d Dƒ ƒ S|  d d k rµ d j d „  |  d Dƒ ƒ d Sd d j d	 „  |  d Dƒ ƒ d j d
 „  |  d Dƒ ƒ f Sd S(   sM  Return version range string from given range.

    >>> vrange_str(((2, 4), None))
    '2.4-'
    >>> vrange_str(((2, 4), (2, 6)))
    '2.4-2.6'
    >>> vrange_str(((2, 4), (3, 0)))
    '2.4-3.0'
    >>> vrange_str((None, (2, 7)))
    '-2.7'
    >>> vrange_str(((2, 5), (2, 5)))
    '2.5'
    >>> vrange_str((None, None))
    '-'
    i    i   R#   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    c         s   s   |  ] } t  | ƒ Vq d  S(   N(   R;   (   R   R   (    (    s&   /usr/share/python/debpython/version.pys	   <genexpr>ë   s    s   %s-%sc         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    N(   R   R   (   R   (    (    s&   /usr/share/python/debpython/version.pyt
   vrange_strÔ   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(   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   R   R   R   R   t   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.pyR4     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']
    (	   R5   R   R   R4   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   loggingR/   t   ConfigParserR    t   osR   t   os.pathR   R   R   t   typesR   R   R   t   RANGE_PATTERNt   compileR$   t	   getLoggert   __name__t   logR6   t
   _supportedt   _defaultt   _configt   readt   replaceR   R   t	   Exceptiont	   exceptionR   R"   R   R:   R<   R@   R4   RE   (    (    (    s&   /usr/share/python/debpython/version.pyt   <module>   sH   		#	(	,	C			