o
    iQ:                     @   sb  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 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j*ddZ+eej*ddZ,eej*ddZ-dd Z.efddZ/dd Z0dd Z1dd Z2defddZ3defd d!Z4defd"d#Z5d$d% Z6d&d' Z7G d(d) d)e	Z8d*d+ Z9d,d- Z:d.d/ Z;d0d1 Z<d2d3 Z=G d4d5 d5Z>ej?d6d7d8d9d:ej?d;d<d=d>d:ej?d?d@dAedBdCej?dDdEdFedGdCej?dHdIedJdCej?dKdLedMdCej?dNdOdPgdQdRdSej?dTdUedVdWgZ@dXdY ZAdS )Z    N)literal_eval)datetime	timedelta)Enum)partialupdate_wrapper)JSONDecodeErrorloads)get_terminal_size)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)Zfggreenyellowc                 C   s   t | }dd |j D S )z?Reads all UPPERCASE variables defined in the given module file.c                 S   s"   i | ]\}}|  |kr||qS  )upper).0kvr   r   E/home/app/Keep/.python/lib/python3.10/site-packages/rq/cli/helpers.py
<dictcomp>%   s   " z$read_config_file.<locals>.<dictcomp>)	importlibimport_module__dict__items)modulesettingsr   r   r#   read_config_file"   s   
r+   c           	      C   s  |  ddur|| d S |  ddurn| d  ddg}| d  dd}| d  dd	| d  d
d| d  dd| d  dd| d  ddd}|| d  di  | d  di }t|fd|i|}||S |  dd}t|tr| dv rd}n| dv rd}ntd|  dd|  dd|  dd	|  dd||  dd|  dd |  d!d|  d"d|  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':}
    Z	REDIS_URLNZSENTINELZ	INSTANCES)	localhostig  ZMASTER_NAMEZmymasterZDBr   USERNAMEZPASSWORDZSOCKET_TIMEOUTZSSLF)dbusernamepasswordsocket_timeoutsslZCONNECTION_KWARGSZSENTINEL_KWARGSsentinel_kwargsZ	REDIS_SSL)yyesttrueT)nnoffalse z5REDIS_SSL is a boolean and must be "True" or "False".Z
REDIS_HOSTr,   Z
REDIS_PORTi  ZREDIS_DBZREDIS_PASSWORDZREDIS_SSL_CA_CERTSZREDIS_SSL_CERT_REQSrequiredZREDIS_SSL_CA_DATAZREDIS_SSL_KEYFILEZREDIS_SSL_CERTFILE)
hostportr.   r0   r2   Zssl_ca_certsZssl_cert_reqsZssl_ca_dataZssl_keyfileZssl_certfiler   )	getfrom_urlupdater   Z
master_for
isinstancestrlower
ValueError)	r*   connection_classZ	instancesZmaster_nameZconnection_kwargsr3   Zsnr2   kwargsr   r   r#   get_redis_from_config(   sD   










rI   c                 C   s   | d| S )z*Pads the given string to the given length.<r   )sZpad_to_lengthr   r   r#   pad[   s   rL   c                 C   s&   g d}|D ]
}| |kr|  S q| S )z(Finds the lowest scale where x <= scale.)   2   d      i  iX  i   i  r   )xscalesscaler   r   r#   	get_scale`   s   rT   c                 C   sD   t jtdt jtdt jtdi}z||  W S  ty!   |  Y S w )NbusyidleZ	suspended)r   ZBUSYr   ZIDLEr   Z	SUSPENDEDr   KeyError)statesymbolsr   r   r#   state_symboli   s   



rZ   
connectionc                 C   s,  d}t  j}td|d }d}	t }
| D ]}|j}||
|< t|	|}	qt|	}|d | }| D ]S}|
| }|s`tddt||   }|j	dd| d| d|j
j d	|jj d
|jj d}nd|j	 d| d|j
j d	|jj d
|jj d}t| ||7 }q/|stt|  d| d d S d S )Nr   rM   g      ?|u   █z<12 , z executing,  finished,  failedzqueue z	 queues, z jobs total)r
   columnsmindictcountmaxrT   r   intnameZstarted_job_registryZfinished_job_registryZfailed_job_registryclickecholen)queuesrawby_queuequeue_classworker_classr[   Znum_jobsZ	termwidthZ
chartwidth	max_countcountsqrd   rS   ratiochartliner   r   r#   show_queuesu   s@    

rv   c                 C   s  t  }| r| D ]}|j||dD ]}|| qqn|j|dD ]}|| q |s|D ]U}d| }	|j d|j d|j d|j d}
|sf|
 dt	|
  d|	 d|j d	|j d

}t| q,d|
 d|
  d|	 d|j d	|j d
}t| q,nKi }| D ]}|j||d||< q|rtdd | D }nd}|D ](}|| rdttdd || }nd}tdt|jd |d | q|stt| dt|  d d S d S )N)queuer[   )r[   r^    (r]   )z: z. jobs: r_   r`   zworker c                 s   s    | ]	\}t |jV  qd S N)rj   rg   )r    rr   r   r   r#   	<genexpr>   s    zshow_workers.<locals>.<genexpr>r   c                 S   s   | j  dt|   dS )Nrx   ry   )rg   rZ   	get_state)wr   r   r#   <lambda>   s    zshow_workers.<locals>.<lambda>u   –z{} {}:   z
 workers, z queues)setalladdjoinqueue_namesrg   hostname
ip_addresspidrZ   r|   Zsuccessful_job_countZfailed_job_countrh   ri   re   keyssortedmapformatrL   rj   )rk   rl   rm   rn   ro   r[   workersrw   Zworkerr   rg   ru   Z
queue_dict
max_lengthZ
queues_strr   r   r#   show_workers   sZ   $$"r   c                 C   sf   t | ||||| |std t| ||||| |s1td dd l}td|j   d S d S )Nr<   r   z	Updated: )rv   rh   ri   r   r   r   )rk   rl   rm   rn   ro   r[   r   r   r   r#   	show_both   s   

r   c                 G   s,   	 | rt   ||  | rt|  nd S qrz   )rh   cleartimesleep)intervalfuncargsr   r   r#   refresh   s   r   c                 C   s:   | r|rt d| rd}n|rd}nd }t|||d d S )Nz3Flags --verbose and --quiet are mutually exclusive.DEBUGWARNING)date_format
log_format)RuntimeErrorr   )verbosequietr   r   levelr   r   r#   setup_loghandlers_from_args   s   r   c                   @   s   e Zd ZdZdZdZdS )ParsingModer   r      N)__name__
__module____qualname__
PLAIN_TEXTJSONLITERAL_EVALr   r   r   r#   r      s    r   c                 C   2   zt | W S  ty   td|p| d w )z(Parse value as JSON with error handling.zUnable to parse %s as JSON.. non keyword argument)r	   r   rh   BadParametervaluekeywordarg_posr   r   r#   _parse_json_value   s
   
r   c                 C   r   )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   	Exceptionrh   r   r   r   r   r#   _parse_literal_eval_value   s   
r   c                 C   s  d }|  drtj}| dd  }na|  dr tj}| dd  }nR| d}|dkrmd| v rB| dd |krBtj}| d |d  }n"d| v r[| dd |kr[tj}| d |d  }n	tj}| d | }| |d d  }ntj}| }| drzt|dd  }| }W d    n1 sw   Y  W n t	y   t
|dd  dw |tjkrt|||}||fS |tjkrt|||}||fS )Nr   r   %=r   @z	Not found)
startswithr   r   r   findindexr   openreadFileNotFoundErrorrh   Z	FileErrorr   r   )argumentr   r   moder   r   filer   r   r#   parse_function_arg  sF   






r   c                 C   s^   g }i }| D ]$}t |t|d \}}|d ur%||v r td|||< q|| q||fS )Nr   z7You can't specify multiple values for the same keyword.)r   rj   rh   r   append)	argumentsr   rH   r   r   r   r   r   r#   parse_function_args3  s   

r   c                 C   sF   | d ur|d urt dt tt| d S |d ur!t|dS d S )Nz6You can't specify both --schedule-in and --schedule-at)secondsz%Y-%m-%dT%H:%M:%S)rh   ZBadArgumentUsager   r   r   r   strptime)Zschedule_inZschedule_atr   r   r#   parse_scheduleB  s   
r   c                   @   s:   e Zd ZdZddeeeeedf	dddZ	e
dd ZdS )		CliConfigzGA helper class to be used with click commands, to handle shared optionsNreturnc	              
   O   sn  d | _ || _|| _|r|D ]}tj| qzt|| _W n tt	fy4 } z	t
jt|ddd }~ww zt|| _W n tt	fyS } z	t
jt|ddd }~ww zt|| _W n tt	fyr } z	t
jt|ddd }~ww zt|| _W n tt	fy } z	t
jt|ddd }~ww zttt t|| _W d S  tt	fy } z	t
jt|ddd }~ww )N--worker-class)Z
param_hint--job-classz--death-penalty-class--queue-class--connection-class)_connectionurlconfigsyspathr   r   ro   ImportErrorAttributeErrorrh   r   rD   r   	job_classr   death_penalty_classrn   r   typer   rG   )selfr   r   ro   r   r   rn   rG   r   r   rH   pthexcr   r   r#   __init__N  sH   zCliConfig.__init__c                 C   sj   | j d u r2| jr| j| j| _ | j S | jr*| jrt| jni }t|| j| _ | j S ttj| j| _ | j S rz   )	r   r   rG   rA   r   r+   rI   osenviron)r   r*   r   r   r#   r[   {  s   
zCliConfig.connection)r   N)r   r   r   __doc__r   r   r   r   r   r   propertyr[   r   r   r   r#   r   K  s    
-r   z--urlz-uZRQ_REDIS_URLz(URL describing Redis connection details.)envvarhelpz--configz-cZ	RQ_CONFIGzModule containing RQ settings.r   z-wZRQ_WORKER_CLASSzRQ Worker class to use)r   defaultr   r   z-jZRQ_JOB_CLASSzRQ Job class to user   ZRQ_QUEUE_CLASSzRQ Queue class to user   ZRQ_CONNECTION_CLASSzRedis client class to usez--pathz-P.zSpecify the import path.T)r   r   Zmultiplez--serializerz-Sz@Path to serializer, defaults to rq.serializers.DefaultSerializer)r   r   c                    s(   t D ]}|  q fdd}t| S )Nc                     s8   t  }tdi |}|j |g| dd  R i |S )Nr   r   )rh   Zget_current_contextr   Zinvoke)r   rH   ctxZ
cli_configr   r   r#   wrapper  s   "z pass_cli_config.<locals>.wrapper)shared_optionsr   )r   optionr   r   r   r#   pass_cli_config  s   

r   )Br%   r   r   r   astr   r   r   enumr   	functoolsr   r   jsonr   r	   shutilr
   typingr   rh   Zredisr   Zredis.sentinelr   Zrq.defaultsr   r   r   r   r   r   Zrq.logutilsr   Zrq.utilsr   r   r   r   r   Z	rq.workerr   styler   r   r   r+   rI   rL   rT   rZ   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   <module>   sx     3	$3(	>
