ó
È”Mc           @   s   d  d l  Z d  d l Td  d l Z d  d l Z d  d l Z d  d l Z e ƒ  Z d e f d „  ƒ  YZ	 e j
 d ƒ j Z d „  Z d „  Z d S(   iÿÿÿÿN(   t   *t	   SysConfigc           B   sø   e  Z d  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 e e d	 „ Z e e e d
 „ Z e e e e d „ Z e e e d „ Z d e e e d „ Z e e d „ Z e e e d „ Z e e e d „ Z e e d „ Z RS(   s„  System configuration class.

    It has three different kinds of opition maps, regarding the
    persistence and priority that maps are queried.

    hard - Options are persistent.
    soft - Options are not persistent, and have a higher priority
           than persistent options.
    weak - Options are not persistent, and have a lower priority
           than persistent options.
    c         C   s:   i  |  _  i  |  _ i  |  _ t |  _ t |  _ |  |  _ d  S(   N(   t   _hardmapt   _softmapt   _weakmapt   Falset	   _readonlyt	   _modifiedt   _config(   t   selft   root(    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   __init__,   s    					c         C   s   |  j  S(   N(   R   (   R	   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   getReadOnly4   s    c         C   s   | |  _  d  S(   N(   R   (   R	   t   flag(    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   setReadOnly7   s    c         C   s   |  j  S(   N(   R   (   R	   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   getModified:   s    c         C   s   t  |  _ d  S(   N(   R   R   (   R	   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   resetModified=   s    c         C   s   |  j  r t t d ƒ ‚ n  d  S(   Ns"   Configuration is in readonly mode.(   R   t   Errort   _(   R	   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   assertWritable@   s    	c         C   sl  t  j j | ƒ } t  j j | ƒ s: t t d ƒ | ‚ n  t  j j | ƒ d k rV d  St | ƒ } |  j j	 ƒ  y |  j j
 t j | ƒ ƒ WnÏ | d } t  j j | ƒ rGt  j j | ƒ d k rGt j t d ƒ | ƒ t j t d ƒ | ƒ | j ƒ  t | ƒ } y |  j j
 t j | ƒ ƒ WqZt t d ƒ | ‚ qZXq^t t d ƒ | ‚ n X| j ƒ  d  S(   Ns   File not found: %si    s   .olds   Broken configuration file at %ss   Trying backup at %s(   t   ost   patht
   expandusert   isfileR   R   t   getsizet   openR   t   cleart   updatet   picklet   loadt   ifacet   warningt   close(   R	   t   filepatht   filet   filepathold(    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyR   D   s2    

c         C   s¢   t  j j | ƒ } t  j j | ƒ r; t  j | | d ƒ n  t  j j | ƒ } t  j j | ƒ so t  j | ƒ n  t | d ƒ } t	 j
 |  j | d ƒ | j ƒ  d  S(   Ns   .oldt   wi   (   R   R   R   R   t   renamet   dirnamet   isdirt   makedirsR   R   t   dumpR   R    (   R	   R!   R&   R"   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   save`   s    c         C   s³  t  | ƒ } t } | } x| r%| } | j d ƒ } t | ƒ t k r] | j | | ƒ } nµ t | ƒ t t  f k rÐ t | ƒ t k r² y | | } WqÍ t k
 r® | } qÍ Xq| | k rÇ | } q| } nB | rê | t	 | ƒ  } n  t
 d t | ƒ t | ƒ t | ƒ f ‚ | | k r Pq q W| | k	 rR| | k	 r¯| } | | <q¯n]| | k rg| } nHxEt r®t	 | ƒ d k rªt | d ƒ t k r¡g  }	 q°i  }	 n | }	 t | ƒ t k rÓ|	 } | | <n¹ t | ƒ t  k rmt | ƒ t k rmt	 | ƒ }
 |
 | k r%| j d  ƒ |
 } n7 | d k  r\t | ƒ |
 k r\| j d d  ƒ d } n  |	 } | | <n t
 d t | ƒ t | ƒ f ‚ | s–Pn  | } | j d ƒ } qjW| S(   Ni    s   Can't traverse %s (%s): %ss   Can't traverse %s with %s(   t   listt   NOTHINGt   popt   typet   dictt   gett   tuplet   intt
   IndexErrort   lenR   t   pathTupleToStringt   strt   Truet   appendt   Nonet   abst   insert(   R	   t   objR   t   defaultt   setvaluet   queuet   markert   newobjt   elemt   newvaluet   lenobj(    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt	   _traversek   sh    			"				$		c         C   sô   t  | ƒ t k r! t | ƒ } n  t } | rH |  j |  j | | ƒ } n¨ | ri |  j |  j | | ƒ } n‡ | rŠ |  j |  j | | ƒ } nf |  j |  j | | ƒ } | | k rð |  j |  j | | ƒ } | | k rð |  j |  j | | ƒ } qð n  | S(   N(   R.   R6   t   pathStringToTupleR,   RE   R   R   R   (   R	   R   t   softt   hardt   weakR@   t   value(    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt	   _getvalue¨   s    c         C   sw   |  j  | | | | ƒ } t } | | k r. t S| | k r> t St | ƒ t t f k r` | | k St d t | ƒ ‚ d  S(   Ns   Can't check %s for containment(   RK   R,   R   R7   R.   R/   R+   R   (   R	   R   RJ   RG   RH   RI   R<   R@   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   hasº   s    
c         C   s}   |  j  | | | | ƒ } | t k r( g  St | ƒ t k rD | j ƒ  St | ƒ t k rf t t | ƒ ƒ St d t | ƒ ‚ d  S(   Ns   Can't return keys for %s(	   RK   R,   R.   R/   t   keysR+   t   rangeR4   R   (   R	   R   RG   RH   RI   RJ   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyRM   Æ   s    
c         C   sQ   |  j  | | | | ƒ } | t k r( | St | ƒ t t f k rM t j | ƒ S| S(   N(   RK   R,   R.   R/   R+   t   copyt   deepcopy(   R	   R   R=   RG   RH   RI   RJ   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyR0   Ñ   s    c         C   s‡   | s t  ‚ t | ƒ t k r- t | ƒ } n  | r? |  j } n. | rQ |  j } n |  j ƒ  t |  _ |  j	 } |  j
 | | d | ƒd  S(   NR>   (   t   AssertionErrorR.   R6   RF   R   R   R   R7   R   R   RE   (   R	   R   RJ   RG   RI   t   map(    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   setÙ   s    
		c         C   sÔ   | s t  ‚ t | ƒ t k r- t | ƒ } n  | r? |  j } n. | rQ |  j } n |  j ƒ  t |  _ |  j	 } | rª |  j
 | | ƒ } t | ƒ t k rª | | k rª d  Sn  | t j f } |  j
 | | d | ƒd  S(   NR>   (   RQ   R.   R6   RF   R   R   R   R7   R   R   RE   R+   t   syst   maxint(   R	   R   RJ   t   uniqueRG   RI   RR   t   current(    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   addç   s     
		c         C   sê  | s t  ‚ t | ƒ t k r- t | ƒ } n  | r? |  j } n. | rQ |  j } n |  j ƒ  t |  _ |  j	 } t
 } xp| rå| | k r« |  j | | d  ƒ } | d } n |  j | | ƒ } | } t }	 | | k rØ ná t | ƒ t k r	| | k r¹| | =t }	 q¹n° t | ƒ t k rŸ| | k rat | ƒ t k ray | | =t }	 Wqœt k
 r]qœXq¹| | k r¹g  | D] }
 |
 | k rt|
 ^ qt| (t }	 q¹n t d | t | ƒ f ‚ | sá| | k	 rÔ| } qâ| d  } qv Pqv W|	 S(   Niÿÿÿÿs   Can't remove %s from %s(   RQ   R.   R6   RF   R   R   R   R7   R   R   R,   RE   R   R/   R+   R2   R3   R   (   R	   R   RJ   RG   RI   RR   R@   R<   RB   t   resultt   x(    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   removeú   sT    
			
&	c         C   sµ   t  | ƒ t k r! t | ƒ } n  t  | ƒ t k rB t | ƒ } n  t } t } |  j | | | pc | | ƒ } | | k	 r± |  j | d | d | ƒ|  j | | | | ƒ t } n  | S(   NRG   RI   (	   R.   R6   RF   R   R,   RK   R[   RS   R7   (   R	   t   oldpatht   newpathRG   RI   RY   R@   RJ   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   move+  s    	(    N(   t   __name__t
   __module__t   __doc__R   R   R   R   R   R   R   R*   R,   RE   R   RK   RL   RM   R9   R0   RS   RX   R[   R^   (    (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyR      s$   							=1s   (\[-?\d+\])|(?<!\\)\.c         C   sÐ   d |  k r d |  k r |  f Sg  } t  |  ƒ } x’ | D]Š } | r8 | d d k r¦ | d d k r¦ y | j t | d d !ƒ ƒ Wq¿ t k
 r¢ t d | ‚ q¿ XqÂ | j | j d d ƒ ƒ q8 q8 Wt | ƒ S(	   Nt   .t   [i    iÿÿÿÿt   ]i   s   Invalid path index: %ss   \.(   t	   SPLITPATHR8   R2   t
   ValueErrorR   t   replaceR1   (   R   RY   t   tokenst   token(    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyRF   <  s      c         C   sl   g  } xV |  D]N } t  | ƒ t k r< | d c d | 7<q | j t | ƒ j d d ƒ ƒ q Wd j | ƒ S(   Niÿÿÿÿs   [%d]Rb   s   \.(   R.   R2   R8   R6   Rg   t   join(   R   RY   RB   (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyR5   L  s    #(   t   cPickleR   t   smartRT   R   RO   t   ret   objectR,   R   t   compilet   splitRe   RF   R5   (    (    (    s3   /usr/lib/python2.7/dist-packages/smart/sysconfig.pyt   <module>   s   
	ÿ 	