Ë
    æš¾j„,  ã                  óž  — d Z ddlmZ ddlmZ ddlZddlZddlZ	ddl
mZmZmZ 	 ddlZddlZddlmZ erddlmZmZ ddlmZ  ej2                  e«      Zd	Zd
ZdZ G d„ de«      Zdd„Z 	 	 	 	 	 	 	 	 dd„Z!ef	 	 	 	 	 	 	 dd„Z"dd„Z#dd„Z$ G d„ dejJ                  «      Z& G d„ dejJ                  «      Z' G d„ de(«      Z)y# e$ r dZY Œ¡w xY w)zyImplements reading and writing to/from WebHDFS.

The main entry point is the :func:`~smart_open.webhdfs.open` function.

é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚ	TypedDictT)Ú	constants)ÚReadableBufferÚWriteableBuffer)ÚTransportParamsÚwebhdfs)zwebhdfs://host:port/path/filei   c                  ó"   — e Zd ZU ded<   ded<   y)Ú_WebHDFSUriÚstrÚschemeÚuriN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú\/home/spazio/kingdom_calls/work5/transenv/lib/python3.12/site-packages/smart_open/webhdfs.pyr   r   ,   s   … ØƒKØ	„Hr   r   c                ó   — t         | dœS )z>Return the WebHDFS URI as a dict with `scheme` and `uri` keys.)r   r   )ÚSCHEME)Ú
uri_as_strs    r   Ú	parse_urir   1   s   € ä ZÑ0Ð0r   c                ód   — t         j                  j                  t        |«      }t        | |fi |¤ŽS )z=Open a WebHDFS URI using the given mode and transport params.)Ú
smart_openÚutilsÚcheck_kwargsÚopen)r   ÚmodeÚtransport_paramsÚkwargss       r   Úopen_urir$   6   s/   € ô ×Ñ×*Ñ*¬4Ð1AÓB€FÜ��TÑ$˜VÑ$Ð$r   c                ó  — | j                  t        «      rt        | «      } |t        j                  k(  rt        | «      }n2|t        j                  k(  rt        | |¬«      }nd|›d�}t        |«      ‚| j                  d«      d   |_
        |S )a•  Open a WebHDFS URI for reading or writing.

    Args:
        http_uri: webhdfs url converted to http REST url.
        mode: The mode for opening the object. Must be either "rb" or "wb".
        min_part_size: For writing only.

    Returns:
        A file-like object for reading from or writing to the WebHDFS file.

    Raises:
        NotImplementedError: If the requested mode is not supported.
    )Úmin_part_sizezwebhdfs support for mode z not implementedú/éÿÿÿÿ)Ú
startswithr   Ú_convert_to_http_urir   ÚREAD_BINARYÚBufferedInputBaseÚWRITE_BINARYÚBufferedOutputBaseÚNotImplementedErrorÚsplitÚname)Úhttp_urir!   r&   ÚfobjÚmsgs        r   r    r    >   s„   € ð  ×Ñœ6Ô"Ü'¨Ó1ˆð Œy×$Ñ$Ò$Ü  Ó*‰Ø	”×'Ñ'Ò	'Ü! (¸-ÔH‰à)¨$¨Ð1AÐBˆÜ! #Ó&Ð&à—‘˜sÓ# BÑ'€D„IØ€Kr   c                óš  — t         j                  j                  | «      }|j                  xs d}|j                  r|d|j                  › �z  }|j
                  }|j                  r6||rdnddz   t         j                  j                  |j                  «      z   z  }t         j                  j                  d|d|j                  z   |df«      S )zµConvert webhdfs uri to http url and return it as text.

    Args:
        webhdfs_url: A URL starting with webhdfs://.

    Returns:
        The converted HTTP URL as a string.
    Ú ú:ú&z
user.name=Úhttpz/webhdfs/v1)
ÚurllibÚparseÚurlsplitÚhostnameÚportÚqueryÚusernameÚquoteÚ
urlunsplitÚpath)Úwebhdfs_urlÚ	split_uriÚnetlocr?   s       r   r*   r*   ^   s¯   € ô —‘×%Ñ% kÓ2€IØ×ÑÒ% 2€FØ‡~‚~Ø�A�i—n‘nÐ%Ð&Ñ&ˆØ�O‰O€EØ×ÒØ™‘# B¨,Ñ6¼¿¹×9KÑ9KÈI×L^ÑL^Ó9_Ñ_Ñ_ˆä�<‰<×"Ñ" F¨F°MÀIÇNÁNÑ4RÐTYÐ[]Ð#^Ó_Ð_r   c                ó,   — t        | j                  «      S )zCConvert a parsed webhdfs URI to its HTTP REST URL (compat wrapper).)r*   r   )Ú
parsed_uris    r   Úconvert_to_http_urirI   u   s   € ä 
§¡Ó/Ð/r   c                  óˆ   — e Zd ZU dZded<   dZded<   dd„Zdd„Zedd	„«       Z	dd
„Z
dd„Zdd„Zddd„Zddd„Zdd„Zdd„Zy)r,   zGBuffered WebHDFS reader implementing the `io.BufferedIOBase` interface.r   r1   Nzbytes | NoneÚ_bufc                ó  — || _         dddœ}t        j                  | j                   |d¬«      | _        | j                  j                  t
        j                  k7  rt        j                  | j                  «      ‚d| _	        y )NÚOPENr   )ÚopÚoffsetT)ÚparamsÚstreamr   )
Ú_uriÚrequestsÚgetÚ	_responseÚstatus_codeÚhttplibÚOKÚWebHdfsExceptionÚfrom_responserK   )Úselfr   Úpayloads      r   Ú__init__zBufferedInputBase.__init__€   s]   € ØˆŒ	à¨1Ñ-ˆÜ!Ÿ™ d§i¡i¸ÈÔMˆŒØ�>‰>×%Ñ%¬¯©Ò3Ü"×0Ñ0°·±Ó@Ð@Øˆ�	r   c                óV   — t         j                  d«       | j                  sd| _        yy)zFlush and close this stream.zclose: calledN)ÚloggerÚdebugÚclosedrK   ©r[   s    r   ÚclosezBufferedInputBase.closeŒ   s!   € ä�‰�_Ô%Ø�{Š{ØˆD�Ið r   c                ó   — | j                   du S )ú$Return True if the stream is closed.N)rK   rb   s    r   ra   zBufferedInputBase.closed’   s   € ð �y‰y˜DÐ Ð r   c                 ó   — y)z+Return True if the stream can be read from.Tr   rb   s    r   ÚreadablezBufferedInputBase.readable—   ó   € àr   c                 ó   — y)z:Return False; the WebHDFS reader does not support seeking.Fr   rb   s    r   ÚseekablezBufferedInputBase.seekable›   s   € àr   c                ó"   — t         j                  ‚)úUnsupported.©ÚioÚUnsupportedOperationrb   s    r   ÚdetachzBufferedInputBase.detach¢   s   € ä×%Ñ%Ð%r   c                ó  — | j                   }|€J ‚|�|dk  r1d|| j                  j                  j                  «       z   c| _         }|S |t	        |«      k  r||d |d| c| _         }|S |g}	 d}||k  rg| j                  j                  j                  t
        j                  «      }t	        |«      dk(  rn%|t	        |«      z  }|j                  |«       ||k  rŒgdj                  |«      }||d |d| c| _         }|S # t        $ r Y Œ.w xY w)zCRead up to `size` bytes (or all remaining bytes if `size` is None).Nr   r   )
rK   rU   ÚrawÚreadÚlenrn   ÚDEFAULT_BUFFER_SIZEÚappendÚStopIterationÚjoin)r[   ÚsizeÚbufÚretvalÚbuffersÚ
total_readÚraw_dataÚmergeds           r   rs   zBufferedInputBase.read¦   s&  € à�i‰iˆØˆÐˆØˆ<˜4 !š8Ø # S¨4¯>©>×+=Ñ+=×+BÑ+BÓ+DÑ%DÐˆDŒI�vØˆMØ”#�c“(Š?Ø # D E 
¨C°°¨JÐˆDŒI�vØˆMà�%ˆð	ØˆJØ˜tÒ#ØŸ>™>×-Ñ-×2Ñ2´2×3IÑ3IÓJ�ô �x“= AÒ%Øàœc (›mÑ+�
Ø—‘˜xÔ(ð ˜tÓ#ð —‘˜'Ó"ˆØ" 4 5˜M¨6°%°4¨=ÐˆŒ	�6Øˆøô ò 	Ùð	ús   Á-A-C> Ã>	D
Ä	D
c                ó&   — | j                  |¬«      S )zThis is the same as read().)ry   )rs   )r[   ry   s     r   Úread1zBufferedInputBase.read1Ä   s   € à�y‰y˜dˆyÓ#Ð#r   c                ó¢   — t        |«      j                  d«      }| j                  t        |«      «      }|sy||dt        |«       t        |«      S )zIRead up to ``len(b)`` bytes into `b` and return the number of bytes read.ÚBr   N)Ú
memoryviewÚcastrs   rt   )r[   ÚbÚmvÚdatas       r   ÚreadintozBufferedInputBase.readintoÈ   sG   € ä˜‹]×Ñ Ó$ˆØ�y‰yœ˜R›Ó!ˆÙØØˆˆ;ŒS�‹YˆÜ�4‹yÐr   c                ó„   — | j                   }|€J ‚d|| j                  j                  j                  «       z   c| _         }|S )z1Read and return one line from the WebHDFS stream.r   )rK   rU   rr   Úreadline)r[   rz   r{   s      r   r‹   zBufferedInputBase.readlineÑ   s@   € à�i‰iˆØˆÐˆØ  t§~¡~×'9Ñ'9×'BÑ'BÓ'DÑ!DÐˆŒ	�6Øˆr   )r   r   ÚreturnÚNone©rŒ   r�   ©rŒ   Úbool©rŒ   zio.RawIOBase©N)ry   ú
int | NonerŒ   Úbytes)r(   )r†   r	   rŒ   Úint)rŒ   r”   )r   r   r   Ú__doc__r   rK   r]   rc   Úpropertyra   rg   rj   rp   rs   r�   r‰   r‹   r   r   r   r,   r,   z   sU   … ÙQà
ƒIØ€Dˆ,Óóóð ò!ó ð!óóó&ôô<$óôr   r,   c                  ób   — e Zd ZU dZded<   efdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zedd
„«       Zy)r.   a\  Writes bytes to a WebHDFS file in multipart chunks.

    Args:
        uri: The HTTP WebHDFS REST URL to write to.
        min_part_size: The minimum part size for multipart uploads.
            For writing only.

    Raises:
        WebHdfsException: If the WebHDFS server returns an unexpected status
            code when creating the file.
    r   r1   c                óÎ  — || _         d| _        || _        dddœ}t        j                  | j                   |d¬«      }|j
                  t        j                  k(  st        j                  |«      ‚|j                  d   }t        j                  |ddd	i¬
«      }|j
                  t        j                  k(  st        j                  |«      ‚g | _        d| _        d| _        d| _        y )NFÚCREATET)rN   Ú	overwrite©rP   Úallow_redirectsÚlocationr6   úcontent-typeúapplication/octet-stream©rˆ   Úheadersr   )rR   Ú_closedr&   rS   ÚputrV   rW   ÚTEMPORARY_REDIRECTrY   rZ   r¢   ÚCREATEDÚlinesÚpartsÚchunk_bytesÚ
total_size)r[   r   r&   r\   Úinit_responseÚresponses         r   r]   zBufferedOutputBase.__init__è   sÆ   € ØˆŒ	ØˆŒØ*ˆÔà!°Ñ5ˆÜ Ÿ™ T§Y¡Y°wÐPUÔVˆØ×(Ñ(¬G×,FÑ,FÒFÜ"×0Ñ0°Ó?Ð?Ø×#Ñ# JÑ/ˆÜ—<‘< ¨"°~ÐGaÐ6bÔcˆØ×#Ñ#¤w§¡Ò6Ü"×0Ñ0°Ó:Ð:Ø"$ˆŒ
ØˆŒ
ØˆÔØˆ�r   c                 ó   — y)z+Return True if the stream supports writing.Tr   rb   s    r   ÚwritablezBufferedOutputBase.writableý   rh   r   c                ó0   — d}t        j                  |«      ‚)rl   zdetach() not supportedrm   )r[   r4   s     r   rp   zBufferedOutputBase.detach  s   € à&ˆÜ×%Ñ% cÓ*Ð*r   c                ój  — ddi}t        j                  | j                  |d¬«      }|j                  t        j
                  k(  st        j                  |«      ‚|j                  d   }t        j                  ||ddi¬«      }|j                  t        j                  k(  st        j                  |«      ‚y )	NrN   ÚAPPENDFrœ   rž   rŸ   r    r¡   )
rS   ÚpostrR   rV   rW   r¥   rY   rZ   r¢   rX   )r[   rˆ   r\   r«   r   r¬   s         r   Ú_uploadzBufferedOutputBase._upload	  s˜   € Ø˜Ð"ˆÜ Ÿ™ d§i¡i¸ÐQVÔWˆØ×(Ñ(¬G×,FÑ,FÒFÜ"×0Ñ0°Ó?Ð?Ø×#Ñ# JÑ/ˆÜ—=‘= ¨4¸.ÐJdÐ9eÔfˆØ×#Ñ#¤w§z¡zÒ1Ü"×0Ñ0°Ó:Ð:ð 2r   c                ó´  — | j                   rd}t        |«      ‚t        |t        «      sd}t	        |«      ‚| j
                  j                  |«       | xj                  t        |«      z  c_        | xj                  t        |«      z  c_	        | j                  | j                  k\  r¨dj                  | j
                  «      }t        j                  d| j                  t        |«      | j                  dz  «       | j                  |«       t        j!                  d| j                  «       | xj                  dz  c_        g dc| _        | _        t        |«      S )	zMWrite the given bytes (binary string) into the WebHDFS file from constructor.zI/O operation on closed filezinput must be a binary stringr   z+uploading part #%i, %i bytes (total %.3fGB)ç      ÐAzupload of part #%i finishedé   r   )r£   Ú
ValueErrorÚ
isinstancer”   Ú	TypeErrorr§   rv   r©   rt   rª   r&   rx   r_   Úinfor¨   r³   r`   )r[   r†   r4   Úbuffs       r   ÚwritezBufferedOutputBase.write  s  € à�<Š<Ø0ˆCÜ˜S“/Ð!ä˜!œUÔ#Ø1ˆCÜ˜C“.Ð à�
‰
×Ñ˜!ÔØ×ÒœC ›FÑ"ÕØ�Šœ3˜q›6Ñ!�à×Ñ˜t×1Ñ1Ò1Ø—8‘8˜DŸJ™JÓ'ˆDÜ�K‰KØ=Ø—
‘
Ü�D“	Ø—‘ )Ñ+ô	ð �L‰L˜ÔÜ�L‰LÐ6¸¿
¹
ÔCØ�JŠJ˜!‰O�JØ+-¨qÐ(ˆDŒJ˜Ô(ä�1‹vˆr   c                ó  — dj                  | j                  «      }|rit        j                  d| j                  t        |«      | j                  dz  «       | j                  |«       t        j                  d| j                  «       d| _	        y)zCFlush any remaining buffered bytes to WebHDFS and close the stream.r   z0uploading last part #%i, %i bytes (total %.3fGB)rµ   z upload of last part #%i finishedTN)
rx   r§   r_   rº   r¨   rt   rª   r³   r`   r£   )r[   r»   s     r   rc   zBufferedOutputBase.close0  sh   € à�x‰x˜Ÿ
™
Ó#ˆÙÜ�K‰KØBØ—
‘
Ü�D“	Ø—‘ )Ñ+ô	ð �L‰L˜ÔÜ�L‰LÐ;¸T¿Z¹ZÔHØˆ�r   c                ó   — | j                   S )re   )r£   rb   s    r   ra   zBufferedOutputBase.closed>  s   € ð �|‰|Ðr   N)r   r   r&   r•   rŒ   r�   r�   r‘   )rˆ   r”   rŒ   r�   )r†   r   rŒ   r•   rŽ   )r   r   r   r–   r   ÚMIN_PART_SIZEr]   r®   rp   r³   r¼   rc   r—   ra   r   r   r   r.   r.   Ù   sC   … ñ
ð ƒIà6Cô ó*ó+ó
;óó:ð òó ñr   r.   c                  ó@   ‡ — e Zd ZdZddˆ fd„Zdd„Zedd„«       Zˆ xZS )	rY   zEException raised when WebHDFS returns an unexpected HTTP status code.c                óR   •— || _         || _        t        ‰| �  t	        | «      «       y r’   )r4   rV   Úsuperr]   Úrepr)r[   r4   rV   Ú	__class__s      €r   r]   zWebHdfsException.__init__G  s#   ø€ ØˆŒØ&ˆÔÜ‰Ñœ˜d›Õ$r   c                óh   — | j                   j                  › d| j                  › d| j                  ›d�S )z6Return an unambiguous representation of the exception.z(status_code=z, msg=ú))rÄ   r   rV   r4   rb   s    r   Ú__repr__zWebHdfsException.__repr__L  s5   € à—.‘.×)Ñ)Ð*¨-¸×8HÑ8HÐ7IÈÐPT×PXÑPXÈ|Ð[\Ð]Ð]r   c                ó>   —  | |j                   |j                  ¬«      S )z=Build a `WebHdfsException` from a failed `requests.Response`.)r4   rV   )ÚtextrV   )Úclsr¬   s     r   rZ   zWebHdfsException.from_responseP  s   € ñ �x—}‘}°(×2FÑ2FÔGÐGr   )r6   N)r4   r   rV   r“   rŒ   r�   )rŒ   r   )r¬   zrequests.ResponserŒ   rY   )	r   r   r   r–   r]   rÇ   ÚclassmethodrZ   Ú__classcell__)rÄ   s   @r   rY   rY   D  s'   ø„ ÙOö%ó
^ð òHó ôHr   rY   )r   r   rŒ   r   )r   r   r!   r   r"   r
   rŒ   ú&BufferedInputBase | BufferedOutputBase)r2   r   r!   r   r&   r•   rŒ   rÍ   )rD   r   rŒ   r   )rH   r   rŒ   r   )*r–   Ú
__future__r   Úhttp.clientÚclientrW   rn   ÚloggingÚurllib.parser:   Útypingr   r   r   rS   ÚImportErrorÚMISSING_DEPSÚsmart_open.utilsr   r   Ú	_typeshedr   r	   Úsmart_open._typingr
   Ú	getLoggerr   r_   r   ÚURI_EXAMPLESr¿   r   r   r$   r    r*   rI   ÚBufferedIOBaser,   r.   Ú	ExceptionrY   r   r   r   ú<module>rÝ      s  ðñõ #å Û 	Û Û ß 0Ñ 0ðÛó Ý  áß9å2à	ˆ×	Ñ	˜8Ó	$€à	€à1€à€ô�)ô ó
1ð
%Ø	ð%Øð%Ø+:ð%à+ó%ð 4AðØðØðØ-0ðà+óó@`ó.0ô
\˜×)Ñ)ô \ô~h˜×*Ñ*ô hôVH�yõ HøðY	 ò Ø‚Lðús   ¦C ÃCÃC