
    ]j;                     p   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
mZmZ d dlmZmZ d dlmZ d dlmZmZ d dlZd d	lmZ d d
lmZ d dlmZmZmZmZmZm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*  eejV                  d      Z, eejV                  d      Z- eejV                  d      Z.d Z/efdZ0d Z1d Z2d Z3defdZ4defdZ5defdZ6d Z7d Z8 G d de	      Z9d  Z:d! Z;d" Z<d# Z=d$ Z> G d% d&      Z? ej                  d'd(d)d*+       ej                  d,d-d.d/+       ej                  d0d1d2e d34       ej                  d5d6d7ed84       ej                  d9d:ed;4       ej                  d<d=ed>4       ej                  d?d@dAgdBdCD       ej                  dEdFedGH      gZAdI ZBy)J    N)literal_eval)datetime	timedelta)Enum)partialupdate_wrapper)JSONDecodeErrorloads)get_terminal_size)Typecast)Redis)Sentinel)DEFAULT_CONNECTION_CLASSDEFAULT_DEATH_PENALTY_CLASSDEFAULT_JOB_CLASSDEFAULT_QUEUE_CLASSDEFAULT_SERIALIZER_CLASSDEFAULT_WORKER_CLASS)setup_loghandlers)import_attributeimport_job_classimport_worker_classnowparse_timeout)WorkerStatusred)fggreenyellowc                     t        j                  |       }t        |j                  j	                         D cg c]  \  }}|j                         |k(  s||f c}}      S c c}}w )z?Reads all UPPERCASE variables defined in the given module file.)	importlibimport_moduledict__dict__itemsupper)modulesettingskvs       8/root/env/lib/python3.12/site-packages/rq/cli/helpers.pyread_config_filer-   "   sN    &&v.HH$5$5$;$;$=PDAqa!QPQQPs   A"
A"
c                 :   | j                  d      |j                  | d         S | j                  d      | d   j                  ddg      }| d   j                  dd      }| d   j                  dd	      | d   j                  d
d      | d   j                  dd      | d   j                  dd      | d   j                  dd      d}|j                  | d   j                  di              | d   j                  di       }t        |fd|i|}|j	                  |      S | j                  dd      }t        |t              r5|j                         dv rd}n |j                         dv rd}nt        d      | j                  dd      | j                  dd      | j                  dd	      | j                  dd      || j                  dd      | j                  dd       | j                  d!d      | j                  d"d      | j                  d#d      d$
} |d%i |S )&aB  Returns a StrictRedis instance from a dictionary of settings.
    To use redis sentinel, you must specify a dictionary in the configuration file.
    Example of a dictionary with keys without values:
    SENTINEL = {'INSTANCES':, 'SOCKET_TIMEOUT':, 'USERNAME':, 'PASSWORD':, 'DB':, 'MASTER_NAME':, 'SENTINEL_KWARGS':}
    	REDIS_URLNSENTINEL	INSTANCES)	localhostig  MASTER_NAMEmymasterDBr   USERNAMEPASSWORDSOCKET_TIMEOUTSSLF)dbusernamepasswordsocket_timeoutsslCONNECTION_KWARGSSENTINEL_KWARGSsentinel_kwargs	REDIS_SSL)yyesttrueT)nnoffalse z5REDIS_SSL is a boolean and must be "True" or "False".
REDIS_HOSTr2   
REDIS_PORTi  REDIS_DBREDIS_PASSWORDREDIS_SSL_CA_CERTSREDIS_SSL_CERT_REQSrequiredREDIS_SSL_CA_DATAREDIS_SSL_KEYFILEREDIS_SSL_CERTFILE)
hostportr:   r<   r>   ssl_ca_certsssl_cert_reqsssl_ca_datassl_keyfilessl_certfile )	getfrom_urlupdater   
master_for
isinstancestrlower
ValueError)	r)   connection_class	instancesmaster_nameconnection_kwargsrA   snr>   kwargss	            r,   get_redis_from_configrl   (   s+    ||K ,((+)>??	j	!	-Z(,,[;O:PQ	z*..}jI :&**43 ,00TB ,00TB&z2667GNJ'++E59
 	  *!5!9!9:Mr!RS":.223DbIiVVDUV}}[))
,,{E
*C#s99;33CYY[99CTUU \;7\40ll:q)LL!148 %94@!&;ZH||$7>||$7> %94@F %f%%    c                     dd|z  z   | fz  S )z*Pads the given string to the given length.z%-z%dsr]   )spad_to_lengths     r,   padrq   [   s    5=((QD00rm   c                 .    g d}|D ]  }| |k  s	|c S  | S )z(Finds the lowest scale where x <= scale.)   2   d      i  iX  i   i  r]   )xscalesscales      r,   	get_scalerz   `   s)    4F :L Hrm   c                     t         j                  t        d      t         j                  t	        d      t         j
                  t        d      i}	 ||    S # t        $ r | cY S w xY w)Nbusyidle	suspended)r   BUSYr   IDLEr   	SUSPENDEDr    KeyError)statesymbolss     r,   state_symbolr   i   sZ    3v;5={ 3G
u~ s   A A"!A"
connectionc           	         d}t               j                  }t        d|dz
        }d}	t               }
| D ]  }|j                  }||
|<   t        |	|      }	! t        |	      }|dz  |z  }| D ]  }|
|   }|sot        ddt        ||z        z  z         }d|j                  |||j                  j                  |j                  j                  |j                  j                  fz  }nPd|j                  ||j                  j                  |j                  j                  |j                  j                  fz  }t        j                  |       ||z  } |s$t        j                  dt        |       |fz         y y )	Nr   rs   g      ?|u   █z1%-12s %s %d, %d executing, %d finished, %d failedz1queue %s %d, %d executing, %d finished, %d failedz%d queues, %d jobs total)r   columnsminr$   countmaxrz   r   intnamestarted_job_registryfinished_job_registryfailed_job_registryclickecholen)queuesrawby_queuequeue_classworker_classr   num_jobs	termwidth
chartwidth	max_countcountsqr   ry   ratiochartlines                    r,   show_queuesr   u   s   H!#++IRR(JIVF *q		5)	* i Eu$E q	#EEM(: ::;EF&&,,''--%%++J D G&&,,''--%%++J D 	

4E-2 

-Vh0GGH rm   c           
      d   t               }| r1| D ]+  }|j                  ||      D ]  }|j                  |        - n(|j                  |      D ]  }|j                  |        |s|D ]  }dj                  |j	                               }	|j
                  d|j                  d|j                  d|j                  d}
|sKd|
t        |j                               |	|j                  |j                  fz  }t        j                  |       d|
|j                         |	|j                  |j                  fz  }t        j                  |        ni }| D ]  }|j                  ||      ||<    |r!t        d	 |j!                         D              }nd
}|D ]f  }||   r)dj                  t#        t%        d ||                     }nd}t        j                  t'        |j
                  dz   |dz         d|       h |s-t        j                  dt)        |      t)        |       fz         y y )N)queuer   )r   z,  ( )z'%s: %s %s. jobs: %d finished, %d failedz-worker %s %s %s. jobs: %d finished, %d failedc              3   J   K   | ]  \  }t        |j                          y wN)r   r   ).0r   s     r,   	<genexpr>zshow_workers.<locals>.<genexpr>   s     GTaS[Gs   !#r   c                 T    | j                   dt        | j                               dS )Nr   r   )r   r   	get_state)ws    r,   <lambda>zshow_workers.<locals>.<lambda>   s    affl1;;=>Y)Z rm   u   –:   z%d workers, %d queues)setalladdjoinqueue_namesr   hostname
ip_addresspidr   r   successful_job_countfailed_job_countr   r   r   keyssortedmaprq   r   )r   r   r   r   r   r   workersr   workerr   r   r   
queue_dict
max_length
queues_strs                  r,   show_workersr      s1   eG 	$E&**:*N $F#$	$ #&&*&= 	 FKK	   	!F))F$6$6$89K&,kk6??FDUDUW]WaWabD@ !1!1!34//++D  

4 F$$&//++J  

4 )	!0 
 	UE , 0 0u 0 TJu	U GZ__5FGGJJ 	VE% !YY3Z\fgl\mno
 #
JJ#ejj3&6
Q"GTU	V 

*c'lCK-HHI rm   c                 
   t        | |||||       |st        j                  d       t        | |||||       |sJt        j                  d       dd l}t        j                  d|j                  j                         z         y y )NrK   r   zUpdated: %s)r   r   r   r   r   r   )r   r   r   r   r   r   r   s          r,   	show_bothr      sj    X{L*M

2h\:N

2

=8#4#4#8#8#::;	 rm   c                 n    	 | rt        j                           ||  | rt        j                  |        ny 5r   )r   cleartimesleep)intervalfuncargss      r,   refreshr      s/    
KKMdJJx  rm   c                 V    | r|rt        d      | rd}n|rd}nd }t        |||       y )Nz3Flags --verbose and --quiet are mutually exclusive.DEBUGWARNING)date_format
log_format)RuntimeErrorr   )verbosequietr   r   levels        r,   setup_loghandlers_from_argsr      s6    5PQQ	 eLrm   c                       e Zd ZdZdZdZy)ParsingModer   r      N)__name__
__module____qualname__
PLAIN_TEXTJSONLITERAL_EVALr]   rm   r,   r   r      s    JDLrm   r   c                 r    	 t        |       S # t        $ r  t        j                  d|xs d|z  z        w xY w)z(Parse value as JSON with error handling.zUnable to parse %s as JSON.%s. non keyword argument)r
   r	   r   BadParametervaluekeywordarg_poss      r,   _parse_json_valuer     sF    tU| t  !>'BqMgjqMq!rsst   
 )6c                 r    	 t        |       S # t        $ r  t        j                  d|xs d|z  z        w xY w)z3Parse value using literal_eval with error handling.zcUnable to eval %s as Python object. See https://docs.python.org/3/library/ast.html#ast.literal_evalr   )r   	Exceptionr   r   r   s      r,   _parse_literal_eval_valuer     sN    
E"" 
  J>4w>@
 	

r   c                 d   d }| j                  d      rt        j                  }| dd  }n| j                  d      rt        j                  }| dd  }n| j	                  d      }|dkD  rd| v r0| j                  d      dz   |k(  rt        j                  }| d |dz
   }nId| v r0| j                  d      dz   |k(  rt        j                  }| d |dz
   }nt        j                  }| d | }| |dz   d  }nt        j                  }| }|j                  d      r(	 t        |dd        5 }|j                         }d d d        |t        j                  k(  rt        |||      }||fS |t        j                  k(  rt        |||      }||fS # 1 sw Y   QxY w# t        $ r t        j                  |dd  d      w xY w)Nr   r   %=r   @z	Not found)
startswithr   r   r   findindexr   openreadFileNotFoundErrorr   	FileErrorr   r   )argumentr   r   moder   r   files          r,   parse_function_argr     s   G3			S	!''c"19h8>>##6#:e#C"''";UQY/X^^C%81%<%E"//";UQY/"--"6E*UQY[)E))DE	:eABi $D		$
 {!%': E> 
))	))%'BE>$ $  	://%)[99	:s$   F F 0F  F	F #F/c                     g }i }| D ]O  }t        |t        |      dz         \  }}|||v rt        j                  d      |||<   ?|j	                  |       Q ||fS )Nr   z7You can't specify multiple values for the same keyword.)r   r   r   r   append)	argumentsr   rk   r   r   r   s         r,   parse_function_argsr  @  st    DF +Hc$i!mD& (()bcc#F7OKK <rm   c                     | 7|t        j                  d      t               t        t	        |             z   S |t        j                  |d      S y )Nz6You can't specify both --schedule-in and --schedule-at)secondsz%Y-%m-%dT%H:%M:%S)r   BadArgumentUsager   r   r   r   strptime)schedule_inschedule_ats     r,   parse_scheduler  O  sV    "(()abbuy{)CDDD		   .ABB 
!rm   c                   <    e Zd ZdZddeeeeedf	 ddZ	e
d        Zy)	CliConfigzGA helper class to be used with click commands, to handle shared optionsNc	                 x   d | _         || _        || _        |r&|D ]!  }t        j                  j                  |       # 	 t        |      | _        	 t        |      | _        	 t        |      | _        	 t        |      | _        	 t%        t&        t(           t        |            | _        y # t        t        f$ r%}t        j                  t        |      d      d }~ww xY w# t        t        f$ r%}t        j                  t        |      d      d }~ww xY w# t        t        f$ r%}t        j                  t        |      d      d }~ww xY w# t        t        f$ r%}t        j                  t        |      d      d }~ww xY w# t        t        f$ r%}t        j                  t        |      d      d }~ww xY w)N--worker-class)
param_hint--job-classz--death-penalty-class--queue-class--connection-class)_connectionurlconfigsyspathr   r   r   ImportErrorAttributeErrorr   r   rc   r   	job_classr   death_penalty_classr   r   r   r   rf   )selfr  r  r   r  r  r   rf   r  r   rk   pthexcs                r,   __init__zCliConfig.__init__[  s      %$%	L 3L AD	I-i8DN	S'78K'LD$	K/<D	P15d5kCSTdCe1fD!% ^, 	L$$SX:JKK	L ^, 	I$$SX-HH	I
 ^, 	S$$SX:QRR	S
 ^, 	K$$SX/JJ	K
 ^, 	P$$SX:NOO	Psw   B) C  !D 2E %F )C8 CC D/ DDE& EEF E==FF9 F44F9c                    | j                   | j                  r6| j                  j                  | j                        | _         | j                   S | j                  rJ| j                  rt        | j                        ni }t        || j                        | _         | j                   S t        t        j                  | j                        | _         | j                   S r   )	r  r  rf   r_   r  r-   rl   osenviron)r  r)   s     r,   r   zCliConfig.connection  s    #xx#'#8#8#A#A$((#K   <@KK+DKK8R#84CXCX#Y   $9TEZEZ#[ rm   )returnN)r   r   r   __doc__r   r   r   r   r   r  propertyr   r]   rm   r,   r
  r
  X  sE    Q )#7'1+P 
+PZ 	  	 rm   r
  z--urlz-uRQ_REDIS_URLz(URL describing Redis connection details.)envvarhelpz--configz-c	RQ_CONFIGzModule containing RQ settings.r  z-wRQ_WORKER_CLASSzRQ Worker class to use)r%  defaultr&  r  z-jRQ_JOB_CLASSzRQ Job class to user  RQ_QUEUE_CLASSzRQ Queue class to user  RQ_CONNECTION_CLASSzRedis client class to usez--pathz-P.zSpecify the import path.T)r)  r&  multiplez--serializerz-Sz@Path to serializer, defaults to rq.serializers.DefaultSerializer)r)  r&  c                 L     t         D ]
  } |          fd}t        |       S )Nc                  v    t        j                         }t        di |} |j                  |g| dd  i |S )Nr   r]   )r   get_current_contextr
  invoke)r   rk   ctx
cli_configr   s       r,   wrapperz pass_cli_config.<locals>.wrapper  sA    '')((
szz$
@T!"X@@@rm   )shared_optionsr   )r   optionr5  s   `  r,   pass_cli_configr8    s0      d|A
 '4((rm   )Cr"   r  r  r   astr   r   r   enumr   	functoolsr   r   jsonr	   r
   shutilr   typingr   r   r   redisr   redis.sentinelr   rq.defaultsr   r   r   r   r   r   rq.logutilsr   rq.utilsr   r   r   r   r   	rq.workerr   styler   r   r    r-   rl   rq   rz   r   r   r   r   r   r   r   r   r   r   r  r  r
  r7  r6  r8  r]   rm   r,   <module>rF     s    	 
   (  - ' $    #  * ` ` "ekke$(		*R 6; 0&f1
	(Ie (IV6Ju 6Jr	<E 	<M$ t	
%PC:  : | ELL$~<fgELLT+<\]ELL$'8BV]u ELL^EV]rsELL)9CV]tuELL$((	 ELL4#5OZ^_ELL(O	0)rm   