o
    Rh95                  	   @   s&  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	 d dl
mZ d dlmZ d dlmZmZ edZed	Zd
gZG dd deZd%dedededefddZdd Zdd Z	d&defddZdefddZdefddZdefddZ defd d!Z!d"edee j  fd#d$Z"dS )'    N)Optional)parser)relativedelta)utils)	FlagValue)convert_to_datetime_awareis_valid_regexl   posthogis_notc                   @   s   e Zd ZdS )InconclusiveMatchErrorN)__name__
__module____qualname__ r   r   W/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/posthog/feature_flags.pyr      s    r    keydistinct_idsaltreturnc                 C   s<   |  d| | }t t|d d d d}|t S )N.zutf-8      )inthashlibsha1encode	hexdigest__LONG_SCALE__)r   r   r   hash_keyhash_valr   r   r   _hash   s   "r!   c                 C   sH   t | d |dd}t| D ]}||d kr!||d k r!|d   S qd S )Nr   variant)r   	value_min	value_max)r!   variant_lookup_table)flagr   
hash_valuer"   r   r   r   get_matching_variant#   s   r(   c                 C   sb   g }d}|  dp
i  dpi  dpg }|D ]}||d d  }||||d d |}q|S )	Nr   filtersmultivariatevariantsrollout_percentaged   r   )r#   r$   r   )getappend)feature_flaglookup_tabler#   multivariatesr"   r$   r   r   r   r%   +   s   r%   c              	   C   s   |  dpi  dpg }d}|pi }|  dpi  dpi  dp"g }dd |D }t|dd	 d
}|D ]1}	z$t| ||	||rY|	 d}
|
rM|
|v rM|
}nt| |}|pUdW   S W q4 tye   d}Y q4w |rltddS )Nr)   groupsFr*   r+   c                 S   s   g | ]}|d  qS r   r   ).0r"   r   r   r   
<listcomp>D   s    z1match_feature_flag_properties.<locals>.<listcomp>c                 S   s   |  drdS dS )Nr"   r      )r.   )	conditionr   r   r   <lambda>J   s    z/match_feature_flag_properties.<locals>.<lambda>r4   r"   TzGCan't determine if feature flag is enabled or not with given properties)r.   sortedis_condition_matchr(   r   )r&   r   
propertiescohort_propertiesflag_conditionsis_inconclusiveflag_variantsvalid_variant_keyssorted_flag_conditionsr8   variant_overrider"   r   r   r   match_feature_flag_properties:   s@   


	rD   c           	      C   s   | d}t| dpg dkr8| dD ]}| d}|dkr't|||}nt||}|s1 dS q|d u r8dS |d urIt| d ||d	 krIdS dS )
Nr,   r<   r   typecohortFTr   r-   )r.   lenmatch_cohortmatch_propertyr!   )	r0   r   r8   r<   r=   r,   propproperty_typematchesr   r   r   r;   g   s"   


r;   c              
   C   s  |  d}|  dpd}|  d}||vrtd|dkr!td|| }|tvr/|d u r/dS |d	v rFd
d }|dkr@|||S ||| S |dkrN||v S |dkrXt||S |dkrct|| S |dkr{tt|oztt|	t|d uS |dkrtt|ott|	t|d u S |dv rdd }d }zt
|}W n	 ty   Y nw |d ur|d urt|tr||t||S ||||S |t|t||S |dv rdztt|}	|	stt|}	t|	}	W n ty }
 ztd|
d }
~
ww |	stdt|tjrt|}|dkr||	k S ||	kS t|tjr5|dkr/||	 k S ||	 kS t|tr`zt|}t|}|dkrO||	k W S ||	kW S  ty_   tdw tdtd| )Nr   operatorexactvaluez5can't match properties without a given property value
is_not_setz/can't match properties with operator is_not_setF)rN   r
   c                 S   s0   t | trt| dd | D v S t| |S )Nc                 S   s   g | ]}t | qS r   )strcasefold)r5   valr   r   r   r6      s    z?match_property.<locals>.compute_exact_match.<locals>.<listcomp>)
isinstancelistrQ   rR   r   str_iequals)rO   override_valuer   r   r   compute_exact_match   s
   
z+match_property.<locals>.compute_exact_matchis_set	icontainsnot_icontainsregex	not_regex)gtgteltltec                 S   sN   |dkr| |kS |dkr| |kS |dkr| |k S |dkr | |kS t d| )Nr^   r_   r`   ra   zInvalid operator: )
ValueError)lhsrhsrM   r   r   r   compare   s   zmatch_property.<locals>.compare)is_date_beforeis_date_afterz.The date set on the flag is not a valid formatrf   z'The date provided is not a valid formatz1The date provided must be a string or date objectzUnknown operator )r.   r   NONE_VALUES_ALLOWED_OPERATORSr   str_icontainsr   rQ   recompilesearchfloat	ExceptionrT   -relative_date_parse_for_feature_flag_matchingr   parser   datetimedate)propertyproperty_valuesr   rM   rO   rW   rX   re   parsed_valueparsed_dateeoverride_dater   r   r   rI      s   










rI   c                 C   s2   t | d}||vrtd|| }t|||S )NrO   8can't match cohort without a given cohort property value)rQ   r.   r   match_property_group)rs   rt   r=   	cohort_idproperty_groupr   r   r   rH     s   
rH   c           
      C   s  | sdS |  d}|  d}|rt|dkrdS d}d|d v rg|D ]:}zt|||}|dkr6|s5W  dS n|r<W  dS W q" ty\ } ztd| d|  d}W Y d }~q"d }~ww |rctd	|dkS |D ]a}z@| dd
krzt|||}nt||}| dd}	|dkr|s|	sW  dS |r|	rW  dS n|r|	sW  dS |s|	rW  dS W qi ty } ztd| d|  d}W Y d }~qid }~ww |rtd|dkS )NTrE   valuesr   FANDzFailed to compute property z
 locally: z8Can't match cohort without a given cohort property valuerF   negationry   )r.   rG   rz   r   logdebugrH   rI   )
r|   rt   r=   property_group_typer<   error_matching_locallyrJ   rL   rw   r   r   r   r   rz     sn   


rz   rO   c                 C   s   d}t || }tjtjj}|rgt|d}|dkrd S |d}|dkr1|t|d }|S |dkr>|t|d }|S |d	krK|t|d
 }|S |dkrX|t|d }|S |dkre|t|d }|S d S d S )Nz)^-?(?P<number>[0-9]+)(?P<interval>[a-z])$numberi'  intervalh)hoursd)daysw)weeksm)monthsy)years)	rj   rl   rq   nowtimezoneutcr   groupr   )rO   r\   match	parsed_dtr   r   r   r   r   ro   ^  s2   

ro   )r   )N)#rq   r   loggingrj   typingr   dateutilr   dateutil.relativedeltar   r	   r   posthog.typesr   posthog.utilsr   r   rm   r   	getLoggerr   rh   rn   r   rQ   r!   r(   r%   rD   boolr;   rI   rH   rz   ro   r   r   r   r   <module>   sB    

-
 G