o
    ~Mf-                     @   s  d dl mZmZmZmZ 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 d dlmZ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Zd d	lmZ d d
lmZ d dl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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 Z.dd Z/dd Z0dd Z1dd  Z2d!d" Z3d#d$ Z4d%d& Z5d'd( Z6d)d* Z7d+d, Z8G d-d. d.Z9dS )/    )absolute_importdivisionprint_functionunicode_literalsN)partial)Enum)datetimetimezone	timedelta)loadsJSONDecodeError)literal_eval)get_terminal_size)Redis)Sentinel)DEFAULT_CONNECTION_CLASSDEFAULT_JOB_CLASSDEFAULT_QUEUE_CLASSDEFAULT_WORKER_CLASS)setup_loghandlers)import_attributeparse_timeout)WorkerStatusred)fggreenyellowc                 C   s"   t | }tdd |j D S )z?Reads all UPPERCASE variables defined in the given module file.c                 S   s$   g | ]\}}|  |kr||fqS  )upper).0kvr   r   P/var/www/html/analyze/labelStudio/lib/python3.10/site-packages/rq/cli/helpers.py
<listcomp>#   s
    z$read_config_file.<locals>.<listcomp>)	importlibimport_moduledict__dict__items)modulesettingsr   r   r"   read_config_file    s   
r+   c           
   
   C   s*  |  ddur|| d S |  ddurK| d  ddg}| d  dd}| d  dd}| d  dd	}| d  d
d}t||||d}||S |  dd}t|trl| dv r_d}n| dv rhd}ntd|  dd|  dd|  dd	|  dd||  dd|  ddd}	|di |	S )a)  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':, 'PASSWORD':,'DB':, 'MASTER_NAME':}
    	REDIS_URLNSENTINEL	INSTANCES)	localhostig  SOCKET_TIMEOUTPASSWORDDBr   MASTER_NAMEmymaster)socket_timeoutpassworddb	REDIS_SSLF)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)hostportr7   r6   sslssl_ca_certsssl_cert_reqsr   )getfrom_urlr   
master_for
isinstancestrlower
ValueError)
r*   connection_class	instancesr5   r6   r7   master_namesnrK   kwargsr   r   r"   get_redis_from_config(   s4   








rZ   c                 C   s   dd|  | f S )z*Pads the given string to the given length.z%-z%dsr   )spad_to_lengthr   r   r"   padP   s   r]   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_scaleU   s   re   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idle	suspended)r   BUSYr   IDLEr   	SUSPENDEDr   KeyError)statesymbolsr   r   r"   state_symbol^   s   



ro   c                 C   s   d}t  j}td|d }d}t }	| D ]}
|
j}||	|
< t||}qt|}|d | }| D ]-}
|	|
 }|sLtddt||   }d|
j	||f }nd|
j	|f }t
| ||7 }q/|slt
dt| |f  d S d S )	Nr   r^   g      ?|u   █z%-12s %s %dzqueue %s %dz%d queues, %d jobs total)r   columnsminr&   countmaxre   r   intnameclickecholen)queuesrawby_queuequeue_classworker_classnum_jobs	termwidth
chartwidth	max_countcountsqrs   rd   ratiochartliner   r   r"   show_queuesj   s,   

r   c                 C   st  t  }| r| D ]}|j|dD ]}|| qqn| D ]}|| q|s]|D ]2}d| }d|j|j|j|jf }	|sOt	
d|	t| |f  q)t	
d|	| |f  q)nJi }
| D ]
}|j|d|
|< qa|
rztdd |
 D }nd}|
D ](}|
| rdttd	d
 |
| }nd}t	
dt|jd |d |f  q~|st	
dt|t| f  d S d S )N)queuez, z%s (%s %s %s)z	%s: %s %szworker %s %s %sc                 s   s    | ]	\}t |jV  qd S N)ry   rv   )r   r   r   r   r"   	<genexpr>   s    zshow_workers.<locals>.<genexpr>r   c                 S   s   d| j t|  f S )Nz%s (%s))rv   ro   	get_state)wr   r   r"   <lambda>   s    zshow_workers.<locals>.<lambda>u   –z%s %s:   z%d workers, %d queues)setalladdjoinqueue_namesrv   hostname
ip_addresspidrw   rx   ro   r   rt   keyssortedmapr]   ry   )rz   r{   r|   r}   r~   workersr   workerr   rv   
queue_dict
max_length
queues_strr   r   r"   show_workers   sF   
$r   c                 C   s`   t | |||| |std t| |||| |s.td dd l}td|j   d S d S )NrA   r   zUpdated: %s)r   rw   rx   r   r   now)rz   r{   r|   r}   r~   r   r   r   r"   	show_both   s   

r   c                 G   s,   	 | rt   ||  | rt|  nd S qr   )rw   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INFO)date_format
log_format)RuntimeErrorr   )verbosequietr   r   levelr   r   r"   setup_loghandlers_from_args   s   r   c                 C   s  G dd dt }d }| dr|j}| dd  }na| dr(|j}| dd  }nR| d}|dkrud| v rJ| dd |krJ|j}| d |d  }n"d| v rc| dd |krc|j}| d |d  }n	|j}| d | }| |d d  }n|j}| }|drzt|dd  d	}| }W d    n1 sw   Y  W n t	y   t
|dd  d
w ||jkrz	t|}W ||fS  ty   t
d|pd|  w ||jkrz	t|}W ||fS  ty   t
d|pd|  w ||fS )Nc                   @   s   e Zd ZdZdZdZdS )z'parse_function_arg.<locals>.ParsingModer   r      N)__name__
__module____qualname__
PLAIN_TEXTJSONLITERAL_EVALr   r   r   r"   ParsingMode   s    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FileNotFoundErrorrw   	FileErrorr   r   BadParameterr   	Exception)argumentarg_posr   keywordmodevaluer   filer   r   r"   parse_function_arg   s^   









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   ry   rw   r   append)	argumentsr   rY   r   r   r   r   r   r"   parse_function_args  s   

r   c                 C   sL   | d ur|d urt dttj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)	rw   BadArgumentUsager   r   r	   utcr
   r   strptime)schedule_inschedule_atr   r   r"   parse_schedule  s   
r   c                   @   s4   e Zd ZdZddeeeedfddZe	dd Z
dS )	CliConfigzGA helper class to be used with click commands, to handle shared optionsNc              
   O   s&  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 d S  tt	fy } z	t
jt|ddd }~ww )Nz--worker-class)
param_hintz--job-classz--queue-classz--connection-class)_connectionurlconfigsyspathr   r   r~   ImportErrorAttributeErrorrw   r   rR   	job_classr}   rU   )selfr   r   r~   r   r}   rU   r   r   rY   pthexcr   r   r"   __init__)  s<   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 r   )	r   r   rU   rO   r   r+   rZ   osenviron)r   r*   r   r   r"   
connectionG  s   
zCliConfig.connection)r   r   r   __doc__r   r   r   r   r   propertyr   r   r   r   r"   r   '  s    
r   ):
__future__r   r   r   r   r   r$   r   r   	functoolsr   enumr   r   r	   r
   jsonr   r   astr   shutilr   rw   redisr   redis.sentinelr   rq.defaultsr   r   r   r   rq.logutilsr   rq.utilsr   r   	rq.workerr   styler   r   r   r+   rZ   r]   re   ro   r   r   r   r   r   r   r   r   r   r   r   r   r"   <module>   sH   (	.5	