
    Ii3                     $   S SK r S SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	  S SK
JrJr  \" S5      r\R                  " S5      rS/r " S	 S
\5      rSS jrS rS rSS jrS rS\4S jrS\4S jrS\4S jrS\S\\ R                      4S jrg)    N)Optional)parser)relativedelta)convert_to_datetime_awareis_valid_regexl   posthogis_notc                       \ rS rSrSrg)InconclusiveMatchError    N)__name__
__module____qualname____firstlineno____static_attributes__r       ;/venv/lib/python3.13/site-packages/posthog/feature_flags.pyr   r      s    r   r   c                     U  SU U 3n[        [        R                  " UR                  S5      5      R	                  5       S S S5      nU[
        -  $ )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    [        U S   USS9n[        U 5       H  nX#S   :  d  M  X#S   :  d  M  US   s  $    g )Nr   variant)r!   	value_min	value_max)r$   variant_lookup_table)flagr    
hash_valuer&   s       r   get_matching_variantr,   !   sG    tE{Ki@J'---*{?S2S5>! . r   c                     / nSnU R                  S5      =(       d    0 R                  S5      =(       d    0 R                  S5      =(       d    / nU H&  nX$S   S-  -   nUR                  X%US   S.5        UnM(     U$ )	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                 N   U R                  S5      =(       d    0 R                  S5      =(       d    / nSnU=(       d    0 n[        US S9nU H  n [        XXrU5      (       a  UR                  S5      nU R                  S5      =(       d    0 R                  S5      =(       d    0 R                  S5      =(       d    / n	U(       a  X V
s/ s H  oS	   PM	     sn
;   a  Un
O[        X5      n
U
=(       d    S
s  $ M     U(       a  [	        S5      egs  sn
f ! [         a    S
n M  f = f)Nr.   groupsFc                 6    U R                  S5      (       a  S$ S$ )Nr&   r      )r3   )	conditions    r   <lambda>/match_feature_flag_properties.<locals>.<lambda>=   s    9==#;#;aBBr   )r   r&   r/   r0   r   TzGCan't determine if feature flag is enabled or not with given properties)r3   sortedis_condition_matchr,   r   )r*   r    
propertiescohort_propertiesflag_conditionsis_inconclusivesorted_flag_conditionsr<   variant_overrideflag_variantsr&   s              r   match_feature_flag_propertiesrH   4   s!   xx	*0b55h?E2OO)/R $B
 ,		# "$YL]^^#,==#; "&((9"5";!@!@!P!VTV [ [\f g mkm#(8[h<i[hPWU^[h<i(i.G24EG$& _	 ,  $%noo  =j
 & 	#"O	#s%   A8D	DDDD$#D$c                 P   UR                  S5      n[        UR                  S5      =(       d    / 5      S:  aT  UR                  S5       H;  nUR                  S5      nUS:X  a  [        XcU5      nO[        Xc5      nU(       a  M;    g   Uc  gUb  [	        U S   U5      US	-  :  a  gg)
Nr1   rA   r   typecohortFTr   r2   )r3   lenmatch_cohortmatch_propertyr$   )	r5   r    r<   rA   rB   r1   propproperty_typematchess	            r   r@   r@   X   s    "';<
9==&,"-1MM,/D HHV,M(&t9JK(:7 0 %%%U0C[*QUgjmUm*nr   returnc                 h   U R                  S5      nU R                  S5      =(       d    SnU R                  S5      nX!;  a  [        S5      eUS:X  a  [        S5      eX   nU[        ;  a  Uc  gUS	;   a  S
 nUS:X  a  U" XE5      $ U" XE5      (       + $ US:X  a  X!;   $ US:X  a3  [        U5      R	                  5       [        U5      R	                  5       ;   $ US:X  a3  [        U5      R	                  5       [        U5      R	                  5       ;  $ US:X  aT  [        [        U5      5      =(       a9    [        R                  " [        U5      5      R                  [        U5      5      S L$ US:X  aT  [        [        U5      5      =(       a9    [        R                  " [        U5      5      R                  [        U5      5      S L $ US;   ad  S nS n [        U5      nUb4  Ub1  [        U[        5      (       a  U" U[        U5      U5      $ U" XXU5      $ U" [        U5      [        U5      U5      $ US;   Ga)   [        [        U5      5      n	U	(       d*  [        R                  " [        U5      5      n	[        U	5      n	U	(       d  [        S5      e[        U[         R                   5      (       a  [        U5      nUS:X  a  X:  $ X:  $ [        U[         R"                  5      (       a*  US:X  a  XYR#                  5       :  $ XYR#                  5       :  $ [        U[        5      (       a0   [        R                  " U5      n[        U5      nUS:X  a  X:  $ X:  $ [        S5      e[        SU 35      e! [         a     GNf = f! [         a  n
[        S5      U
eS n
A
ff = f! [         a    [        S5      ef = f)Nr   operatorexactvaluez5can't match properties without a given property value
is_not_setz/can't match properties with operator is_not_setF)rU   r	   c                 $   [        U [        5      (       aD  [        U5      R                  5       U  Vs/ s H  n[        U5      R                  5       PM     sn;   $ [        U 5      R                  5       [        U5      R                  5       :H  $ s  snf N)
isinstanceliststrlower)rV   override_valuevals      r   compute_exact_match+match_property.<locals>.compute_exact_match   sq    %&&>*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    US:X  a  X:  $ US:X  a  X:  $ US:X  a  X:  $ US:X  a  X:*  $ [        SU 35      e)Nrg   rh   ri   rj   zInvalid operator: )
ValueError)lhsrhsrT   s      r   comparematch_property.<locals>.compare   sU    4y U"z!T!y U"z! #5hZ!@AAr   )is_date_beforeis_date_afterz.The date set on the flag is not a valid formatrq   z'The date provided is not a valid formatz1The date provided must be a string or date objectzUnknown operator )r3   r   NONE_VALUES_ALLOWED_OPERATORSr\   r]   r   recompilesearchfloat	ExceptionrZ   -relative_date_parse_for_feature_flag_matchingr   parser   datetimedate)propertyproperty_valuesr   rT   rV   r^   r`   ro   parsed_valueparsed_dateeoverride_dates               r   rN   rN   m   s    ,,u
C||J'27HLL!E
!$%\]]<$%VWW$)N55>;Q&&	E
 w&u==*5AAA8%%;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85nEM++$22$226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=   M, 6AM= $*N N ,
M:9M:=
NNNN1c                 v    [        U R                  S5      5      nX2;  a  [        S5      eX#   n[        XAU5      $ )NrV   8can't match cohort without a given cohort property value)r\   r3   r   match_property_group)r}   r~   rB   	cohort_idproperty_groups        r   rM   rM      s?     HLL)*I)$%_``&1NARSSr   c                 X   U (       d  gU R                  S5      nU R                  S5      nU(       a  [        U5      S:X  a  gSnSUS   ;   aG  U H*  n [        XaU5      nUS:X  a  U(       d    gM!  U(       a    gM,     U(       a  [        S	5      eUS:H  $ U H  n UR                  S5      S
:X  a  [        XaU5      nO[        Xa5      nUR                  SS5      n	US:X  a$  U(       d	  U	(       d    gU(       a  U	(       a    gMk  Mm  U(       a	  U	(       d    gU(       d  U	(       a    gM  M     U(       a  [        S5      eUS:H  $ ! [         a)  n[        R                  SU SU 35        Sn S nAGM  S nAff = f! [         a)  n[        R                  SU SU 35        Sn S nAGM  S nAff = f)NTrJ   valuesr   FANDzFailed to compute property z
 locally: z8Can't match cohort without a given cohort property valuerK   negationr   )r3   rL   r   r   logdebugrM   rN   )
r   r~   rB   property_group_typerA   error_matching_locallyrO   rQ   r   r   s
             r   r   r      s   (,,V4##H-JZA-":a= D..tFWX&%/"$ # #   "()cdd"e++ D.88F#x/*4BSTG,TCG88J6&%/"8$8$ $,w x#"x# (07' 2 "()cdd #e++O * .		7vZsKL)-&.> * .		7vZsKL)-&.sI   E 0E AE6/E6E6E6 
E3
E..E36
F) F$$F)rV   c                    Sn[         R                  " X5      n[        R                  R                  [        R                  R
                  5      nU(       a  [        UR                  S5      5      nUS:  a  g UR                  S5      nUS:X  a  U[        US9-
  nU$ US:X  a  U[        US9-
  nU$ US	:X  a  U[        US
9-
  nU$ US:X  a  U[        US9-
  nU$ US:X  a  U[        US9-
  nU$ g g )Nz)^-?(?P<number>[0-9]+)(?P<interval>[a-z])$numberi'  intervalh)hoursd)daysw)weeksm)monthsy)years)	rt   rv   r{   nowtimezoneutcr   groupr   )rV   re   match	parsed_dtr   r   s         r   ry   ry   5  s   8EIIe#E!!%%h&7&7&;&;<IU[[*+V;;z*s?!M$??I  _!Mv$>>I  _!M$??I  _!M$@@I  _!M$??I   r   ) rY   )r{   r   loggingrt   typingr   dateutilr   dateutil.relativedeltar   posthog.utilsr   r   rw   r   	getLoggerr   rs   rx   r   r$   r,   r)   rH   r@   boolrN   rM   r   r\   ry   r   r   r   <module>r      s       	   0 C()	"!)
 	Y 	%!H*pA pAfT$ T$@,PT @,F (J[J[A\ r   