o
    g3                     @   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mZ edZedZdgZG d	d
 d
eZd ddZdd Zdd Zd!ddZ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)convert_to_datetime_awareis_valid_regexl   posthogis_notc                   @   s   e Zd ZdS )InconclusiveMatchErrorN)__name__
__module____qualname__ r   r   L/var/www/visachat/venv/lib/python3.10/site-packages/posthog/feature_flags.pyr	      s    r	    c                 C   s<   |  d| | }t t|d d d d}|t S )N.zutf-8      )inthashlibsha1encode	hexdigest__LONG_SCALE__)keydistinct_idsalt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 }t|dd d}|D ]G}z:t| ||||rW| d}|  dp2i  dp7i  d	p<g }	|rK|d
d |	D v rK|}
nt| |}
|
pSdW   S W q tyc   d}Y qw |rjtddS )Nr&   groupsFc                 S   s   |  drdS dS )Nr   r      )r+   )	conditionr   r   r   <lambda>=   s    z/match_feature_flag_properties.<locals>.<lambda>r   r   r'   r(   c                 S   s   g | ]}|d  qS r4   r   ).0r   r   r   r   
<listcomp>H   s    z1match_feature_flag_properties.<locals>.<listcomp>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sorted_flag_conditionsr2   variant_overrideflag_variantsr   r   r   r   match_feature_flag_properties4   s.   
"
	r@   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)   r9   r   typecohortFTr   r*   )r+   lenmatch_cohortmatch_propertyr   )	r-   r   r2   r9   r:   r)   propproperty_typematchesr   r   r   r8   X   s   


r8   returnc              
   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r^t| t| v S |dkrnt| t| vS |dkrtt|ot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 rpz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rA|dkr;||	 k S ||	 kS t|trlzt|}t|}|dkr[||	k W S ||	kW S  t
yk   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)rK   r   c                 S   s<   t | trt| dd | D v S t|  t| kS )Nc                 S   s   g | ]}t | qS r   )strlower)r5   valr   r   r   r6      s    z?match_property.<locals>.compute_exact_match.<locals>.<listcomp>)
isinstancelistrN   rO   )rL   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| )NrZ   r[   r\   r]   zInvalid operator: )
ValueError)lhsrhsrJ   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 formatrb   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_OPERATORSrN   rO   r   recompilesearchfloat	ExceptionrQ   -relative_date_parse_for_feature_flag_matchingr   parser   datetimedate)propertyproperty_valuesr   rJ   rL   rS   rT   ra   parsed_valueparsed_dateeoverride_dater   r   r   rE   m   s   


((








rE   c                 C   s2   t | d}||vrtd|| }t|||S )NrL   8can't match cohort without a given cohort property value)rN   r+   r	   match_property_group)rn   ro   r:   	cohort_idproperty_groupr   r   r   rD      s
   
rD   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 )NTrA   valuesr   FANDzFailed to compute property z
 locally: z8Can't match cohort without a given cohort property valuerB   negationrt   )r+   rC   ru   r	   logdebugrD   rE   )
rw   ro   r:   property_group_typer9   error_matching_locallyrF   rH   rr   rz   r   r   r   ru      sf   


ru   rL   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)	re   rg   rl   nowtimezoneutcr   groupr   )rL   rX   match	parsed_dtr   r   r   r   r   rj   5  s2   

rj   )r   )N)rl   r   loggingre   typingr   dateutilr   dateutil.relativedeltar   posthog.utilsr   r   rh   r   	getLoggerr{   rd   ri   r	   r   r%   r"   r@   r8   boolrE   rD   ru   rN   rj   r   r   r   r   <module>   s*    


$sC