
    g3                        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j                  d      ZdgZ G d	 d
e      ZddZd Zd ZddZd ZdefdZdefdZdefdZdedee j                      fdZy)    N)Optional)parser)relativedelta)convert_to_datetime_awareis_valid_regexl   posthogis_notc                       e Zd Zy)InconclusiveMatchErrorN)__name__
__module____qualname__     J/var/www/openai/venv/lib/python3.12/site-packages/posthog/feature_flags.pyr   r      s    r   r   c                     |  d| | }t        t        j                  |j                  d            j	                         d d d      }|t
        z  S )N.zutf-8      )inthashlibsha1encode	hexdigest__LONG_SCALE__)keydistinct_idsalthash_keyhash_vals        r   _hashr!      sO    a}TF+H7<< 89CCEcrJBOHn$$r   c                 v    t        | d   |d      }t        |       D ]  }||d   k\  s||d   k  s|d   c S  y )Nr   variant)r   	value_min	value_max)r!   variant_lookup_table)flagr   
hash_valuer#   s       r   get_matching_variantr)   !   sK    tE{Ki@J'---*w{?S2S5>! . r   c                     g }d}| j                  d      xs i j                  d      xs i j                  d      xs g }|D ]'  }||d   dz  z   }|j                  |||d   d       |}) |S )	Nr   filtersmultivariatevariantsrollout_percentaged   r   )r$   r%   r   )getappend)feature_flaglookup_tabler$   multivariatesr#   r%   s         r   r&   r&   )   s    LI"&&y17R<<^LRPRWWXbcigiM (< = CC	))T[\aTbcd	 ! r   c                    | j                  d      xs i j                  d      xs g }d}|xs i }t        |d       }|D ]  }	 t        | ||||      rz|j                  d      }| j                  d      xs i j                  d      xs i j                  d      xs g }	|r||	D 
cg c]  }
|
d	   	 c}
v r|}
nt        | |      }
|
xs d
c S  |rt	        d      yc c}
w # t        $ r d
}Y w xY w)Nr+   groupsFc                 ,    | j                  d      rdS dS )Nr#   r      )r0   )	conditions    r   <lambda>z/match_feature_flag_properties.<locals>.<lambda>=   s    9==#;aBBr   )r   r#   r,   r-   r   TzGCan't determine if feature flag is enabled or not with given properties)r0   sortedis_condition_matchr)   r   )r'   r   
propertiescohort_propertiesflag_conditionsis_inconclusivesorted_flag_conditionsr9   variant_overrideflag_variantsr#   s              r   match_feature_flag_propertiesrD   4   s&   xx	*0b55h?E2OO)/R $B
 ,		# "$Y
L]^#,==#; "&((9"5";!@!@!P!VTV [ [\f g mkm#(8[h<i[hPWWU^[h<i(i.G24EG$& _	 ,  $%noo  =j
 & 	#"O	#s%   A"C#'C3C#C##C10C1c                 2   |j                  d      }t        |j                  d      xs g       dkD  rM|j                  d      D ]6  }|j                  d      }|dk(  rt        |||      }nt        ||      }|r6 y |y|t	        | d   |      |d	z  kD  ryy)
Nr.   r=   r   typecohortFTr   r/   )r0   lenmatch_cohortmatch_propertyr!   )	r2   r   r9   r=   r>   r.   propproperty_typematchess	            r   r<   r<   X   s    "';<
9==&,"-1MM,/D HHV,M(&tZ9JK(z: 0 %%%U0C[*QUgjmUm*nr   returnc                    | j                  d      }| j                  d      xs d}| j                  d      }||vrt        d      |dk(  rt        d      ||   }|t        vr|y|d	v rd
 }|dk(  r	 |||      S  |||       S |dk(  r||v S |dk(  r2t        |      j	                         t        |      j	                         v S |dk(  r2t        |      j	                         t        |      j	                         vS |dk(  rNt        t        |            xr8 t        j                  t        |            j                  t        |            d uS |dk(  rNt        t        |            xr8 t        j                  t        |            j                  t        |            d u S |dv r^d }d }	 t        |      }|/|-t        |t              r ||t        |      |      S  ||||      S  |t        |      t        |      |      S |dv r	 t        t        |            }	|	s)t        j                  t        |            }	t        |	      }	|	st        d      t        |t         j                         rt        |      }|dk(  r||	k  S ||	kD  S t        |t         j"                        r+|dk(  r||	j#                         k  S ||	j#                         kD  S t        |t              r0	 t        j                  |      }t        |      }|dk(  r||	k  S ||	kD  S t        d      t        d|       # t        $ r Y }w xY w# t        $ r}
t        d      |
d }
~
ww xY w# t        $ r t        d      w xY w)Nr   operatorexactvaluez5can't match properties without a given property value
is_not_setz/can't match properties with operator is_not_setF)rQ   r	   c                    t        | t              r@t        |      j                         | D cg c]  }t        |      j                          c}v S t        |       j                         t        |      j                         k(  S c c}w N)
isinstanceliststrlower)rR   override_valuevals      r   compute_exact_matchz+match_property.<locals>.compute_exact_match   sn    %&>*002SX6YSXCs3x~~7GSX6YYYu:##%^)<)B)B)DDD 7Zs    Bis_set	icontainsnot_icontainsregex	not_regex)gtgteltltec                 n    |dk(  r| |kD  S |dk(  r| |k\  S |dk(  r| |k  S |dk(  r| |k  S t        d|       )Nrb   rc   rd   re   zInvalid operator: )
ValueError)lhsrhsrP   s      r   comparezmatch_property.<locals>.compare   s]    4Sy U"cz!T!Sy U"cz! #5hZ!@AAr   )is_date_beforeis_date_afterz.The date set on the flag is not a valid formatrk   z'The date provided is not a valid formatz1The date provided must be a string or date objectzUnknown operator )r0   r   NONE_VALUES_ALLOWED_OPERATORSrX   rY   r   recompilesearchfloat	ExceptionrV   -relative_date_parse_for_feature_flag_matchingr   parser   datetimedate)propertyproperty_valuesr   rP   rR   rZ   r\   rj   parsed_valueparsed_dateeoverride_dates               r   rJ   rJ   m   s    ,,u
C||J'27HLL!E
/!$%\]]<$%VWW$S)N55>;Q&&	E
 w&un==*5.AAA8o%%;5z!S%8%>%>%@@@?"5z!^)<)B)B)DDD7c%j)lbjjU.D.K.KCP^L_.`hl.ll;c%j)hbjjU.D.K.KCP^L_.`dh.hh--
	B 	 <L #(B.#.~s5z8DD~|XFF3~.E
HEE66	bGE
SK$ll3u:67D ()YZZnh&7&785nEM++${22${226++%(8(8(:::%(8(8(:::,X &^ < 9- H//(;66(;66 ))\]] !#4XJ!?
@@c  		$  	b()YZ`aa	b2  X,-VWWXs<   -L) ?L9 !)M M )	L65L69	MMMM+c                 x    t        | j                  d            }||vrt        d      ||   }t        |||      S )NrR   8can't match cohort without a given cohort property value)rX   r0   r   match_property_group)rw   rx   r>   	cohort_idproperty_groups        r   rI   rI      sF     HLL)*I))$%_``&y1NARSSr   c                    | sy| j                  d      }| j                  d      }|rt        |      dk(  ryd}d|d   v r4|D ]  }	 t        |||      }|dk(  r|s y|r y |rt        d	      |dk(  S |D ]`  }	 |j                  d      d
k(  rt        |||      }nt        ||      }|j                  dd      }	|dk(  r|s|	s y|r|	r y|r|	s y|s|	r yb |rt        d      |dk(  S # t        $ r'}t        j                  d| d|        d}Y d }~d }~ww xY w# t        $ r'}t        j                  d| d|        d}Y d }~d }~ww xY w)NTrF   valuesr   FANDzFailed to compute property z
 locally: z8Can't match cohort without a given cohort property valuerG   negationr~   )r0   rH   r   r   logdebugrI   rJ   )
r   rx   r>   property_group_typer=   error_matching_locallyrK   rM   r{   r   s
             r   r   r      s   (,,V4##H-JZA-":a= D..t_FWX&%/"$ #  "()cdd"e++ D.88F#x/*4BSTG,T?CG88J6&%/"8$8$ x#"x#) 2 "()cdd #e++O * .		7vZsKL)-&.> * .		7vZsKL)-&.sI   C+C+:A	DDDD+	D4DD	E'E		ErR   c                    d}t        j                  ||       }t        j                  j                  t        j                  j
                        }|rt        |j                  d            }|dk\  ry |j                  d      }|dk(  r|t        |      z
  }|S |dk(  r|t        |      z
  }|S |d	k(  r|t        |
      z
  }|S |dk(  r|t        |      z
  }|S |dk(  r|t        |      z
  }|S y y )Nz)^-?(?P<number>[0-9]+)(?P<interval>[a-z])$numberi'  intervalh)hoursd)daysw)weeksm)monthsy)years)	rn   rp   ru   nowtimezoneutcr   groupr   )rR   r`   match	parsed_dtr   r   s         r   rs   rs   5  s   8EIIeU#E!!%%h&7&7&;&;<IU[[*+V;;z*s?!M$??I  _!Mv$>>I  _!M$??I  _!M$@@I  _!M$??I   r   ) rU   )ru   r   loggingrn   typingr   dateutilr   dateutil.relativedeltar   posthog.utilsr   r   rq   r   	getLoggerr   rm   rr   r   r!   r)   r&   rD   r<   boolrJ   rI   r   rX   rs   r   r   r   <module>r      s       	   0 C()g	"!)
 	Y 	%!H*pA pAfT$ T$@,PT @,F (J[J[A\ r   