
    #HJj,                       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__     \/Users/ahmed/devFolder/claude-voice/.venv/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/     **41ABF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'DI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 )zConvert 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2I%2F~~Ainn%&&OOE#B,69K9KIL^L^9___<<""FFMINN4RTY[]#^__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-!dii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!    _%{{DI r   c                    | j                   du S )$Return True if the stream is closed.N)rK   rb   s    r   ra   zBufferedInputBase.closed   s     yyD  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&   ii<4!8 #S4>>+=+=+B+B+D%DDIvM#c(? #DE
CJDIvM%	Jt#>>--2223I3IJ x=A%c(m+
x( t# '""45M6%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    yydy##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    ]$yyR!;SY4y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@    ii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 TYYwPUV((G,F,FF"00??##J/<<"~Ga6b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    " diiQVW((G,F,FF"00??##J/==4.Jd9ef##wzz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\  rd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   <<0CS/!!U#1CC. 

!CF"3q6!t11188DJJ'DKK=

D	)+	 LLLL6

CJJ!OJ+-q(DJ(1v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    xx

#KKB

D	)+	 LLLL;TZZ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    
 I6C *+
;:  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    ..))*-8H8H7IPTPXPX|[\]]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}}(2F2F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