
    s,g9                     6   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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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# d dl$m%Z%  eejL                  d      Z' eejL                  d      Z( eejL                  d      Z)d Z*efdZ+d Z,d Z-d Z.defdZ/defdZ0defdZ1d Z2d Z3d Z4d Z5d Z6 G d  d!      Z7 ejp                  d"d#d$d%&       ejp                  d'd(d)d*&       ejp                  d+d,d-ed./       ejp                  d0d1d2ed3/       ejp                  d4d5ed6/       ejp                  d7d8ed9/       ejp                  d:d;d<gd=d>?       ejp                  d@dAedBC      gZ9dD Z:y)E    N)literal_eval)datetime	timedeltatimezone)Enum)partialupdate_wrapper)JSONDecodeErrorloads)get_terminal_size)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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       h/var/www/trellinator.diamondhoofcare.com/public_html/venv/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_HOSTr.   
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portr6   r8   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_kwargsr=   snr:   kwargss	            r(   get_redis_from_configrh   '   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%dsrY   )spad_to_lengths     r(   padrm   Z   s    5=((QD00ri   c                 .    g d}|D ]  }| |k  s	|c S  | S )z(Finds the lowest scale where x <= scale.)   2   d      i  iX  i   i  rY   )xscalesscales      r(   	get_scalerv   _   s)    4F :L Hri   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   h   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   ro   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maxrv   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   ru   ratiochartlines                    r(   show_queuesr   t   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 ri   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 ri   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maprm   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 ri   c                 
   t        | |||||       |st        j                  d       t        | |||||       |sJt        j                  d       dd l}t        j                  d|j                  j                         z         y y )NrG   r   zUpdated: %s)r   r   r   r   r   now)r   r   r   r   r   r   r   s          r(   	show_bothr      sj    X{L*M

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

2

=8#4#4#8#8#::;	 ri   c                 n    	 | rt        j                           ||  | rt        j                  |        ny 5r   )r   cleartimesleep)intervalfuncargss      r(   refreshr      s/    
KKMdJJx  ri   c                 V    | r|rt        d      | rd}n|rd}nd}t        |||       y )Nz3Flags --verbose and --quiet are mutually exclusive.DEBUGWARNINGINFO)date_format
log_format)RuntimeErrorr   )verbosequietr   r   levels        r(   setup_loghandlers_from_argsr      s4    5PQQ	eLri   c                     G d dt               }d }| j                  d      r|j                  }| dd  }n| j                  d      r|j                  }| dd  }n| j	                  d      }|dkD  rzd| v r,| j                  d      dz   |k(  r|j                  }| d |dz
   }nAd| v r,| j                  d      dz   |k(  r|j                  }| d |dz
   }n|j                  }| d | }| |dz   d  }n|j                  }| }|j                  d      r)	 t        |dd  d	      5 }|j                         }d d d        ||j                  k(  r	 t        |      }||fS ||j                  k(  r	 t        |      }||fS ||fS # 1 sw Y   KxY w# t        $ r t        j                  |dd  d
      w xY w# t        $ r  t        j                  d|xs d|z  z        w xY w# t         $ r  t        j                  d|xs d|z  z        w xY w)Nc                       e Zd ZdZdZdZy)'parse_function_arg.<locals>.ParsingModer   r      N)__name__
__module____qualname__
PLAIN_TEXTJSONLITERAL_EVALrY   ri   r(   ParsingModer      s    
ri   r   r   r   %=r   @rz	Not foundzUnable to parse %s as JSON.z%s. non keyword argumentzcUnable to eval %s as Python object. See https://docs.python.org/3/library/ast.html#ast.literal_eval)r   
startswithr   r   findindexr   openreadFileNotFoundErrorr   	FileErrorr   r
   BadParameterr   	Exception)argumentarg_posr   keywordmodevaluer   files           r(   parse_function_argr      sR   d 
 G3			S	!''c"19h8>>##6#:e#C"''";UQY/X^^C%81%<%E"//";UQY/"--"6E*UQY[)E))DE	:eABi% $		$
 {	x%LE E> 
))	)	 'E E>7E>)$ $  	://%)[99	:  	x$$%BgFuQknuQu%vww	x
  	$$NB87BD 	s<   E> E2(E>  F$ G 2E;7E> >#F!$)G)G9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   rg   r   r   r   s         r(   parse_function_argsr   3  st    DF +Hc$i!mD& (()bcc#F7OKK <ri   c                     | P|t        j                  d      t        j                  t        j
                        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   utcr   r   strptime)schedule_inschedule_ats     r(   parse_scheduler  B  sa    "(()abb||HLL)ImK>X,YYY		   .ABB 
!ri   c                   8    e Zd ZdZddeeeeedfdZ	e
d        Zy)	CliConfigzGA helper class to be used with click commands, to handle shared optionsNc	                 N   d | _         || _        || _        |r&|D ]!  }t        j                  j                  |       # 	 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   r_   	job_classdeath_penalty_classr   rb   )selfr  r  r   r  r  r   rb   r  r   rg   pthexcs                r(   __init__zCliConfig.__init__N  s      %$%	L 0 >D	I-i8DN	S'78K'LD$	K/<D	P$45E$FD!% ^, 	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D9 E0 C# CCC? C::C?D6 D11D69E- E((E-0F$? FF$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  rb   r[   r  r)   rh   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#[ ri   )r   r   r   __doc__r   r   r   r   r   r  propertyr   rY   ri   r(   r  r  K  s:    Q )#7'1+PZ 	  	 ri   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   rY   )r   get_current_contextr  invoke)r   rg   ctx
cli_configr   s       r(   wrapperz pass_cli_config.<locals>.wrapper  sA    '')((
szz$
@T!"X@@@ri   )shared_optionsr	   )r   optionr.  s   `  r(   pass_cli_configr1    s0      d|A
 '4((ri   );r   r  r  r   astr   r   r   r   enumr   	functoolsr   r	   jsonr
   r   shutilr   r   redisr   redis.sentinelr   rq.defaultsr   r   r   r   r   r   rq.logutilsr   rq.utilsr   r   	rq.workerr   styler   r   r   r)   rh   rm   rv   r   r   r   r   r   r   r   r   r  r  r0  r/  r1  rY   ri   r(   <module>r>     s    	 
   2 2  - ' $   #  * 4 "ekke$(		*R 6; 0&f1
	(Ie (IV6Ju 6Jr	<E 	<
M4nC:  : | ELL$~<fgELLT+<\]ELL$'8BV]u ELL^EV]rsELL)9CV]tuELL$((	 ELL4#5OZ^_ELL(O	0)ri   