2424from requests .auth import HTTPBasicAuth
2525import urllib3
2626
27- __version__ = '4.11.1'
28- VERSION = __version__ # TODO: remove when bumping major version.
27+ from typing import Optional
2928
30- logger = logging .getLogger (__name__ )
29+ from .flags .local_feature_flags import LocalFeatureFlagsProvider
30+ from .flags .remote_feature_flags import RemoteFeatureFlagsProvider
31+ from .flags .types import LocalFlagsConfig , RemoteFlagsConfig
32+
33+ __version__ = '5.0.0b1'
3134
35+ logger = logging .getLogger (__name__ )
3236
3337class DatetimeSerializer (json .JSONEncoder ):
3438 def default (self , obj ):
@@ -44,7 +48,7 @@ def json_dumps(data, cls=None):
4448 return json .dumps (data , separators = (',' , ':' ), cls = cls )
4549
4650
47- class Mixpanel (object ):
51+ class Mixpanel ():
4852 """Instances of Mixpanel are used for all events and profile updates.
4953
5054 :param str token: your project's Mixpanel token
@@ -59,17 +63,40 @@ class Mixpanel(object):
5963 The *serializer* parameter.
6064 """
6165
62- def __init__ (self , token , consumer = None , serializer = DatetimeSerializer ):
66+ def __init__ (self , token , consumer = None , serializer = DatetimeSerializer , local_flags_config : Optional [ LocalFlagsConfig ] = None , remote_flags_config : Optional [ RemoteFlagsConfig ] = None ):
6367 self ._token = token
6468 self ._consumer = consumer or Consumer ()
6569 self ._serializer = serializer
6670
71+ self ._local_flags_provider = None
72+ self ._remote_flags_provider = None
73+
74+ if local_flags_config :
75+ self ._local_flags_provider = LocalFeatureFlagsProvider (self ._token , local_flags_config , __version__ , self .track )
76+
77+ if remote_flags_config :
78+ self ._remote_flags_provider = RemoteFeatureFlagsProvider (self ._token , remote_flags_config , __version__ , self .track )
79+
6780 def _now (self ):
6881 return time .time ()
6982
7083 def _make_insert_id (self ):
7184 return uuid .uuid4 ().hex
7285
86+ @property
87+ def local_flags (self ) -> LocalFeatureFlagsProvider :
88+ """Get the local flags provider if configured for it"""
89+ if self ._local_flags_provider is None :
90+ raise MixpanelException ("No local flags provider initialized. Pass local_flags_config to constructor." )
91+ return self ._local_flags_provider
92+
93+ @property
94+ def remote_flags (self ) -> RemoteFeatureFlagsProvider :
95+ """Get the remote flags provider if configured for it"""
96+ if self ._remote_flags_provider is None :
97+ raise MixpanelException ("No remote_flags_config was passed to the consttructor" )
98+ return self ._remote_flags_provider
99+
73100 def track (self , distinct_id , event_name , properties = None , meta = None ):
74101 """Record an event.
75102
@@ -504,6 +531,24 @@ def group_update(self, message, meta=None):
504531 record .update (meta )
505532 self ._consumer .send ('groups' , json_dumps (record , cls = self ._serializer ))
506533
534+ def __enter__ (self ):
535+ return self
536+
537+ def __exit__ (self , exc_type , exc_val , exc_tb ):
538+ if self ._local_flags_provider is not None :
539+ self ._local_flags_provider .__exit__ (exc_type , exc_val , exc_tb )
540+ if self ._remote_flags_provider is not None :
541+ self ._remote_flags_provider .__exit__ (exc_type , exc_val , exc_tb )
542+
543+ async def __aenter__ (self ):
544+ return self
545+
546+ async def __aexit__ (self , exc_type , exc_val , exc_tb ):
547+ if self ._local_flags_provider is not None :
548+ await self ._local_flags_provider .__aexit__ (exc_type , exc_val , exc_tb )
549+ if self ._remote_flags_provider is not None :
550+ await self ._remote_flags_provider .__aexit__ (exc_type , exc_val , exc_tb )
551+
507552
508553class MixpanelException (Exception ):
509554 """Raised by consumers when unable to send messages.
@@ -733,3 +778,4 @@ def _flush_endpoint(self, endpoint):
733778 raise mp_e from orig_e
734779 buf = buf [self ._max_size :]
735780 self ._buffers [endpoint ] = buf
781+
0 commit comments