§
    ÕË‘c$F  ã                  ó¦  — d Z ddlmZ ddlZddlZddlZddlmZ ddlZddl	Z	ddl
mZmZ ddlmZ ddlmZ  e	j        e¦  «        ZdZej                             e¦  «        r
eej        d	<   d
ZdZdZdZddddddddœZ G d„ d¦  «        ZdLd„Z	 dMdNd"„ZdOd&„Z dPd)„Z!dQd,„Z"dRd/„Z#ed0ed1d2œZ$dSd5„Z%dTd7„Z&dUd9„Z'dVd;„Z(dWd?„Z)dXdB„Z*dYdG„Z+dZdJ„Z,d[dK„Z-dS )\zñ
Query Debian's Bug Tracking System (BTS).

This module provides a layer between Python and Debian's BTS. It provides
methods to query the BTS using the BTS' SOAP interface, and the Bugreport class
which represents a bugreport from the BTS.
é    )ÚannotationsN)Údatetime)ÚAnyÚIterable)Ú
SoapClient)ÚSimpleXMLElementz/etc/ssl/ca-debianÚSSL_CERT_DIRz(https://bugs.debian.org/cgi-bin/soap.cgizDebbugs/SOAP/V1zhttps://bugs.debian.org/iô  é   é   é   é   é   é   é   )ÚcriticalÚgraveÚseriousÚ	importantÚnormalÚminorÚwishlistc                  óZ   — e Zd ZdZdd„Zdd„Zdd	„Zdd
„Zdd„Zdd„Z	dd„Z
dd„Zdd„ZdS )Ú	Bugreporta¬  Represents a bugreport from Debian's Bug Tracking System.

    A bugreport object provides all attributes provided by the SOAP interface.
    Most of the attributes are strings, the others are marked.

    Attributes
    ----------
    bug_num : int
        The bugnumber
    severity : str
        Severity of the bugreport
    tags : list[str]
        Tags of the bugreport
    subject : str
        The subject/title of the bugreport
    originator : str
        Submitter of the bugreport
    mergedwith : list[int]
        List of bugnumbers this bug was merged with
    package : str
        Package of the bugreport
    source : str
        Source package of the bugreport
    date : datetime
        Date of bug creation
    log_modified : datetime
        Date of update of the bugreport
    done : boolean
        Is the bug fixed or not
    done_by : str | None
        Name and Email or None
    archived : bool
        Is the bug archived or not
    unarchived : bool
        Was the bug unarchived or not
    fixed_versions : list[str]
        List of versions, can be empty even if bug is fixed
    found_versions : list[str]
        List of version numbers where bug was found
    forwarded : str
        A URL or email address
    blocks: list[int]
        List of bugnumbers this bug blocks
    blockedby : list[int]
        List of bugnumbers which block this bug
    pending : str
        Either 'pending' or 'done'
    msgid : str
        Message ID of the bugreport
    owner : str
        Who took responsibility for fixing this bug
    location : str
        Either 'db-h' or 'archive'
    affects : list[str]
        List of Packagenames
    summary : str
        Arbitrary text
    ÚreturnÚNonec                ój   — |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  d S ©N© )Úselfs    ú5/usr/lib/python3/dist-packages/debianbts/debianbts.pyÚ__init__zBugreport.__init__r   s›   € ØÐØÐØÐØˆØÐØÐØˆØÐ ØÐØÐ"ØÐØˆØÐ&ØÐ&ØÐØÐ!ØÐØÐØÐØÐ#ØÐØÐØÐØÐØÐÐÐó    Ústrc                óx   — d                      d„ | j                             ¦   «         D ¦   «         ¦  «        }|dz   S )Nú
c              3  ó*   K  — | ]\  }}|› d |› �V — ŒdS )z: Nr   )Ú.0ÚkeyÚvalues      r    ú	<genexpr>z$Bugreport.__str__.<locals>.<genexpr>•   sE   è è € ð 
ð 
Ù", # uˆsÐÐ�eÐÐð
ð 
ð 
ð 
ð 
ð 
r"   )ÚjoinÚ__dict__Úitems)r   Úss     r    Ú__str__zBugreport.__str__”   sJ   € Ø�IŠIð 
ð 
Ø04´×0CÒ0CÑ0EÔ0Eð
ñ 
ô 
ñ 
ô 
ˆð �4‰xˆr"   ÚotherÚboolc                óV   — |                       ¦   «         |                      ¦   «         k     S )aÍ  Compare a bugreport with another.

        The more open and urgent a bug is, the greater the bug is:

            outstanding > resolved > archived

            critical > grave > serious > important > normal > minor > wishlist.

        Openness always beats urgency, eg an archived bug is *always* smaller
        than an outstanding bug.

        This sorting is useful for displaying bugreports in a list and sorting
        them in a useful way.

        ©Ú
_get_value©r   r0   s     r    Ú__lt__zBugreport.__lt__š   s%   € ð  �ŠÑ Ô  5×#3Ò#3Ñ#5Ô#5Ò5Ð5r"   c                ó.   — |                       |¦  «         S r   )Ú__gt__r5   s     r    Ú__le__zBugreport.__le__¬   ó   € Ø—;’;˜uÑ%Ô%Ð%Ð%r"   c                óV   — |                       ¦   «         |                      ¦   «         k    S r   r3   r5   s     r    r8   zBugreport.__gt__¯   s#   € Ø�ŠÑ Ô  5×#3Ò#3Ñ#5Ô#5Ò5Ð5r"   c                ó.   — |                       |¦  «         S r   )r6   r5   s     r    Ú__ge__zBugreport.__ge__²   r:   r"   Úobjectc                óŽ   — t          |t          ¦  «        st          S |                      ¦   «         |                     ¦   «         k    S r   )Ú
isinstancer   ÚNotImplementedr4   r5   s     r    Ú__eq__zBugreport.__eq__µ   s;   € Ý˜%¥Ñ+Ô+ð 	"Ý!Ð!Ø�ŠÑ Ô  E×$4Ò$4Ñ$6Ô$6Ò6Ð6r"   c                óf   — t          |t          ¦  «        st          S |                      |¦  «         S r   )r@   r   rA   rB   r5   s     r    Ú__ne__zBugreport.__ne__º   s/   € Ý˜%¥Ñ+Ô+ð 	"Ý!Ð!Ø—;’;˜uÑ%Ô%Ð%Ð%r"   Úintc                ó\   — | j         rd}n| j        rd}nd}|t          | j                 z  }|S )Nr   é
   é   )ÚarchivedÚdoneÚ
SEVERITIESÚseverity)r   Úvals     r    r4   zBugreport._get_value¿   sA   € ØŒ=ð 	àˆCˆCØŒYð 	àˆCˆCð ˆCØ�z˜$œ-Ô(Ñ(ˆØˆ
r"   N)r   r   )r   r#   )r0   r   r   r1   )r0   r>   r   r1   )r   rE   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r/   r6   r9   r8   r=   rB   rD   r4   r   r"   r    r   r   6   sÔ   € € € € € ð9ð 9ðvð ð ð ðDð ð ð ð6ð 6ð 6ð 6ð$&ð &ð &ð &ð6ð 6ð 6ð 6ð&ð &ð &ð &ð7ð 7ð 7ð 7ð
&ð &ð &ð &ð
ð ð ð ð ð r"   r   Únrsú!int | list[int] | tuple[int, ...]r   úlist[Bugreport]c                ó  — t          | t          t          f¦  «        s| g}nt          | ¦  «        }t          ¦   «         }g }t	          dt          |¦  «        t          ¦  «        D ]¨}|||t          z   …         }t          d¦  «        }t          d||¦  «         | 	                    d|¦  «        } |d¦  «         
                    ¦   «         pg D ]>}| 
                    ¦   «         d         }	|                     t          |	¦  «        ¦  «         Œ?Œ©|S )a  Returns a list of Bugreport objects.

    Given a list of bug numbers this method returns a list of Bugreport
    objects.

    Parameters
    ----------
    nrs
        The bugnumbers

    Returns
    -------
    list[Bugreport]
        list of Bugreport objects

    r   z<get_status></get_status>Úarg0Ú
get_statusú	s-gensym3r   )r@   ÚlistÚtupleÚ_build_soap_clientÚrangeÚlenÚ
BATCH_SIZEr   Ú_build_int_array_elÚcallÚchildrenÚappendÚ_parse_status)
rR   ÚnumbersÚsoap_clientÚbugsÚiÚslice_Ú	method_elÚreplyÚbug_item_elÚbug_els
             r    rW   rW   Í   s  € õ( �c�D¥%˜=Ñ)Ô)ð Ø�%ˆˆå�s‘)”)ˆõ %Ñ&Ô&€KØ€DÝ�1•c˜'‘l”l¥JÑ/Ô/ð 	/ð 	/ˆØ˜˜1�z™>Ð)Ô*ˆõ %Ð%@ÑAÔAˆ	Ý˜F I¨vÑ6Ô6Ð6Ø× Ò  ¨yÑ9Ô9ˆØ ˜5 Ñ-Ô-×6Ò6Ñ8Ô8Ð>¸Bð 	/ð 	/ˆKØ ×)Ò)Ñ+Ô+¨AÔ.ˆFØ�KŠK� fÑ-Ô-Ñ.Ô.Ð.Ð.ð	/ð €Kr"   Úemailr#   Útagsú"None | list[str] | tuple[str, ...]údict[str, list[int]]c                ó  — |€g }t          d| g|¢R Ž } |d¦  «        }i }|                     ¦   «                              d¦  «        }|rk|j        dk    r`|                     ¦   «         pg D ]H}t           |d¦  «        ¦  «        } |d¦  «        }d„ |                     ¦   «         pg D ¦   «         ||<   ŒInP|                     ¦   «         pg D ]9}|                     ¦   «         }d	„ |                     ¦   «         pg D ¦   «         ||<   Œ:|S )
a3  Get buglists by usertags.

    Parameters
    ----------
    email
    tags
        If tags are given the dictionary is limited to the matching tags, if no
        tags are given all available tags are returned.

    Returns
    -------
    dict[str, list[int]]
        a mapping of usertag -> buglist

    NÚget_usertagrX   úxsi:typezapachens:Mapr(   r)   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   ©rE   ©r'   Úbugs     r    ú
<listcomp>zget_usertag.<locals>.<listcomp>  ó   € ÐLÐLÐL¨�C ™HœHÐLÐLÐLr"   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   ru   rv   s     r    rx   zget_usertag.<locals>.<listcomp>  ry   r"   )Ú_soap_client_callÚ
attributesÚgetr)   ra   r#   Úget_name)	rm   rn   rj   Úmap_elÚmappingÚ	type_attrÚ
usertag_elÚtagÚ
buglist_els	            r    rr   rr   ÷   sG  € ð& €|Øˆå˜m¨UÐ:°TÐ:Ð:Ð:€EØˆU�;ÑÔ€FØ€Gð
 ×!Ò!Ñ#Ô#×'Ò'¨
Ñ3Ô3€IØð M�Y”_¨Ò6Ð6Ø Ÿ/š/Ñ+Ô+Ð1¨rð 	Mð 	MˆJÝ�j�j Ñ'Ô'Ñ(Ô(ˆCØ#˜ GÑ,Ô,ˆJØLÐL°
×0CÒ0CÑ0EÔ0EÐ0KÈÐLÑLÔLˆG�C‰LˆLð	Mð
 !Ÿ/š/Ñ+Ô+Ð1¨rð 	Mð 	MˆJØ×%Ò%Ñ'Ô'ˆCØLÐL°
×0CÒ0CÑ0EÔ0EÐ0KÈÐLÑLÔLˆG�C‰LˆLØ€Nr"   ÚnrrE   ú>list[dict[str, str | list[Any] | int | email.message.Message]]c                ó�  — t          d| ¦  «        } |d¦  «        }g }|                     ¦   «         D �]}i }t           |d¦  «        ¦  «        }t           |d¦  «        ¦  «        }t           |d¦  «        ¦  «        }g }	t          j                             t          j        j        ¬¦  «        }
|
 	                    | 
                    ¦   «         ¦  «         |
 	                    d¦  «         |
 	                    | 
                    ¦   «         ¦  «         |
                     ¦   «         }||||	|dœ}|                     |¦  «         �Œ|S )	a�  Get Buglogs.

    A buglog is a dictionary with the following mappings:
        * "header" => string
        * "body" => string
        * "attachments" => list
        * "msg_num" => int
        * "message" => email.message.Message

    Parameters
    ----------
    nr
        the bugnumber

    Returns
    -------
    list[dict[str, str | list[Any] | int | email.message.Message]]
        list of buglogs

    Úget_bug_logúsoapenc:ArrayÚheaderÚbodyÚmsg_num)Úpolicys   

)rŠ   r‹   rŒ   ÚattachmentsÚmessage)r{   ra   Ú_parse_string_elrE   rm   Ú
feedparserÚBytesFeedParserr�   ÚSMTPÚfeedÚencodeÚcloserb   )r…   rj   Úitems_elÚbuglogsÚ	buglog_elÚbuglogrŠ   r‹   rŒ   rŽ   Úmail_parserr�   s               r    rˆ   rˆ   !  sN  € õ. ˜m¨RÑ0Ô0€EØˆu�_Ñ%Ô%€HØ€GØ×&Ò&Ñ(Ô(ð ñ ˆ	ØKMˆÝ! ) )¨HÑ"5Ô"5Ñ6Ô6ˆÝ 	 	¨&Ñ 1Ô 1Ñ2Ô2ˆÝ�i�i 	Ñ*Ô*Ñ+Ô+ˆà!#ˆåÔ&×6Ò6Ý”<Ô$ð 7ñ 
ô 
ˆð 	×Ò˜Ÿš™œÑ)Ô)Ð)Ø×Ò˜Ñ!Ô!Ð!Ø×Ò˜Ÿš™œÑ'Ô'Ð'Ø×#Ò#Ñ%Ô%ˆð ØØØ&Øð
ð 
ˆð 	�Š�vÑÔÐÑØ€Nr"   Úamountú	list[int]c                óx   — t          d| ¦  «        } |d¦  «        }d„ |                     ¦   «         pg D ¦   «         S )a9  Returns the newest bugs.

    This method can be used to query the BTS for the n newest bugs.

    Parameters
    ----------
    amount
        the number of desired bugs. E.g. if `amount` is 10 the method will
        return the 10 latest bugs.

    Returns
    -------
    list[int]
        the bugnumbers

    Únewest_bugsr‰   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   ru   ©r'   Úitem_els     r    rx   znewest_bugs.<locals>.<listcomp>j  ó   € ÐBÐBÐB˜W�C�‰LŒLÐBÐBÐBr"   )r{   ra   )rœ   rj   r—   s      r    rŸ   rŸ   W  sG   € õ" ˜m¨VÑ4Ô4€EØˆu�_Ñ%Ô%€HØBÐB¨×(9Ò(9Ñ(;Ô(;Ð(A¸rÐBÑBÔBÐBr"   Úkwargsústr | int | list[int]c                 óú  — g }|                       ¦   «         D ]\  }}|                     ||g¦  «         Œt          d¦  «        }t          |¦  «        D ][\  }}dt	          |¦  «        z   }t          |t          t          f¦  «        rt          |||¦  «         ŒE| 	                    ||¦  «         Œ\t          ¦   «         }|                     d|¦  «        }	 |	d¦  «        }
d„ |
                     ¦   «         pg D ¦   «         S )aÇ  Get list of bugs matching certain criteria.

    The conditions are defined by the keyword arguments.

    Arguments
    ---------
    kwargs
        Possible keywords are:
            * "package": bugs for the given package
            * "submitter": bugs from the submitter
            * "maint": bugs belonging to a maintainer
            * "src": bugs belonging to a source package
            * "severity": bugs with a certain severity
            * "status": can be either "done", "forwarded", or "open"
            * "tag": see http://www.debian.org/Bugs/Developer#tags for
              available tags
            * "owner": bugs which are assigned to `owner`
            * "bugs": takes single int or list of bugnumbers, filters the list
              according to given criteria
            * "correspondent": bugs where `correspondent` has sent a mail to
            * "archive": takes a string: "0" (unarchived), "1" (archived) or
              "both" (un- and archived). if omitted, only returns un-archived
              bugs.

    Returns
    -------
    list[int]
        the bugnumbers

    Examples
    --------
        >>> get_bugs(package='gtk-qt-engine', severity='normal')
        [12345, 23456]

    z<get_bugs></get_bugs>ÚargÚget_bugsr‰   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   ru   r¡   s     r    rx   zget_bugs.<locals>.<listcomp>§  r£   r"   )r-   Úextendr   Ú	enumerater#   r@   rY   rZ   r_   Úmarshallr[   r`   ra   )r¤   ÚargsÚkÚvri   Úarg_nÚkvÚarg_namere   rj   r—   s              r    r¨   r¨   m  s  € ðP €DØ—’‘”ð ð ‰ˆˆ1Ø�Š�Q˜�FÑÔÐÐõ
 !Ð!8Ñ9Ô9€IÝ˜t‘_”_ð -ð -‰	ˆˆrØ�3˜u™:œ:Ñ%ˆÝ�b�4¥˜-Ñ(Ô(ð 	-Ý ¨)°RÑ8Ô8Ð8Ð8à×Ò˜x¨Ñ,Ô,Ð,Ð,å$Ñ&Ô&€KØ×Ò˜Z¨Ñ3Ô3€EØˆu�_Ñ%Ô%€HØBÐB¨×(9Ò(9Ñ(;Ô(;Ð(A¸rÐBÑBÔBÐBr"   rl   r   c           
     óv  — t          ¦   «         }dD ])}t          ||t           | |¦  «        ¦  «        ¦  «         Œ*t          j        t           | d¦  «        ¦  «        ¦  «        |_        t          j        t           | d¦  «        ¦  «        ¦  «        |_        d„ t           | d¦  «        ¦  «         	                    ¦   «         D ¦   «         |_
        t           | d¦  «        ¦  «        |_        |j        rt           | d¦  «        ¦  «        nd|_        t           | d¦  «        ¦  «        |_        t           | d	¦  «        ¦  «        |_        t!           | d
¦  «        ¦  «        |_        d„ t           | d¦  «        ¦  «         	                    ¦   «         D ¦   «         |_        d„ t           | d¦  «        ¦  «         	                    ¦   «         D ¦   «         |_        d„ t           | d¦  «        ¦  «         	                    ¦   «         D ¦   «         |_        d„  | d¦  «                             ¦   «         pg D ¦   «         |_        d„  | d¦  «                             ¦   «         pg D ¦   «         |_        d„ t           | d¦  «        ¦  «         	                    d¦  «        D ¦   «         }d„ |D ¦   «         |_        |S )zÈReturn a bugreport object from a given status xml element

    Parameters
    ----------
    bug_el
        a status XML element

    Returns
    -------
    Bugreport
        a Bugreport object

    )Ú
originatorÚsubjectÚmsgidÚpackagerL   ÚownerÚsummaryÚlocationÚsourceÚpendingÚ	forwardedÚdateÚlog_modifiedc                ó   — g | ]}|‘ŒS r   r   )r'   rƒ   s     r    rx   z!_parse_status.<locals>.<listcomp>Ì  s   € Ð;Ð;Ð;˜�Ð;Ð;Ð;r"   rn   rJ   NrI   Ú
unarchivedÚbug_numc                ó,   — g | ]}t          |¦  «        ‘ŒS r   ru   ©r'   rg   s     r    rx   z!_parse_status.<locals>.<listcomp>Ò  s   € ÐHÐHÐH •c˜!‘f”fÐHÐHÐHr"   Ú
mergedwithc                ó,   — g | ]}t          |¦  «        ‘ŒS r   ru   rÄ   s     r    rx   z!_parse_status.<locals>.<listcomp>Ó  s   € ÐFÐFÐF •S˜‘V”VÐFÐFÐFr"   Ú	blockedbyc                ó,   — g | ]}t          |¦  «        ‘ŒS r   ru   rÄ   s     r    rx   z!_parse_status.<locals>.<listcomp>Ô  s   € Ð@Ð@Ð@˜Q•#�a‘&”&Ð@Ð@Ð@r"   Úblocksc                ó,   — g | ]}t          |¦  «        ‘ŒS r   ©r#   ©r'   Úels     r    rx   z!_parse_status.<locals>.<listcomp>Ö  ó+   € ð ð ð Ø�ˆB‰Œðð ð r"   Úfound_versionsc                ó,   — g | ]}t          |¦  «        ‘ŒS r   rË   rÌ   s     r    rx   z!_parse_status.<locals>.<listcomp>Ù  rÎ   r"   Úfixed_versionsc                ó   — g | ]}|¯|‘ŒS r   r   )r'   Ú_fs     r    rx   z!_parse_status.<locals>.<listcomp>Ü  s   € ÐDÐDÐD�bÀÐDˆrÐDÐDÐDr"   Úaffectsú,c                ó6   — g | ]}|                      ¦   «         ‘ŒS r   )Ústrip)r'   Úas     r    rx   z!_parse_status.<locals>.<listcomp>Ý  s    € Ð.Ð.Ð. �1—7’7‘9”9Ð.Ð.Ð.r"   )r   Úsetattrr�   r   ÚutcfromtimestampÚfloatr¾   r¿   r#   Úsplitrn   Ú_parse_boolrJ   Údone_byrI   rÁ   rE   rÂ   rÅ   rÇ   rÉ   ra   rÏ   rÑ   rÔ   )rl   rw   ÚfieldrÔ   s       r    rc   rc   ª  s©  € õ ‰+Œ+€Cðð =ð =ˆõ 	��UÕ,¨V¨V°E©]¬]Ñ;Ô;Ñ<Ô<Ð<Ð<åÔ(­¨v¨v°f©~¬~Ñ)>Ô)>Ñ?Ô?€C„HÝÔ0µ°v°v¸nÑ7MÔ7MÑ1NÔ1NÑOÔO€CÔØ;Ð;�s 6 6¨&¡>¤>Ñ2Ô2×8Ò8Ñ:Ô:Ð;Ñ;Ô;€C„HÝ˜6˜6 &™>œ>Ñ*Ô*€C„HØ69´hÐHÕ" 6 6¨&¡>¤>Ñ2Ô2Ð2ÀD€C„KÝ˜v˜v jÑ1Ô1Ñ2Ô2€C„LÝ   ¨Ñ!5Ô!5Ñ6Ô6€C„NÝ�f�f˜YÑ'Ô'Ñ(Ô(€C„KØHÐH¥c¨&¨&°Ñ*>Ô*>Ñ&?Ô&?×&EÒ&EÑ&GÔ&GÐHÑHÔH€C„NØFÐF¥S¨¨°Ñ)<Ô)<Ñ%=Ô%=×%CÒ%CÑ%EÔ%EÐFÑFÔF€C„MØ@Ð@¥# f f¨XÑ&6Ô&6Ñ"7Ô"7×"=Ò"=Ñ"?Ô"?Ð@Ñ@Ô@€C„Jðð Ø ˜&Ð!1Ñ2Ô2×;Ò;Ñ=Ô=ÐCÀðñ ô €CÔðð Ø ˜&Ð!1Ñ2Ô2×;Ò;Ñ=Ô=ÐCÀðñ ô €CÔð EÐD�C   yÑ 1Ô 1Ñ2Ô2×8Ò8¸Ñ=Ô=ÐDÑDÔD€GØ.Ð. gÐ.Ñ.Ô.€C„Kð €Jr"   Ú Úsoap)rº   ÚactionÚ	namespaceÚsoap_nsÚ	proxy_argr   c                ó   — | t           d<   dS )zŠSet proxy for SOAP client.

    You must use this method after import to set the proxy.

    Parameters
    ----------
    proxy_arg

    ÚproxyN©Ú_soap_client_kwargs)rå   s    r    Úset_soap_proxyrê   ò  s   € ð $-Õ˜Ñ Ð Ð r"   Úurlc                ó   — | t           d<   dS )z¨Set location URL for SOAP client

    You may use this method after import to override the default URL.

    Parameters
    ----------
    url
        default URL

    rº   Nrè   )rë   s    r    Úset_soap_locationrí   ÿ  s   € ð '*Õ˜
Ñ#Ð#Ð#r"   údict[str, str]c                 ó   — t           S )zlReturns SOAP client kwargs.

    Returns
    -------
    dict[str, str]
        the SOAP client kwargs

    rè   r   r"   r    Úget_soap_client_kwargsrð     s
   € õ Ðr"   r   c                 ó$   — t          di t          ¤ŽS )zÕFactory method that creates a SoapClient.

    For thread-safety we create SoapClients on demand instead of using a
    module-level one.

    Returns
    -------
    SoapClient
        a SoapClient instance

    r   )r   ré   r   r"   r    r[   r[     s   € õ Ð,Ð,Õ+Ð,Ð,Ð,r"   r­   úIterable[Any]úlist[tuple[str, Any]]c                 ó‚   — g }t          | ¦  «        D ],\  }}|                     dt          |¦  «        z   |f¦  «         Œ-|S )aq  Convert arguments to be consumed by a SoapClient method

    Parameters
    ----------
    *args
        any argument

    Returns
    -------
    list[tuple[str, Any]]
        the converted arguments

    Examples
    --------
    Soap client required a list of named arguments:

        >>> _convert_soap_method_args('a', 1)
        [('arg0', 'a'), ('arg1', 1)]

    r§   )r«   rb   r#   )r­   Ú	soap_argsr°   r§   s       r    Ú_convert_soap_method_argsrö   (  sO   € ð* €IÝ ‘o”oð 4ð 4‰
ˆˆsØ×Ò˜%¥# e¡*¤*Ñ,¨cÐ2Ñ3Ô3Ð3Ð3ØÐr"   Úmethod_namer   c                óV   — t          ¦   «         }t          |Ž } t          || ¦  «        |Ž S )z™Wrapper to call SoapClient method

    Parameters
    ----------
    method_name
        the method name
    *args

    Returns
    -------
    Any

    )r[   rö   Úgetattr)r÷   r­   re   rõ   s       r    r{   r{   C  s0   € õ %Ñ&Ô&€KÝ)¨4Ð0€IØ,�7�; Ñ,Ô,¨iÐ8Ð8r"   Úel_nameÚparentÚlist_ú	list[Any]c                óT  — |                      | ¦  «        }|                     dd¦  «         |                     dd¦  «         |                     ddt          |¦  «        d›d�¦  «         |D ];}|                      d	t          |¦  «        ¦  «        }|                     dd
¦  «         Œ<|S )zúBuild Array as child of parent.

    More specifically: Build a soapenc:Array made of ints called `el_name` as a
    child of `parent`.

    Parameters
    ----------
    el_name
    parent
    list

    Returns
    -------
    SimpleXMLElement

    zxmlns:soapencz)http://schemas.xmlsoap.org/soap/encoding/rs   r‰   zsoapenc:arrayTypezxsd:int[Údú]Úitemzxsd:int)Ú	add_childÚadd_attributer]   r#   )rú   rû   rü   rÍ   r  r¢   s         r    r_   r_   W  s¿   € ð* 
×	Ò	˜'Ñ	"Ô	"€BØ×ÒØÐDñô ð ð ×Ò�Z Ñ1Ô1Ð1Ø×ÒÐ(Ð*DµS¸±Z´ZÐ*DÐ*DÐ*DÐ*DÑEÔEÐEØð 5ð 5ˆØ—,’,˜v¥s¨4¡y¤yÑ1Ô1ˆØ×Ò˜j¨)Ñ4Ô4Ð4Ð4Ø€Ir"   rÍ   r1   c                óL   — t          | ¦  «        }|                     ¦   «         dvS )z­Parse a boolean value from a XML element.

    Parameters
    ----------
    el
        the element to parse

    Returns
    -------
    bool
        the parsed value

    )rà   Ú0)r#   r×   )rÍ   r)   s     r    rÝ   rÝ   x  s"   € õ �‰GŒG€EØ�{Š{‰}Œ} 	Ð)Ð)r"   c                óâ   — t          | ¦  «        }|                      ¦   «                              d¦  «        }|r6|j        dk    r+t	          j        |¦  «        }|                     dd¬¦  «        }|S )z²Read a string element, maybe encoded in base64.

    Parameters
    ----------
    el
        the element to parse

    Returns
    -------
    str
        the parsed value

    rs   zxsd:base64Binaryzutf-8Úreplace)Úerrors)r#   r|   r}   r)   Úbase64Ú	b64decodeÚdecode)rÍ   r)   Úel_typeÚtmps       r    r�   r�   Š  si   € õ �‰GŒG€EØ�mŠm‰oŒo×!Ò! *Ñ-Ô-€GØð 6�7”=Ð$6Ò6Ð6ÝÔ˜uÑ%Ô%ˆØ—
’
˜7¨9�
Ñ5Ô5ˆØ€Lr"   )rR   rS   r   rT   r   )rm   r#   rn   ro   r   rp   )r…   rE   r   r†   )rœ   rE   r   r�   )r¤   r¥   r   r�   )rl   r   r   r   )rå   r#   r   r   )rë   r#   r   r   )r   rî   )r   r   )r­   rò   r   ró   )r÷   r#   r­   r   r   r   )rú   r#   rû   r   rü   rý   r   r   )rÍ   r   r   r1   )rÍ   r   r   r#   ).rQ   Ú
__future__r   r	  Úemail.feedparserrm   Úemail.policyr   ÚosÚloggingÚtypingr   r   Úpysimplesoap.clientr   Úpysimplesoap.simplexmlr   Ú	getLoggerrN   ÚloggerÚca_pathÚpathÚisdirÚenvironÚURLÚNSÚBTS_URLr^   rK   r   rW   rr   rˆ   rŸ   r¨   rc   ré   rê   rí   rð   r[   rö   r{   r_   rÝ   r�   r   r"   r    ú<module>r     s´  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø €€€Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à *Ð *Ð *Ð *Ð *Ð *Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ð 
ˆÔ	˜8Ñ	$Ô	$€ð €Ø„7‡=‚=�ÑÔð )Ø!(€B„Jˆ~Ñð
 1€Ø€Ø
$€à€
ð ØØØØØØðð €
ðTð Tð Tð Tð Tñ Tô Tð Tðn'ð 'ð 'ð 'ðX 04ð'ð 'ð 'ð 'ð 'ðT3ð 3ð 3ð 3ðlCð Cð Cð Cð,:Cð :Cð :Cð :Cðz=ð =ð =ð =ðB ØØØð	ð Ð ð
-ð 
-ð 
-ð 
-ð*ð *ð *ð *ð	ð 	ð 	ð 	ð-ð -ð -ð -ðð ð ð ð69ð 9ð 9ð 9ð(ð ð ð ðB*ð *ð *ð *ð$ð ð ð ð ð r"   