
    =[j?              	         d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
mZmZ ddlmZmZmZ ddlmZ ddlmZmZ dd	lmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&  ej'        e(          Z) ed
e ee"ee&e          Z*e
d         Z+ee,e,ee-gdf         Z.dZ/ddZ0 G d de1          Z2 G d de1          Z3 G d de1          Z4 G d d          Z5 G d d          Z6g dZ7dS )z)Reusable typed CloudKit container client.    )annotationsN)CallableDictIterableIteratorListLiteralOptionalTypeVar)	urlencodeurlsplit
urlunsplit)ValidationError   )CloudKitExtraMode!resolve_cloudkit_validation_extra)CKDatabaseChangesResponseCKLookupDescriptorCKLookupRequestCKLookupResponseCKModifyOperationCKModifyRequestCKModifyResponseCKQueryObjectCKQueryRequestCKQueryResponseCKZoneChangesRequestCKZoneChangesResponseCKZoneChangesZoneCKZoneChangesZoneReqCKZoneIDReqCKZoneListResponse_ResponseModelT)pythonlowerzHTTP 429: rate limitedurlstrreturnc                f    t          |           }t          |j        |j        |j        ddf          S )z<Return a CloudKit URL without query parameters or fragments. )r   r   schemenetlocpath)r&   partss     g/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/pyicloud/common/cloudkit/client.pyredact_cloudkit_urlr0   0   s,    SMMEu|U\5:r2FGGG    c                      e Zd ZdZdS )CloudKitAuthErrorzGRaised when Apple rejects a CloudKit request due to auth/session state.N)__name__
__module____qualname____doc__ r1   r/   r3   r3   6   s        QQQQr1   r3   c                  *     e Zd ZdZddd fd
Z xZS )CloudKitRateLimitedz1Raised when Apple rate-limits a CloudKit request.Nretry_aftermessager'   r<   float | Noner(   Nonec               X    t                                          |           || _        d S N)super__init__r<   )selfr=   r<   	__class__s      r/   rC   zCloudKitRateLimited.__init__=   s)    !!!&r1   )r=   r'   r<   r>   r(   r?   r4   r5   r6   r7   rC   __classcell__rE   s   @r/   r:   r:   :   sP        ;;DH ' ' ' ' ' ' ' ' ' ' ' 'r1   r:   c                  *     e Zd ZdZddd	 fdZ xZS )
CloudKitApiErrorzCRaised for transport, validation, or server-side CloudKit failures.Npayloadr=   r'   r(   r?   c               X    t                                          |           || _        d S rA   )rB   rC   rL   )rD   r=   rL   rE   s      r/   rC   zCloudKitApiError.__init__E   s&    !!!r1   )r=   r'   r(   r?   rF   rH   s   @r/   rJ   rJ   B   sP        MM04            r1   rJ   c                      e Zd ZdZdZddddddd0dZeddd1d            Zd2dZd3dZ	d4d#Z
dd$d5d'Zd6d)Zd*d+d7d/ZdS )8_CloudKitHTTPzBMinimal HTTP transport shared by typed CloudKit container clients.)g      $@g      N@Nr$   FTtimeoutbool_param_styleredact_urls
debug_hookhandle_rate_limitsbase_urlr'   base_paramsDict[str, object]rQ   tuple[float, float] | NonerR   CloudKitBoolParamStylerS   boolrT   CloudKitDebugHook | NonerU   c                   |                     d          | _        || _        |                     |pi |          | _        |p| j        | _        || _        || _        || _	        d S )N/rR   )
rstrip	_base_url_session_normalize_params_params_REQUEST_TIMEOUT_timeout_redact_urls_debug_hook_handle_rate_limits)	rD   rV   sessionrW   rQ   rR   rS   rT   rU   s	            r/   rC   z_CloudKitHTTP.__init__O   st     "----20@ . 
 
  84#8'%#5   r1   r_   paramsr(   Dict[str, str]c                   i }|                                  D ]<\  }}t          |t                    r|dk    r
|rdnd||<   *t          |          ||<   =|S )Nr%   truefalse)items
isinstancer[   r'   )rk   rR   outkeyvalues        r/   rc   z_CloudKitHTTP._normalize_paramse   sk     ! ,,.. 	& 	&JC%&& &+;w+F+F%*766Cu::C
r1   r-   c                T    t          | j                  }| j         | |rd| ndz   S )N?r*   )r   rd   ra   )rD   r-   qs      r/   	build_urlz_CloudKitHTTP.build_urls   s8    dl##.($((q,@GGGGbAAr1   r&   c                2    | j         rt          |          S |S rA   )rg   r0   rD   r&   s     r/   _display_urlz_CloudKitHTTP._display_urlw   s      	,&s+++
r1   oprL   r   r?   c                    | j         d S 	 |                      ||||           d S # t          $ r! t                              d|d           Y d S w xY w)Nz!CloudKit debug hook failed for %sT)exc_info)rh   	ExceptionLOGGERdebug)rD   r|   r&   rL   responses        r/   _run_debug_hookz_CloudKitHTTP._run_debug_hook|   sw    #F	QRgx88888 	Q 	Q 	QLL<b4LPPPPPP	Qs   % 'AA)headersr   Dict | Nonec          	     H   |                      |          }|                    d          }| j        r|                     |          n|}t                              d|           || j        d}|||d<    | j        j        |fi |}t          |dd          }	t          |	t                    sd}	|	dv r+|                     ||||           t          d	|	 d
          |	dk    rv| j        ro|                     ||||           d }
	 |j                            d          }|rt#          |          }
n# t$          $ r d }
Y nw xY wt'          t(          |
          |	dk    rc|                     ||||           	 |                                }n!# t$          $ r t          |dd           }Y nw xY wt-          d	|	 |          	 |                                S # t$          $ r>}|                     ||||           t-          dt          |dd                     |d }~ww xY w)Nr^   zCloudKit POST %s)jsonrQ   r   status_coder      i  i  HTTP : unauthorized  Retry-Afterr;     textrK   zInvalid JSON response)rx   striprg   r{   r   r   rf   rb   postgetattrrq   intr   r3   ri   r   getfloatr   r:   _RATE_LIMITEDr   rJ   )rD   r-   rL   r   r&   r|   display_urlkwargsrespcoder<   hdrbodyexcs                 r/   r   z_CloudKitHTTP.post   s   nnT""ZZ__040AKd'',,,t'555!dm<< 'F9!t}!
 

 
 t]A..$$$ 	D:  S'4888#$@D$@$@$@AAA3;;43;  S'4888K#l&&}55 -"'**K # # #"#%mMMMM3;;  S'48883yy{{ 3 3 3tVT223">4>>4@@@@	99;; 	 	 	  S'4888"'fd33   	s<   +D3 3EE:F F-,F-G 
H!#9HH!bytesc                   t                               d           | j                            || j                  }t          |dd          }t          |t                    sd}|dv r+|                     d|i |           t          d| d	          |d
k    rv| j
        ro|                     d|i |           d }	 |j                            d          }|rt          |          }n# t          $ r d }Y nw xY wt          t          |          |dk    r<|                     d|i |           t!          d| dt          |dd                     t          |dd           }t          |t"                    r|S t          |dd           }t          |t$                    r|                    d          S t!          d|          )NzCloudKit asset GET <redacted>)rQ   r   r   r   r   	asset_getr   r   r   r   r;   r    on asset GETr   rK   contentzutf-8zInvalid asset response)r   r   rb   r   rf   r   rq   r   r   r3   ri   r   r   r   r:   r   rJ   r   r'   encode)rD   r&   r   r   r<   r   r   r   s           r/   	get_bytesz_CloudKitHTTP.get_bytes   s   4555}  dm <<t]A..$$$ 	D:  c2t<<<#$@D$@$@$@AAA3;;43;  c2t<<<K#l&&}55 -"'**K # # #"#%mMMMM3;;  c2t<<<"++++fd33    $	400gu%% 	NtVT**dC   	(;;w'''7FFFFs   ;+C' 'C65C6   
chunk_sizer   r   Iterator[bytes]c             #    K   t                               d|                     |                     | j                            |d| j                  }	 t          |dd          }t          |t                    sd}|dv r+| 	                    d|i |           t          d	| d
          |dk    rv| j        ro| 	                    d|i |           d }	 |j                            d          }|rt          |          }n# t          $ r d }Y nw xY wt          t           |          |dk    r<| 	                    d|i |           t#          d	| dt          |dd                     |                    |          D ]}|r|V  		 t          |dd           }t'          |          r	  |             d S # t          $ r Y d S w xY wd S # t          |dd           }t'          |          r	  |             w # t          $ r Y w w xY ww xY w)NzCloudKit asset stream GET %sT)streamrQ   r   r   r   r   r   r   r   r   r   r;   r   r   r   rK   r   close)r   r   r{   rb   r   rf   r   rq   r   r   r3   ri   r   r   r   r:   r   rJ   iter_contentcallable)	rD   r&   r   r   r   r<   r   chunkr   s	            r/   
get_streamz_CloudKitHTTP.get_stream   s     3T5F5Fs5K5KLLL}  T4= II 	422DdC(( z!!$$[#r4@@@'(D(D(D(DEEEs{{t7{$$[#r4@@@"',**=99C 1&+Cjj  ' ' '"&KKK')-[QQQQs{{$$[#r4@@@&/D///#D&$77    **j*AA      KKK  D'400E EGGGGG    DD  D'400E EGGGG    Dsh   A>G	 +C? >G	 ?DG	 DA:G	 *
F6 6
GG	!H+
G65H6
H HHH)rV   r'   rW   rX   rQ   rY   rR   rZ   rS   r[   rT   r\   rU   r[   )rk   rX   rR   rZ   r(   rl   )r-   r'   r(   r'   r&   r'   r(   r'   )r|   r'   r&   r'   rL   r   r(   r?   )r-   r'   rL   r   r   r   r(   r   r&   r'   r(   r   r&   r'   r   r   r(   r   )r4   r5   r6   r7   re   rC   staticmethodrc   rx   r{   r   r   r   r   r8   r1   r/   rO   rO   J   s$       LL# /33;!/3#'6 6 6 6 6 6,  4<     \B B B B   
Q Q Q Q HL , , , , , ,\G G G GB 9> # # # # # # # #r1   rO   c                      e Zd ZdZddddddddRdZdSdZdddddddTd+Zdd,dUd1Zdd2dVd6Zdd2dWd8Z	dd9dXd?Z
dYdAZddBdZdEZd[dHZdIdJd\dNZdOd2d]dQZdS )^CloudKitContainerClientz?Typed CloudKit client for a single container/environment/scope.Nr$   FT)validation_extrarQ   rR   rS   rT   rU   rV   r'   rW   rX   r   CloudKitExtraMode | NonerQ   rY   rR   rZ   rS   r[   rT   r\   rU   c          
     L    t          ||||||||	          | _        || _        d S )NrP   )rO   _http_validation_extra)
rD   rV   rj   rW   r   rQ   rR   rS   rT   rU   s
             r/   rC   z CloudKitContainerClient.__init__   sB     #-#!1	
 	
 	

 "2r1   	model_clstype[_ResponseModelT]datar   r(   r#   c                T    |                     |t          | j                            S )N)extra)model_validater   r   )rD   r   r   s      r/   _validate_responsez*CloudKitContainerClient._validate_response  s2    
 ''3D4JKK ( 
 
 	
r1   )zone_iddesired_keysresults_limitcontinuation	zone_widequeryr   r   Optional[CKZoneIDReq]r   Optional[List[str]]r   Optional[int]r   Optional[str]r   r   c               `   |r|t          d          |s|t          d          t          ||||||r|nd                               dd          }| j                            d|          }	 |                     t          |          S # t          $ r}	t          d|	          |	d }	~	ww xY w)
Nz+zone_id must be omitted when zone_wide=Truez)zone_id is required unless zone_wide=True)r   zoneIDdesiredKeysresultsLimitcontinuationMarkerzoneWider   Tmodeexclude_none/records/queryz Query response validation failedrK   )	
ValueErrorr   
model_dumpr   r   r   r   r   rJ   )
rD   r   r   r   r   r   r   rL   r   r   s
             r/   r   zCloudKitContainerClient.query  s      	L,JKKK 	JW_HIII $&+"+5YY
 
 
 *&t*
4
4 	 z/99	**?DAAA 	 	 	"2   	s   1B 
B-B((B-)r   record_namesIterable[str]r!   r   c                  t          d |D             ||                              dd          }| j                            d|          }	 |                     t
          |          S # t          $ r}t          d|          |d }~ww xY w)	Nc                H    g | ]}t          t          |                      S ))
recordName)r   r'   ).0names     r/   
<listcomp>z2CloudKitContainerClient.lookup.<locals>.<listcomp>F  s*    WWW$'3t99===WWWr1   )recordsr   r   r   Tr   z/records/lookupz!Lookup response validation failedrK   )r   r   r   r   r   r   r   rJ   )rD   r   r   r   rL   r   r   s          r/   lookupzCloudKitContainerClient.lookup>  s     "WW,WWW$
 
 
 *&t*
4
4	 	
 z0'::	**+;TBBB 	 	 	"3   	s   A) )
B
3BB
)r   zone_reqr    Iterator[CKZoneChangesZone]c             #    K   t          |g|          }	 |                    dd          }| j                            d|          }	 |                     t
          |          }n$# t          $ r}t          d|          |d }~ww xY w|j        r|j        d         nd }|d S |V  |j	        sd S |j
        |j        d         _
        )	Nzonesr   Tr   r   /changes/zone"Changes response validation failedrK   r   )r   r   r   r   r   r   r   rJ   r   
moreComing	syncToken)	rD   r   r   reqrL   r   enveloper   zones	            r/   iter_changesz$CloudKitContainerClient.iter_changesS  s      #*&
 
 
	4nn&tnDDG:???G<<D223H$OO"   &8    
 )1@8>!$$DD|JJJ? %)^CIaL"!	4s   	A% %
B/BBr   c                  t          |g|                              dd          }| j                            d|          }	 |                     t
          |          S # t          $ r}t          d|          |d }~ww xY w)Nr   r   Tr   r   r   rK   )r   r   r   r   r   r   r   rJ   )rD   r   r   rL   r   r   s         r/   changeszCloudKitContainerClient.changeso  s     '*&
 
 
 *&t*
4
4 	 z88	**+@$GGG 	 	 	"4   	   A 
B )A;;B )atomic
operationsList[CKModifyOperation]r   Optional[bool]r   c                  t          |||                              dd          }| j                            d|          }	 |                     t
          |          S # t          $ r}t          d|          |d }~ww xY w)N)r   r   r   r   Tr   z/records/modifyz!Modify response validation failedrK   )r   r   r   r   r   r   r   rJ   )rD   r   r   r   rL   r   r   s          r/   modifyzCloudKitContainerClient.modify  s     "!
 
 
 *&t*
4
4	 	
 z0'::	**+;TBBB 	 	 	"3   	r   r"   c                    | j                             di           }	 |                     t          |          S # t          $ r}t          d|          |d }~ww xY w)Nz/zones/listz%Zones list response validation failedrK   )r   r   r   r"   r   rJ   )rD   r   r   s      r/   
zones_listz"CloudKitContainerClient.zones_list  st    z}b11	**+=tDDD 	 	 	"7   	s   8 
AAA)
sync_tokenr   r   c                   i }|r||d<   | j                             d|          }	 |                     t          |          S # t          $ r}t          d|          |d }~ww xY w)Nr   z/changes/databasez+Database changes response validation failedrK   )r   r   r   r   r   rJ   )rD   r   rL   r   r   s        r/   database_changesz(CloudKitContainerClient.database_changes  s    
  	.#-GK z2G<<	**+DdKKK 	 	 	"=   	s   A 
A"AA"r&   r   c                6    | j                             |          S rA   )r   r   rz   s     r/   download_asset_bytesz,CloudKitContainerClient.download_asset_bytes  s    z##C(((r1   r   r   r   r   r   c             #  N   K   | j                             ||          E d {V  d S )Nr   )r   r   )rD   r&   r   s      r/   download_asset_streamz-CloudKitContainerClient.download_asset_stream  s;       :(((DDDDDDDDDDDr1   r   
str | Nonec               V   t          |||                              dd          }| j                            d|          }	 |                     t
          |          }n$# t          $ r}t          d|          |d }~ww xY wt          |dd           rt          |j
                  S d S )	N)r   r   r   r   Tr   r   z+Sync token query response validation failedrK   r   )r   r   r   r   r   r   r   rJ   r   r'   r   )rD   r   r   r   rL   r   r   r   s           r/   query_sync_tokenz(CloudKitContainerClient.query_sync_token  s     !&
 
 
 *&t*
4
4	 	
 z/99	..EEHH 	 	 	"=   	
 8[$// 	+x)***ts   A   
B*A<<B)rV   r'   rW   rX   r   r   rQ   rY   rR   rZ   rS   r[   rT   r\   rU   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   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  )r4   r5   r6   r7   rC   r   r   r   r   r   r   r   r   r   r  r  r8   r1   r/   r   r      s       II 6:.23;!/3#'2 2 2 2 2 22
 
 
 
 *.,0'+&*     H -1     2 (,	4 4 4 4 4 4@ (,	     0 "&     *    %)     ") ) ) )  	E E E E E E        r1   r   )rJ   r3   r   r:   r0   r   )8r7   
__future__r   loggingtypingr   r   r   r   r   r	   r
   r   urllib.parser   r   r   pydanticr   baser   r   modelsr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   	getLoggerr4   r   r#   rZ   r'   objectCloudKitDebugHookr   r0   r   r3   r:   rJ   rO   r   __all__r8   r1   r/   <module>r     s   / / " " " " " "  W W W W W W W W W W W W W W W W W W W W 8 8 8 8 8 8 8 8 8 8 $ $ $ $ $ $ F F F F F F F F                                   & 
	8	$	$'  !!23 c3f5t;< (H H H HR R R R R	 R R R' ' ' ' ') ' ' '    y   l l l l l l l l^Z Z Z Z Z Z Z Zz  r1   