
    Ii/                        S SK r S SKrS SKrS SKJr  S SKJrJr  S SKJr  S SK	J
r
JrJrJrJrJrJrJr  S SKJrJr  S SKJr  S SKJrJr  S S	KJr  S S
KJr  S SKJrJ r   SSK!J"r"J#r#J$r$J%r%  SSK&J'r'J(r(J)r)J*r*J+r+J,r,J-r-  SSK.J/r/J0r0J1r1  \Rd                  " S5      r3\ " S S5      5       r4\
(       a  \\5   r6O\r6 " S S\65      r7 S"S SS\"\#S.S\\4   S\8S\\+   S\\'   S\9S\8S\74S jjjr:SSS \\9/\4   SS4S! jr;g)#    N)	dataclass)datetime	timedelta)
attrgetter)TYPE_CHECKINGAnyCallableListOptionalTupleUnioncast)parse_qsurlparse)uuid4)ConnectionPoolRedis)Retry)Sentinel)
RedisError
WatchError   )default_queue_nameexpires_extra_msjob_key_prefixresult_key_prefix)DeserializerJobJobDef	JobResult
Serializerdeserialize_jobserialize_job)timestamp_msto_ms
to_unix_mszarq.connectionsc                      \ rS rSr% SrSr\\\\	\\
4      4   \S'   Sr\
\S'   Sr\\   \S'   S	r\
\S
'   Sr\\   \S'   Sr\\   \S'   Sr\\S'   Sr\\   \S'   Sr\\   \S'   Sr\\S'   Sr\\   \S'   Sr\\   \S'   Sr\\S'   Sr\
\S'   Sr\
\S'   Sr\
\S'   Sr\\
   \S'   Sr\\S'   Sr\\S'   Sr \\S'   Sr!\\\"      \S '   Sr#\\$   \S!'   \%S"\S#S 4S$ j5       r&S#\4S% jr'S&r(g)'RedisSettings   z
No-Op class used to hold redis connection redis_settings.

Used by :func:`arq.connections.create_pool` and :class:`arq.worker.Worker`.
	localhosthost  portNunix_socket_pathr   databaseusernamepasswordFsslssl_keyfilessl_certfilerequiredssl_cert_reqsssl_ca_certsssl_ca_datassl_check_hostnamer   conn_timeout   conn_retriesconn_retry_delaymax_connectionssentinelmymastersentinel_masterretry_on_timeoutretry_on_errorretrydsnreturnc           
      >   [        U5      nUR                  S;  a  [        S5      e[        UR                  5      R                  S5      nU(       a  [        US   5      nOJUR                  S:w  a8  UR                  (       a$  [        UR                  R                  S5      5      OSnOSn[        UR                  =(       d    SUR                  =(       d    SUR                  S	:H  UR                  UR                  UUR                  S:X  a  UR                  S
9$ S S
9$ )N>   unixredisredisszinvalid DSN schemedbr   rH   /r*   r,   rJ   )r+   r-   r2   r0   r1   r/   r.   )r   schemeRuntimeErrorr   querygetintpathlstripr(   hostnamer-   r0   r1   )clsrE   confquery_dbr/   s        5/venv/lib/python3.13/site-packages/arq/connections.pyfrom_dsnRedisSettings.from_dsn8   s    };;99344DJJ'++D18A;'H[[F"59YYs499++C01AHH-+"dx']]]]*.++*?TYY
 	
 FJ
 	
    c                     SR                  SR                  S U R                  R                  5        5       5      5      $ )NzRedisSettings({})z, c              3   6   #    U  H  u  pU S U< 3v   M     g7f)=N ).0kvs      rX   	<genexpr>)RedisSettings.__repr__.<locals>.<genexpr>P   s     3cMbTQqc1%LMbs   )formatjoin__dict__items)selfs    rX   __repr__RedisSettings.__repr__O   s/    "))$))3cT]]M`M`Mb3c*cddr[   r_   ))__name__
__module____qualname____firstlineno____doc__r+   r   strr
   r   rQ   __annotations__r-   r.   r   r/   r0   r1   r2   boolr3   r4   r6   r7   r8   r9   r:   r<   r=   r>   r?   rA   rB   rC   	ExceptionrD   r   classmethodrY   rj   __static_attributes__r_   r[   rX   r(   r(      s[    /:D%T%S/**
+9D#&*hsm*Hc"Hhsm""Hhsm"C!%K#%"&L(3-&#M3#"&L(3-&!%K#%$$L#L#c%)OXc])Hd%OS%"d"04NHT)_-4!E8E?!
3 
? 
 
,e# er[   r(   c                   L  ^  \ rS rSrSrSSS\\4S\\   S\\	   S\\
   S\S\S	\S
S4U 4S jjjrSSSSSSS.S\S\S\\   S\\   S\\   S\S\\\4   S\S\\\4   S\\   S	\S
\\   4S jjrS\S
\4S jrS
\\   4S jrS\S\S
\4S jrSS.S\\   S
\\   4S jjrSrU =r$ ) ArqRedisY   a  
Thin subclass of ``redis.asyncio.Redis`` which adds :func:`arq.connections.enqueue_job`.

:param redis_settings: an instance of ``arq.connections.RedisSettings``.
:param job_serializer: a function that serializes Python objects to bytes, defaults to pickle.dumps
:param job_deserializer: a function that deserializes bytes into Python objects, defaults to pickle.loads
:param default_queue_name: the default queue name to use, defaults to ``arq.queue``.
:param expires_extra_ms: the default length of time from when a job is expected to start
 after which the job expires, defaults to 1 day in ms.
:param kwargs: keyword arguments directly passed to ``redis.asyncio.Redis``.
Npool_or_connjob_serializerjob_deserializerr   r   kwargsrF   c                 l   > X l         X0l        X@l        U(       a  XS'   XPl        [        TU ]  " S0 UD6  g )Nconnection_poolr_   )r{   r|   r   r   super__init__)ri   rz   r{   r|   r   r   r}   	__class__s          rX   r   ArqRedis.__init__f   s9     - 0"4(4$% 0"6"r[   )_job_id_queue_name_defer_until	_defer_by_expires_job_tryfunctionargsr   r   r   r   r   r   c          
        #    Uc  U R                   nU=(       d    [        5       R                  n
[        U
-   nU(       a  U(       a  [	        S5      e[        U5      n[        U5      nU R                  SS9 ISh  vN nUR                  U5      I Sh  vN   UR                  U[        U
-   5      I Sh  vN (       a*  UR                  5       I Sh  vN    SSS5      ISh  vN   g[        5       nUb  [        U5      nOU(       a  X-   nOUnU=(       d    UU-
  U R                  -   n[        XXXR                  S9nUR!                  5         UR#                  XU5        UR%                  X:U05         UR'                  5       I Sh  vN   SSS5      ISh  vN   [+        XX0R,                  S9$  GN7 GN! GN N N N5! [(         a     SSS5      ISh  vN    gf = f NH! , ISh  vN  (       d  f       N]= f7f)a  
Enqueue a job.

:param function: Name of the function to call
:param args: args to pass to the function
:param _job_id: ID of the job, can be used to enforce job uniqueness
:param _queue_name: queue of the job, can be used to create job in different queue
:param _defer_until: datetime at which to run the job
:param _defer_by: duration to wait before running the job
:param _expires: do not start or retry a job after this duration;
    defaults to 24 hours plus deferring time, if any
:param _job_try: useful when re-enqueueing jobs within a job
:param kwargs: any keyword arguments to pass to the function
:return: :class:`arq.jobs.Job` instance or ``None`` if a job with this ID already exists
Nz;use either 'defer_until' or 'defer_by' or neither, not bothTtransaction)
serializer)rI   r   _deserializer)r   r   hexr   rN   r%   pipelinewatchexistsr   resetr$   r&   r   r#   r{   multipsetexzaddexecuter   r   r|   )ri   r   r   r   r   r   r   r   r   r}   job_idjob_keydefer_by_ms
expires_mspipeenqueue_time_msscorejobs                     rX   enqueue_jobArqRedis.enqueue_jobw   s    6 11K'EGKK 6)I\]]I&8_
==T=22d**W%%%[[*;f*DEEEjjl""	 322 +nO'"<0'5'#Vu'>AVAV'VJ/^q^qrCJJLKKS1IIkE?3lln$$+ 322 6;NcNcdd3 3%E" 3* % 1 322,- 3222s   A8G=:F1;G=>G#F4 G#4F75G#F:G#G="F<#G=(BG#5G F>	G G=G!G=4G#7G#:G#<G=>G  
G
G#G=GG=GG#!G=#G:)G,*G:6G=keyc                    #    U[        [        5      S  R                  5       n[        X U R                  S9nUR                  5       I S h  vN nUc  [        SUR                  5        S35      eX$l        U$  N,7f)N)r   job "" not found)lenr   decoder   r|   result_infoKeyErrorr   )ri   r   r   r   rs        rX   _get_job_resultArqRedis._get_job_result   sp     S*+-.557&d.C.CD//##9U3::<.<==	 $s   AA9
A7-A9c                    #    U R                  [        S-   5      I Sh  vN n[        R                  " U Vs/ s H  o R	                  U5      PM     sn6 I Sh  vN n[        U[        S5      S9$  NQs  snf  N7f)z$
Get results for all jobs in redis.
*Nenqueue_time)r   )keysr   asynciogatherr   sortedr   )ri   r   ra   resultss       rX   all_job_resultsArqRedis.all_job_results   sd      YY03677$(O$Q)=)=a)@$(OPPg:n#=>> 8(OPs,   A9A0A9A2A9A7A92A9r   r   c                    #    [         UR                  5       -   nU R                  U5      I S h  vN nUc  [        SU S35      e[	        X@R
                  S9nX%l        UR                  5       Ul        U$  NF7f)Nr   r   )deserializer)r   r   rP   rN   r"   r|   r   r   )ri   r   r   r   rb   jds         rX   _get_job_defArqRedis._get_job_def   sj     v}}.((3-9se;788Q-B-BCMMO		  s   ,A7A5AA7)
queue_namer   c                  #    Uc  U R                   nU R                  USSSS9I Sh  vN n[        R                  " U VVs/ s H   u  p4U R	                  U[        U5      5      PM"     snn6 I Sh  vN $  NMs  snnf  N7f)z;
Get information about queued, mostly useful when testing.
NTr   )
withscoresstartend)r   zranger   r   r   rQ   )ri   r   jobsr   r   s        rX   queued_jobsArqRedis.queued_jobs   sv      00J[[A2[NN^^ae%faeP]PVd&7&7E
&Kae%fggg O%fgs-   %A?A5A?'A7
(A?0A=1A?7A?)r   r   r|   r{   )rl   rm   rn   ro   rp   r   r   r   r   r!   r   rq   rQ   r   r   r   r   floatr   r   r   bytesr    r   r
   r   r   r   r   rv   __classcell__)r   s   @rX   rx   rx   Y   s   
 26/337"4 0#~.# !,# #<0	#
  # # # 
# #* "&%)+/8<7;"&>e>e >e #	>e
 c]>e x(>e sE945>e c5)34>e 3->e >e 
#>e@ 9 ?tI ? s v  @D hx} hV h hr[   rx   )rD   r{   r|   r   r   	settings_rD   r{   r|   r   r   rF   c                  ^	#    U c
  [        5       OU m	[        T	R                  [        5      (       a  T	R                  (       a  [        S5      eT	R                  (       a  S[        S[        S[        4U	4S jjnO[        R                  " [        4T	R                  T	R                  T	R                  T	R                  T	R                  T	R                  T	R                  T	R                   T	R"                  T	R$                  T	R&                  T	R(                  T	R*                  T	R,                  T	R.                  S.6n  U" T	R0                  T	R2                  T	R4                  SS	9nX'l        X7l        XGl        XWl        UR?                  5       I Sh  vN   US
:  a  [@        RC                  S5        U$  N!! [D        [F        [H        [J        RL                  4 a  nUT	RN                  :  a  [@        RQ                  ST	R                  T	R                  URR                  RT                  UT	RN                  U-
  5        [J        RV                  " T	RX                  5      I Sh  vN    US-   n SnAO	e SnAff = fGM9  7f)z
Create a new redis pool, retrying up to ``conn_retries`` times if the connection fails.

Returns a :class:`arq.connections.ArqRedis` instance, thus allowing job enqueuing.
NzJstr provided for 'host' but 'sentinel' is true; list of sentinels expectedr   r}   rF   c                     > [        U TR                  TR                  S.UD6nUR                  TR                  [
        S9n[        [
        U5      $ )N)	sentinelsr2   )redis_class)r   r+   r2   
master_forrA   rx   r   )r   r}   clientrI   settingss       rX   pool_factory!create_pool.<locals>.pool_factory   sR    "--LL 	F %%h&>&>H%UE%((r[   )r+   r-   r.   socket_connect_timeoutr2   r3   r4   r6   r7   r8   r9   rD   rB   rC   r>   utf8)rK   r0   r1   encodingr   zredis connection successfulz;redis connection error %s:%s %s %s, %s retries remaining...r   )-r(   
isinstancer+   rq   r?   rN   r   rx   	functoolspartialr-   r.   r:   r2   r3   r4   r6   r7   r8   r9   rD   rB   rC   r>   r/   r0   r1   r{   r|   r   r   pingloggerinfoConnectionErrorOSErrorr   r   TimeoutErrorr<   warningr   rl   sleepr=   )
r   rD   r{   r|   r   r   r   pooler   s
            @rX   create_poolr      s     2;1Bmo	H(--%%(*;*;ghh	) 	)s 	)x 	) 	) !((
%66#+#8#8 ,,!.."00!.. ,,'::..%66#22$44!
& 	$$x/@/@8K\K\gmD #1$4!&8#$4!))+" qy9:K' *g6J6JK 	x,,,QMMMMKK(())E1 mmH$=$=>>>		 sV   D7I3;AF1 F/F1 I3/F1 1$I-BI(I
I("I3'I((I--I3rI   zRedis[bytes]log_funcc           
        #    U R                  SS9 IS h  vN nUR                  SS9  UR                  SS9  UR                  SS9  UR                  5         UR                  5       I S h  vN u  p4pVS S S 5      IS h  vN   WR	                  SS5      nWR	                  S	S5      nWR	                  S
S5      n	U" SU SU SU	 SW 35        g  N Nd NS! , IS h  vN  (       d  f       Nh= f7f)NFr   Server)sectionMemoryClientsredis_version?used_memory_humanconnected_clientszredis_version=z mem_usage=z clients_connected=z	 db_keys=)r   r   dbsizer   rP   )
rI   r   r   info_serverinfo_memoryinfo_clients	key_countr   	mem_usageclients_connecteds
             rX   log_redis_infor   .  s     ~~%~00D		(	#		(	#		)	$BF,,.<P9, 10  OOOS9M 3S9I$(()<cB
 (K  ./ 0+	 1
 =Q 1000sX   C.CC.AC+C,C3C.>C?AC.CC.C+CC+'C.)N)<r   r   loggingdataclassesr   r   r   operatorr   typingr   r   r	   r
   r   r   r   r   urllib.parser   r   uuidr   redis.asyncior   r   redis.asyncio.retryr   redis.asyncio.sentinelr   redis.exceptionsr   r   	constantsr   r   r   r   r   r   r   r   r    r!   r"   r#   utilsr$   r%   r&   	getLoggerr   r(   r   	BaseRedisrx   rQ   rq   r   r   r_   r[   rX   <module>r     s<      ! (  S S S +  / % + 3 ^ ^ b b b 2 2			,	- 8e 8e 8ev eII@hy @hH *.O +//30,O&O O Z(	O
 |,O O O Od (C5#::N SW r[   