U
    d                     @   s   d dl Zd dlZddlmZ ddlmZ dd Zddd	d
Zdd Z	e
dZe
dZdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    N   )Metric)Samplec                 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)text r   </tmp/pip-unpacked-wheel-2bcd7zt2/prometheus_client/parser.pytext_string_to_metric_families   s    r
   \
")z\\z\nz\"c                 C   s   t | d S )Nr   )ESCAPE_SEQUENCESgroup)matchr   r   r	   replace_escape_sequence   s    r   z\\[\\n]z\\[\\n"]c                 C   s   t t| S N)HELP_ESCAPING_REsubr   sr   r   r	   _replace_help_escaping   s    r   c                 C   s   t t| S r   )ESCAPING_REr   r   r   r   r   r	   _replace_escaping#   s    r   c                 C   s6   d}||kr*| |d |  dkr*|d7 }q|d dkS )Nr   r   r      r   )r   ZcharposZnum_bslashesr   r   r	   _is_character_escaped'   s    
r   c                 C   s(  i }d| kr|S d}d| kr d}| }z|r| d}|d | }||d d   }| dd }||d  }d}|t|k r| d|}t||sq|d7 }qr|d }	|||	 }
|rt|
}
|
|| < ||	d d  }|dd }||d   }q&|W S  tk
r"   td	|  Y nX d S )
N=Fr   Tr   r   r   ,zInvalid labels: %s)indexlstriplenr   r   stripfind
ValueError)Zlabels_stringlabelsZescapingZ
sub_labelsZvalue_startZ
label_nameZquote_startZvalue_substriZ	quote_endZlabel_valueZ
next_commar   r   r	   _parse_labels/   s>    


r&   c                 C   sp   |   } d}|| krd}dd | |D }|s<t| d fS t|d }t|dkrdt|d d nd }||fS )	N 	c                 S   s   g | ]}|  r|  qS r   )r!   ).0valuer   r   r	   
<listcomp>g   s      z._parse_value_and_timestamp.<locals>.<listcomp>r   r   i  )r   splitfloatr    )r   	separatorvaluesr*   	timestampr   r   r	   _parse_value_and_timestampb   s     r2   c           	      C   s   zb|  d| d }}| d |  }| |d | }t| |d d  \}}t|t|||W S  tk
r   d}|| krd}|  |}| d | }t| |d  \}}t|i || Y S X d S )N{}r   r'   r(   )r   rindexr!   r2   r   r&   r#   )	r   Zlabel_startZ	label_endnamelabelr*   r1   r/   Zname_endr   r   r	   _parse_sampleo   s    
r8   c           	      #   s  d d}d}g }g }dd }| D ]}|  }|drH|dd}t|dk rTq |d	 d
kr|d  kr dkr| |||V  |d  d}g }|d g}t|dkrt|d }nd}n|d	 dkr|d  kr dkr| |||V  |d  d}g }|d }dgdgdddgdddgd|dg} fdd|D }n q |dkrTq t|}|j|kr dkr| |||V  d d}d}g }g }||d |||gV  q || q  dkr| |||V  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.
     Zuntypedc                 S   sl   |dkrV|  dr | d d } n6g }|D ],}|t|d d f|dd    |}q(t| ||}||_|S )NcounterZ_totalir   r   )endswithappendr   r   samples)r6   documentationtypr=   Znew_samplesr   Zmetricr   r   r	   build_metric   s    
$z0text_fd_to_metric_families.<locals>.build_metric#N   r   r   ZHELP   ZTYPE_countZ_sumZ_bucket)r:   ZgaugesummaryZ	histogramc                    s   g | ]} | qS r   r   )r)   nr6   r   r	   r+      s     z.text_fd_to_metric_families.<locals>.<listcomp>r   )	r!   
startswithr-   r    r   getr8   r6   r<   )	fdr>   r?   r=   Zallowed_namesr@   linepartssampler   rG   r	   r      sp    	

 


r   )ior   reZmetrics_corer   r=   r   r
   r   r   compiler   r   r   r   r   r&   r2   r8   r   r   r   r   r	   <module>   s$   	

3