
    p
f_                     B    d dl mZ d dlZ G d dej                        Zy)    )versionNc            	          e Zd ZdZddZdZdZdZdZdj                  ed	j                   eej                  d
                  Zed        Zed        Zed        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"y) FlexibleVersiona  
    A more flexible implementation of distutils.version.StrictVersion

    The implementation allows to specify:
    - an arbitrary number of version numbers:
        not only '1.2.3' , but also '1.2.3.4.5'
    - the separator between version numbers:
        '1-2-3' is allowed when '-' is specified as separator
    - a flexible pre-release separator:
        '1.2.3.alpha1', '1.2.3-alpha1', and '1.2.3alpha1' are considered equivalent
    - an arbitrary ordering of pre-release tags:
        1.1alpha3 < 1.1beta2 < 1.1rc1 < 1.1
        when ["alpha", "beta", "rc"] is specified as pre-release tag list

    Inspiration from this discussion at StackOverflow:
        http://stackoverflow.com/questions/12255554/sort-versions-in-python
    Nc                 
   t         j                  j                  |        |d}|d}|| _        d| _        |t        |      nd| _        | j                          d | _        d| _         |r| j                  t        |             y )N.  )r   Version__init__sep
prerel_septupleprerel_tags_compile_pattern
prerelease_parsestr)selfvstringr   r   s       O/usr/lib/python3/dist-packages/azurelinuxagent/common/utils/flexible_version.pyr   zFlexibleVersion.__init__+   s{      &;CK1<1H5-bKKG%    r   r   tagtag_numz(?P<{pn}>{sep})?|)r   -)pnr   c                 T    t        | j                        dkD  r| j                  d   S dS )Nr   lenr   r   s    r   majorzFlexibleVersion.majorH   %    "%dll"3a"7t||A>Q>r   c                 T    t        | j                        dkD  r| j                  d   S dS )N   r   r   r    s    r   minorzFlexibleVersion.minorL   r"   r   c                 T    t        | j                        dkD  r| j                  d   S dS )N   r   r   r    s    r   patchzFlexibleVersion.patchP   r"   r   c           
          | j                   j                  |      }|st        dj                  |            d | _        d| _        |j                  | j                        | _        |j                  | j                        }|j                  | j                        }|!||t        |      rt        |      nd f| _        t        t        t        | j                  j!                  |j                  | j"                                          | _        y )NzInvalid version number '{0}'r   )
version_rematch
ValueErrorformatr   r   group_nn_prerel_sepr   _nn_prerel_tag_nn_prerel_numr   intr   mapsep_resplit_nn_version)r   r   mr   r   s        r   r   zFlexibleVersion._parseT   s    OO!!'*;BB7KLL''$"5"56ggd))*''$--.?w2"CLCLdKDOSdkk&7&7@P@P8Q&RSTr   c                     t        | j                        }|dxx   |z  cc<   | j                  || j                  | j                  | j
                        }t        || j                  | j                        S )Nr   r   r   )listr   	_assembler   r   r   r   r   )r   	incrementr   r   s       r   __add__zFlexibleVersion.__add__f   sW    t||$y ..$((DOOT__UwDHH$JZJZ[[r   c                 2   t        | j                        }|d   dk  rt        dj                  |             |dxx   |z  cc<   | j	                  || j
                  | j                  | j                        }t        || j
                  | j                        S )Nr9   r   z:Cannot decrement final numeric component of {0} below zeror:   )
r;   r   ArithmeticErrorr-   r<   r   r   r   r   r   )r   	decrementr   r   s       r   __sub__zFlexibleVersion.__sub__l   s|    t||$2;!!"^ y ..$((DOOT__UwDHH$JZJZ[[r   c                     dj                  | j                  j                  t        |       | j                  | j
                        S )Nz+{cls} ('{vstring}', '{sep}', {prerel_tags}))clsr   r   r   )r-   	__class____name__r   r   r   r    s    r   __repr__zFlexibleVersion.__repr__u   s=    <VNN++D	HH ,,	  .	.r   c                 z    | j                  | j                  | j                  | j                  | j                        S N)r<   r   r   r   r   r    s    r   __str__zFlexibleVersion.__str__}   s'    ~~dllDHHdootWWr   c                 &    | j                  |       S rI   )__lt__r   thats     r   __ge__zFlexibleVersion.__ge__       ;;t$$$r   c                 N    | j                  |       xr | j                  |       S rI   rL   __eq__rM   s     r   __gt__zFlexibleVersion.__gt__   s%    KK%%BD0A,ABr   c                 J    | j                  |      xs | j                  |      S rI   rR   rM   s     r   __le__zFlexibleVersion.__le__   s    D!9t{{4'89r   c                    | j                  |      \  }}||k7  s| j                  |j                  ||k  S | j                  |j                  y| j                  |j                  y| j                  | j                  d      }| j                  |j                  d      }||k(  r| j                  d   |j                  d   k  S ||k  S )NTFr   r$   )_ensure_compatibler   prerel_tags_set)r   rN   this_versionthat_version
this_index
that_indexs         r   rL   zFlexibleVersion.__lt__   s    %)%<%<T%B"l<'oo%$//*A,..??&4??+B??"t'B))$//!*<=
))$//!*<=
#??1%(:::J&&r   c                 &    | j                  |       S rI   )rS   rM   s     r   __ne__zFlexibleVersion.__ne__   rP   r   c                 l    | j                  |      \  }}||k7  ry| j                  |j                  k7  ryyNFT)rX   r   r   rN   rZ   r[   s       r   rS   zFlexibleVersion.__eq__   s8    %)%<%<T%B"l<'??doo-r   c                 `   | j                   |j                   k7  s+t        | j                        t        |j                        kD  ryt        t        | j                              D ]#  }| j                  |   |j                  |   k7  s# y | j                  r| j                  |j                  k(  S yra   )r   r   r   ranger   )r   rN   is      r   matcheszFlexibleVersion.matches   s    88txx3t||#4s4<<7H#Hs4<<() 	A||A$,,q/1	 ##t'7'777r   c                     |j                  t        t        |            }|%|||z  }||d   z  }|d   |t        |d         z  }|S )Nr   r$   )joinr3   r   )r   r   r   r   r   ss         r   r<   zFlexibleVersion._assemble   s\    HHSg&'!%ZAA!}(SA''r   c           
         | j                  | j                        \  }| _        | j                  rdj	                  d | j                  D              }t        t        | j                  t        t        | j                                          | _	        dj                  | j                  || j                  | j                        }nd}dj                  | j                  ||      }t        j                   |      | _        y )Nr   c              3   F   K   | ]  }t        j                  |        y wrI   )reescape).0r   s     r   	<genexpr>z3FlexibleVersion._compile_pattern.<locals>.<genexpr>   s     GsBIIcNGs   !z.(?:{prerel_sep}(?P<{tn}>{tags})(?P<{nn}>\d*))?)r   tagstnnnr	   z&^(?P<{vn}>\d+(?:(?:{sep}\d+)*)?){rel}$)vnr   rel)_compile_separatorr   r4   r   rh   dictziprd   r   rY   r-   _re_prerel_sepr0   r1   r6   rl   compiler*   )r   r   rp   
release_rer*   s        r   r   z FlexibleVersion._compile_pattern   s    22488<T[88Gd6F6FGGD#'D,<,<eCHXHXDY>Z([#\D JQQ#'#6#6!....	 R 0J J>EE F 
 **Z0r   c                     |dt        j                  d      fS t        j                  |      t        j                  t        j                  |            fS )Nr	   )rl   ry   rm   )r   r   s     r   ru   z"FlexibleVersion._compile_separator   s>    ;rzz"~%%yy~rzz"))C.999r   c                    | j                   |j                   k7  s| j                  |j                  k7  rt        d      t        | j                  dd       }t        |j                  dd       }t        |      t        |      k  r)|j                  d       t        |      t        |      k  r)t        |      t        |      k  r)|j                  d       t        |      t        |      k  r)||fS )z
        Ensures the instances have the same structure and, if so, returns length compatible
        version lists (so that x.y.0.0 is equivalent to x.y).
        z5Unable to compare: versions have different structuresNr   )r   r   r,   r;   r   r   appendrb   s       r   rX   z"FlexibleVersion._ensure_compatible   s    
 t///488txx3GTUUDLLO,DLLO,,#l"33\5H5H5Kc,#l"33,#l"33\5H5H5Kc,#l"33\))r   )Nr   )alphabetarc)#rF   
__module____qualname____doc__r   r6   r/   r0   r1   r-   rh   r3   rl   rm   rx   propertyr!   r%   r(   r   r>   rB   rG   rJ   rO   rT   rV   rL   r_   rS   rf   r<   r   ru   rX   r   r   r   r   r      s    $( K!NNN(//HHSJ/0 0 2N ? ? ? ? ? ?$\\.X%C:'&%	
*:
*r   r   )	distutilsr   rl   r
   r   r   r   r   <module>r      s   (  	O*goo O*r   