3
Y                 @   s   d dl Z d dlZd dlmZ ddlmZ ddlmZ G dd deZdZe e j	 d	 d
Z
g Zejej ejej ejddddddddddddddg G dd deZdd Zdd Zdd  Zd!d" Ze
fd#d$ZdS )%    N)Template   )get_dist)_c               @   s   e Zd ZdddZdd ZdS )InvalidUrlException c             C   s   || _ || _d S )N)urlmessage)selfr   msg r   //usr/lib/python3/dist-packages/AptUrl/Parser.py__init__   s    zInvalidUrlException.__init__c             C   s   | j S )N)r	   )r
   r   r   r   __str__!   s    zInvalidUrlException.__str__N)r   )__name__
__module____qualname__r   r   r   r   r   r   r      s   
r         )ZdistroZkernelr   :?/+.~=<>-,$&c               @   s   e Zd ZdZdd ZdS )AptUrlz7 a class that contains the parsed data from an apt url c             C   s:   d | _ d | _d | _d | _d | _d | _d| _g | _d | _d S )Nr   )	packageschemaZminverZrefreshZkeyfilerepo_urlZdistZsectionchannel)r
   r   r   r   r   5   s    zAptUrl.__init__N)r   r   r   __doc__r   r   r   r   r   r"   3   s   r"   c             C   sH   | j ddj ddj ddj ddj oF| j oF| d j oFt| dkS )zH return True if string would be an acceptable name for a Debian package r   r   r   r   r   r   r   )replaceisalnumislowerlen)stringr   r   r   is_format_package_nameC   s    (r-   c             C   s<   x6dD ].}t | |rtt | |}t| ||j| qW dS )zB substitute known templates against the field package and channel r#   r&   N)r#   r&   )getattrr   setattrZ
substitute)apt_urlmappingZfieldsr   r   r   do_apt_url_substitutionI   s    

r3   c             C   s(   x"| D ]}|t krt| tdqW dS )z0 test if the url matches the internal whitelist zNon whitelist char in the uriT)	whitelistr   r   )Zraw_urlcharr   r   r   match_against_whitelistP   s
    
r6   c             C   s   |j d\}}yNd|kr&t| tdtt| |tg krNt| |j| nt| || W n4 tk
r } zt| td| W Y dd}~X nX dS )z5 set a key,value pair from string s to AptUrl object r    zWhitespace in key=valuezException '%s'N)splitr   r   typer.   appendr/   	Exception)r0   r2   keyvalueer   r   r   	set_valueX   s    r?   c             C   s  g }t | tkr6d| dtd   }t|td| t|  xb| jdD ]R}d|krht|td|jdd\}}|jd	}x|D ]}t }||_|jd
r|t d
d d |jddd  |_	n8d|kr|jdd j
djd|_n|j
djd|_d|krl|jddd }xH|D ]@}	d|	kr\|	jd}
x$|
D ]}	t||	 qFW n
t||	 q(W t|| t|jst|d|j |j| qW qLW |S )z6 parse an apt url and return a list of AptUrl objects z%s ...r   
   zUrl string '%s' too long;r   zNo ':' in the urir   r   zapt+Nr   r   r!   zInvalid package name '%s')r+   MAX_URL_LENr   r   r6   r8   r"   r$   
startswithr%   lstriprstripr#   r?   r3   r-   r:   )Zfull_urlr1   resr   r$   Zpackagesr#   r0   Zkey_value_pairsr2   Zand_key_value_pairsr   r   r   parsef   s>    

(





rG   )osr,   r   ZHelpersr   r   r;   r   rB   unameZapturl_substitution_mappingr4   extendZascii_lettersZdigitsobjectr"   r-   r3   r6   r?   rG   r   r   r   r   <module>   s$   &