B
    0*\MQ                 @   sf  d dl mZ d dlmZ d dlmZ d dlmZ G dd dZG dd dZG d	d
 d
e	Z
dd ZG dd dZG dd deZG dd dZG dd deZG dd dZG dd deZG dd deZG dd deZG dd dZG dd  d ZG d!d" d"eZG d#d$ d$eZG d%d& d&Zeeeeeeeeeeeeeeeeeeed'ZG d(d) d)Zd*S )+    )MappingProxyType)utils)errors)_header_value_parserc               @   s^   e Zd ZdddZedd Zedd Zed	d
 Zedd Zdd Z	dd Z
dd ZdS )Address Nc             C   sl   |d k	rV|s|rt dt|\}}|r:td|||jrJ|jd |j}|j}|| _|| _	|| _
d S )Nz=addrspec specified when username and/or domain also specifiedz6Invalid addr_spec; only '{}' could be parsed from '{}'r   )	TypeErrorparserZget_addr_spec
ValueErrorformatall_defects
local_partdomain_display_name	_username_domain)selfdisplay_nameusernamer   	addr_specZa_srest r   ?C:\ALexclude\prg\programme\Python37\Lib\email\headerregistry.py__init__   s    

zAddress.__init__c             C   s   | j S )N)r   )r   r   r   r   r   7   s    zAddress.display_namec             C   s   | j S )N)r   )r   r   r   r   r   ;   s    zAddress.usernamec             C   s   | j S )N)r   )r   r   r   r   r   ?   s    zAddress.domainc             C   sT   t | j}t|t|tj kr.t| j}n| j}| jrH|d | j S |sPdS |S )N@z<>)setr   lenr	   ZDOT_ATOM_ENDSquote_stringr   )r   namesetZlpr   r   r   r   C   s    
zAddress.addr_specc             C   s   d | jj| j| j| jS )Nz1{}(display_name={!r}, username={!r}, domain={!r}))r   	__class____name__r   r   r   )r   r   r   r   __repr__S   s    zAddress.__repr__c             C   s^   t | j}t|t|tj kr.t| j}n| j}|rX| jdkrFdn| j}d||S | jS )Nz<>r   z{} <{}>)r   r   r   r	   SPECIALSr   r   r   )r   r   dispr   r   r   r   __str__X   s    
zAddress.__str__c             C   s8   t |t | krdS | j|jko6| j|jko6| j|jkS )NF)typer   r   r   )r   otherr   r   r   __eq__c   s
    zAddress.__eq__)r   r   r   N)r    
__module____qualname__r   propertyr   r   r   r   r!   r$   r'   r   r   r   r   r      s   
%r   c               @   sF   e Zd ZdddZedd Zedd Zdd	 Zd
d Zdd Z	dS )GroupNc             C   s   || _ |rt|nt | _d S )N)r   tuple
_addresses)r   r   	addressesr   r   r   r   m   s    zGroup.__init__c             C   s   | j S )N)r   )r   r   r   r   r      s    zGroup.display_namec             C   s   | j S )N)r-   )r   r   r   r   r.      s    zGroup.addressesc             C   s   d | jj| j| jS )Nz${}(display_name={!r}, addresses={!r})r   r   r    r   r.   )r   r   r   r   r!      s    zGroup.__repr__c             C   s   | j d kr&t| jdkr&t| jd S | j }|d k	r\t|}t|t|tj kr\t|}ddd | jD }|r~d| n|}d	||S )N   r   z, c             s   s   | ]}t |V  qd S )N)str).0xr   r   r   	<genexpr>   s    z Group.__str__.<locals>.<genexpr> z{}:{};)
r   r   r.   r0   r   r	   r"   r   joinr   )r   r#   r   Zadrstrr   r   r   r$      s    
zGroup.__str__c             C   s,   t |t | krdS | j|jko*| j|jkS )NF)r%   r   r.   )r   r&   r   r   r   r'      s    zGroup.__eq__)NN)
r    r(   r)   r   r*   r   r.   r!   r$   r'   r   r   r   r   r+   k   s   
r+   c               @   sP   e Zd Zdd Zdd Zedd Zedd Zd	d
 Ze	dd Z
dd ZdS )
BaseHeaderc             C   s\   dg i}|  || t|d r4t|d |d< t| |d }|d= |j|f| |S )Ndefectsdecoded)parser   Z_has_surrogates	_sanitizer0   __new__init)clsnamevaluekwdsr   r   r   r   r;      s    zBaseHeader.__new__c            C   s   || _ || _|| _d S )N)_name_parse_tree_defects)r   r>   
parse_treer7   r   r   r   r<      s    zBaseHeader.initc             C   s   | j S )N)rA   )r   r   r   r   r>      s    zBaseHeader.namec             C   s
   t | jS )N)r,   rC   )r   r   r   r   r7      s    zBaseHeader.defectsc             C   s   t | jj| jjt| f| jfS )N)_reconstruct_headerr   r    	__bases__r0   __dict__)r   r   r   r   
__reduce__   s
    zBaseHeader.__reduce__c             C   s   t | |S )N)r0   r;   )r=   r?   r   r   r   _reconstruct   s    zBaseHeader._reconstructc         	   C   s`   t t t | jdt ddgg}| jrH|t t ddg || j |j	|dS )Nzheader-name:z
header-sepr4   Zfws)policy)
r	   ZHeaderZHeaderLabelZValueTerminalr>   rB   appendZCFWSListZWhiteSpaceTerminalfold)r   rK   headerr   r   r   rM      s    zBaseHeader.foldN)r    r(   r)   r;   r<   r*   r>   r7   rH   classmethodrI   rM   r   r   r   r   r6      s   "

r6   c             C   s   t | |i |S )N)r%   rI   )Zcls_namebasesr?   r   r   r   rE     s    rE   c               @   s&   e Zd ZdZeejZedd Z	dS )UnstructuredHeaderNc             C   s"   |  ||d< t|d |d< d S )NrD   r8   )value_parserr0   )r=   r?   r@   r   r   r   r9     s    zUnstructuredHeader.parse)
r    r(   r)   	max_countstaticmethodr	   get_unstructuredrR   rO   r9   r   r   r   r   rQ   	  s   
rQ   c               @   s   e Zd ZdZdS )UniqueUnstructuredHeaderr/   N)r    r(   r)   rS   r   r   r   r   rV     s   rV   c                   sB   e Zd ZdZeejZedd Z	 fddZ
edd Z  ZS )
DateHeaderNc             C   sz   |s6|d  t  d |d< d|d< t |d< d S t|trJt|}||d< t	|d |d< | 
|d |d< d S )Nr7   datetimer   r8   rD   )rL   r   ZHeaderMissingRequiredValuer	   Z	TokenList
isinstancer0   r   Zparsedate_to_datetimeZformat_datetimerR   )r=   r?   r@   r   r   r   r9   )  s    

zDateHeader.parsec                s   | d| _t j|| d S )NrX   )pop	_datetimesuperr<   )r   argskw)r   r   r   r<   7  s    zDateHeader.initc             C   s   | j S )N)r[   )r   r   r   r   rX   ;  s    zDateHeader.datetime)r    r(   r)   rS   rT   r	   rU   rR   rO   r9   r<   r*   rX   __classcell__r   r   )r   r   rW     s
   
rW   c               @   s   e Zd ZdZdS )UniqueDateHeaderr/   N)r    r(   r)   rS   r   r   r   r   r`   @  s   r`   c                   sP   e Zd ZdZedd Zedd Z fddZe	dd	 Z
e	d
d Z  ZS )AddressHeaderNc             C   s   t | \}} |S )N)r	   Zget_address_list)r?   address_listr   r   r   rR   I  s    zAddressHeader.value_parserc             C   s   t |trZ| | |d< }g }x,|jD ]"}|t|jdd |jD  q(W t|j	}n"t
|dsj|g}dd |D }g }||d< ||d< dd	d |D |d
< d|kr| |d
 |d< d S )NrD   c             S   s*   g | ]"}t |jpd |jpd |jp"d qS )r   )r   r   r   r   )r1   Zmbr   r   r   
<listcomp>X  s   z'AddressHeader.parse.<locals>.<listcomp>__iter__c             S   s&   g | ]}t |d std|gn|qS )r.   N)hasattrr+   )r1   itemr   r   r   rc   a  s   groupsr7   z, c             S   s   g | ]}t |qS r   )r0   )r1   rf   r   r   r   rc   g  s    r8   )rY   r0   rR   r.   rL   r+   r   Zall_mailboxeslistr   re   r5   )r=   r?   r@   rb   rg   Zaddrr7   r   r   r   r9   O  s$    


zAddressHeader.parsec                s(   t |d| _d | _t j|| d S )Nrg   )r,   rZ   _groupsr-   r\   r<   )r   r]   r^   )r   r   r   r<   k  s    zAddressHeader.initc             C   s   | j S )N)ri   )r   r   r   r   rg   p  s    zAddressHeader.groupsc             C   s&   | j d kr tdd | jD | _ | j S )Nc             s   s   | ]}|j D ]
}|V  qqd S )N)r.   )r1   groupaddressr   r   r   r3   w  s    z*AddressHeader.addresses.<locals>.<genexpr>)r-   r,   ri   )r   r   r   r   r.   t  s    
zAddressHeader.addresses)r    r(   r)   rS   rT   rR   rO   r9   r<   r*   rg   r.   r_   r   r   )r   r   ra   E  s   ra   c               @   s   e Zd ZdZdS )UniqueAddressHeaderr/   N)r    r(   r)   rS   r   r   r   r   rl   |  s   rl   c               @   s   e Zd Zedd ZdS )SingleAddressHeaderc             C   s(   t | jdkrtd| j| jd S )Nr/   z9value of single address header {} is not a single addressr   )r   r.   r
   r   r>   )r   r   r   r   rk     s    
zSingleAddressHeader.addressN)r    r(   r)   r*   rk   r   r   r   r   rm     s   rm   c               @   s   e Zd ZdZdS )UniqueSingleAddressHeaderr/   N)r    r(   r)   rS   r   r   r   r   rn     s   rn   c                   sZ   e Zd ZdZeejZedd Z	 fddZ
edd Zedd	 Zed
d Z  ZS )MIMEVersionHeaderr/   c             C   s   |  | |d< }t||d< |d |j |jd kr<d n|j|d< |j|d< |jd k	rtd|d |d |d< nd |d< d S )NrD   r8   r7   majorminorz{}.{}version)rR   r0   extendr   rq   rp   r   )r=   r?   r@   rD   r   r   r   r9     s    

zMIMEVersionHeader.parsec                s6   | d| _| d| _| d| _t j|| d S )Nrr   rp   rq   )rZ   _version_major_minorr\   r<   )r   r]   r^   )r   r   r   r<     s    zMIMEVersionHeader.initc             C   s   | j S )N)ru   )r   r   r   r   rp     s    zMIMEVersionHeader.majorc             C   s   | j S )N)rv   )r   r   r   r   rq     s    zMIMEVersionHeader.minorc             C   s   | j S )N)rt   )r   r   r   r   rr     s    zMIMEVersionHeader.version)r    r(   r)   rS   rT   r	   Zparse_mime_versionrR   rO   r9   r<   r*   rp   rq   rr   r_   r   r   )r   r   ro     s   
ro   c                   s8   e Zd ZdZedd Z fddZedd Z  Z	S )ParameterizedMIMEHeaderr/   c             C   sZ   |  | |d< }t||d< |d |j |jd krBi |d< ndd |jD |d< d S )NrD   r8   r7   paramsc             S   s&   i | ]\}}t |t | qS r   )r   r:   lower)r1   r>   r?   r   r   r   
<dictcomp>  s   z1ParameterizedMIMEHeader.parse.<locals>.<dictcomp>)rR   r0   rs   r   rx   )r=   r?   r@   rD   r   r   r   r9     s    

zParameterizedMIMEHeader.parsec                s   | d| _t j|| d S )Nrx   )rZ   _paramsr\   r<   )r   r]   r^   )r   r   r   r<     s    zParameterizedMIMEHeader.initc             C   s
   t | jS )N)r   r{   )r   r   r   r   rx     s    zParameterizedMIMEHeader.params)
r    r(   r)   rS   rO   r9   r<   r*   rx   r_   r   r   )r   r   rw     s   rw   c                   sJ   e Zd ZeejZ fddZedd Z	edd Z
edd Z  ZS )	ContentTypeHeaderc                s2   t  j|| t| jj| _t| jj| _d S )N)	r\   r<   r   r:   rB   maintype	_maintypesubtype_subtype)r   r]   r^   )r   r   r   r<     s    zContentTypeHeader.initc             C   s   | j S )N)r~   )r   r   r   r   r}     s    zContentTypeHeader.maintypec             C   s   | j S )N)r   )r   r   r   r   r     s    zContentTypeHeader.subtypec             C   s   | j d | j S )N/)r}   r   )r   r   r   r   content_type  s    zContentTypeHeader.content_type)r    r(   r)   rT   r	   Zparse_content_type_headerrR   r<   r*   r}   r   r   r_   r   r   )r   r   r|     s
   
r|   c                   s2   e Zd ZeejZ fddZedd Z	  Z
S )ContentDispositionHeaderc                s2   t  j|| | jj}|d kr"|nt|| _d S )N)r\   r<   rB   content_dispositionr   r:   _content_disposition)r   r]   r^   Zcd)r   r   r   r<     s    zContentDispositionHeader.initc             C   s   | j S )N)r   )r   r   r   r   r     s    z,ContentDispositionHeader.content_disposition)r    r(   r)   rT   r	   Z parse_content_disposition_headerrR   r<   r*   r   r_   r   r   )r   r   r     s   
r   c                   sB   e Zd ZdZeejZedd Z	 fddZ
edd Z  ZS )ContentTransferEncodingHeaderr/   c             C   s2   |  | |d< }t||d< |d |j d S )NrD   r8   r7   )rR   r0   rs   r   )r=   r?   r@   rD   r   r   r   r9     s    z#ContentTransferEncodingHeader.parsec                s"   t  j|| t| jj| _d S )N)r\   r<   r   r:   rB   cte_cte)r   r]   r^   )r   r   r   r<     s    z"ContentTransferEncodingHeader.initc             C   s   | j S )N)r   )r   r   r   r   r     s    z!ContentTransferEncodingHeader.cte)r    r(   r)   rS   rT   r	   Z&parse_content_transfer_encoding_headerrR   rO   r9   r<   r*   r   r_   r   r   )r   r   r     s
   
r   )ZsubjectZdatezresent-datez	orig-dateZsenderzresent-sendertoz	resent-toZccz	resent-ccZbccz
resent-bccfromzresent-fromzreply-tozmime-versionzcontent-typezcontent-dispositionzcontent-transfer-encodingc               @   s4   e Zd ZeedfddZdd Zdd Zdd	 Zd
S )HeaderRegistryTc             C   s&   i | _ || _|| _|r"| j t d S )N)registry
base_classdefault_classupdate_default_header_map)r   r   r   Zuse_default_mapr   r   r   r   '  s
    zHeaderRegistry.__init__c             C   s   || j | < d S )N)r   ry   )r   r>   r=   r   r   r   map_to_type9  s    zHeaderRegistry.map_to_typec             C   s,   | j | | j}td|j || jfi S )N_)r   getry   r   r%   r    r   )r   r>   r=   r   r   r   __getitem__?  s    zHeaderRegistry.__getitem__c             C   s   | | ||S )Nr   )r   r>   r?   r   r   r   __call__C  s    
zHeaderRegistry.__call__N)	r    r(   r)   r6   rQ   r   r   r   r   r   r   r   r   r   #  s
   r   N)typesr   Zemailr   r   r   r	   r   r+   r0   r6   rE   rQ   rV   rW   r`   ra   rl   rm   rn   ro   rw   r|   r   r   r   r   r   r   r   r   <module>
   sP   [6d'7
%