o
    0 i01                  	   @   s  d dl Zd dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZmZmZ dedee fd	d
ZddddZdee defddZedZedZdedefddZdedefddZdededefddZd6dededeeef fdd Z dededeeeef fd!d"Z!d7ded#e	e d$edefd%d&Z"ded#e	e defd'd(Z#d7d)d*Z$d+d, Z%dedee&e	e& f fd-d.Z'd/d0 Z(d1d2 Z)d3e
dee fd4d5Z*dS )8    N)DictIterableListMatchOptionalTextIOTuple   )Metric)Sample)_is_valid_legacy_metric_name_validate_labelname_validate_metric_nametextreturnc                 c   s    t t| E dH  dS )z]Parse Prometheus text format from a unicode string.

    See text_fd_to_metric_families.
    N)text_fd_to_metric_familiesStringIO)r    r   d/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/prometheus_client/parser.pytext_string_to_metric_families   s   r   \
")z\\z\nz\"matchc                 C   s   t | d S )Nr   )ESCAPE_SEQUENCESgroup)r   r   r   r   replace_escape_sequence   s   r   z\\[\\n]z\\[\\n"]sc                 C      t t| S N)HELP_ESCAPING_REsubr   r   r   r   r   _replace_help_escaping$      r#   c                 C   r   r   )ESCAPING_REr!   r   r"   r   r   r   _replace_escaping(   r$   r&   charposc                 C   sP   d}||kr"| |d |  dkr"|d7 }||kr"| |d |  dks|d dkS )Nr   r	   r      r   )r   r'   Znum_bslashesr   r   r   _is_character_escaped,   s   r)   Flabels_stringopenmetricsc                 C   sV  i }|   }|r|r|d dkrtd|  z|rt||\}}}|s,|r+td|  qt|\}}|s<t|s<td|rD|d dkrFtd}|t|k rh|d|}t|d | |s^n
|d7 }|t|k sN|d }	|	t|krxtd|  t|\}
}|d	krt| nt	| ||v rtd
|  |
||< |s|W S  ty   td|  w )Nr   ,zleading comma: zempty term in line: zunquoted UTF-8 metric namer   r	   zunexpected text after quote: __name__z$invalid line, duplicate label name: zInvalid labels: )
strip
ValueError
_next_term_unquote_unescaper   lenindexr)   r   r   )r*   r+   labelsZ
sub_labelsZ	name_termZ
value_termZ
label_nameZquoted_nameiZ	quote_endZlabel_value_r   r   r   parse_labels4   sL   
(r7   c                 C   s   | d dkr| dd } | sdS | d dkrt dt| d}|dkr=| | dkr=| d| }| |d d } t| d	}nd
}|dkrGt| }| d| }|sV|rVt d|| |d }|| | fS )a  Extract the next comma-separated label term from the text. The results
    are stripped terms for the label name, label value, and then the remainder
    of the string including the final , or }.
    
    Raises ValueError if the term is empty and we're in openmetrics mode.
    r   r,   r	   N) r8   r8   zmultiple commasz=,}=z,}r-   zempty term:)r/   _next_unquoted_charr2   r.   )r   r+   ZsplitposZ	labelnametermrestr   r   r   r0   j   s&   	

r0   chsstartidxc                 C   sd   d}|du r	t j}t| |d D ]\}}|dkr#t| || s#| }|s/||v r/||   S qdS )zReturn position of next unquoted character in tuple, or -1 if not found.
    
    It is always assumed that the first character being checked is not already
    inside quotes.
    FNr   r:   )string
whitespace	enumerater)   )r   r>   r?   	in_quotesr5   cr   r   r   r;      s   r;   c                 C   sj   t | d }d}|du rtj}|dkr3| | dkr!t| |s!| }|s+| | |v r+|S |d8 }|dksdS )zGReturn position of last unquoted character in list, or -1 if not found.r	   FNr   r   r:   )r2   r@   rA   r)   )r   r>   r5   rC   r   r   r   _last_unquoted_char   s   rE   c                 C   s   dg}d}|t | k rWt| ||}|dkr"| |d |d< t | }q||kr+|d7 }q|dkr@t ||kr@| |d |d< 	 |S | || |d< |d }|d |t | k s|S )zfSplits on split_ch similarly to strings.split, skipping separators if
    they are inside quotes.
    r8   r   r:   Nr	   )r2   r;   append)r   	separatormaxsplittokensxZ	split_posr   r   r   _split_quoted   s(   
rK   c                 C   sl   | s| dfS d}|   } | d dkr*t| dks| d dkr"td| dd } d}d| v r2t| } | |fS )	z.Returns the string, and true if it was quoted.Fr   r   r	   r:   zmissing close quoteTr   )r.   r2   r/   r&   )r   quotedr   r   r   r1      s   r1   c                 C   sp   |   } d}|| vrd}dd | |D }|st| d fS t|d }t|dkr2t|d d nd }||fS )	N 	c                 S   s   g | ]
}|  r|  qS r   )r.   ).0valuer   r   r   
<listcomp>   s    z._parse_value_and_timestamp.<locals>.<listcomp>r   r	   r:   i  )lstripsplitfloat_parse_valuer2   )r   rG   valuesrP   	timestampr   r   r   _parse_value_and_timestamp   s    rX   c                 C   sR   d | } | |  ksd| v rtd| zt| W S  ty(   t|  Y S w )Nr8   r6   zInvalid value: )joinr.   r/   intrT   )rP   r   r   r   rU      s   

rU   c           
      C   s  d}t | d}|dks|| d | v r?t | d}| d |  }t|s*td|  | |d d  }t|\}}t|i ||S | d |  }t | |d  d| }t| |d | d}	|smd	|	vret|	d	 }|	d	= nd	|	v rutd
| |d d  }t|\}}t||	||S )Nz # {r:   z 	zinvalid metric name:r	   }Fr-   z$metric name specified more than once)r;   r.   r   r/   rX   r   r7   )
r   rG   Zlabel_startZname_endnameZremaining_textrP   rW   Z	label_endr4   r   r   r   _parse_sample   s.   

r^   fdc              
   #   s0   d d}d}g }g }dt dt dt dtt dtf
dd	}| D ]}| }|d
rt|dd}t|dk r6qd\}}	t|dkr]|d dkrM|d dkrMqt|d \}}	|	s]t	|s]t
|d dkr| kr| dkrs| |||V  | d}g }|g}t|dkrt|d }qd}q|d dkrt|dk rt
| kr dkr| |||V  | d}g }|d }dgdgg dg dd|dg} fdd|D }q|dkrqt|}
|
j|vr dkr| |||V  d d}d}g }g }||
d |||
gV  q||
 q dkr| |||V  dS dS )zParse Prometheus text format from a file descriptor.

    This is a laxer parser than the main Go parser,
    so successful parsing does not imply that the parsed
    text meets the specification.

    Yields Metric's.
    r8   Zuntypedr]   documentationtypsamplesr   c                 S   sn   |dkr,|  dr| d d } ng }|D ]}|t|d d g|dd  R   |}qt| ||}||_|S )NcounterZ_totalir   r	   )endswithrF   r   r
   rb   )r]   r`   ra   rb   Znew_samplesr   Zmetricr   r   r   build_metric"  s   
&z0text_fd_to_metric_families.<locals>.build_metric#N   r(   )r8   Fr	   ZTYPEZHELP   )_count_sumr8   )ri   rj   Z_bucket)rc   ZgaugesummaryZ	histogramc                    s   g | ]} | qS r   r   )rO   nr]   r   r   rQ   ^  s    z.text_fd_to_metric_families.<locals>.<listcomp>r   )strr   r   r
   r.   
startswithrK   r2   r1   r   r/   r#   getr^   r]   rF   )r_   r`   ra   rb   Zallowed_namesre   linepartsZcandidate_namerL   sampler   rm   r   r     s   	"


r   )F)r   )+ior   rer@   typingr   r   r   r   r   r   r   Zmetrics_corer
   rb   r   Z
validationr   r   r   rn   r   r   r   compiler    r%   r#   r&   rZ   boolr)   r7   r0   r;   rE   rK   r1   rT   rX   rU   r^   r   r   r   r   r   <module>   s8    $	

  6 "

