1- from typing import Any , Dict , Optional , List # noqa
1+ from typing import Any , Dict , Optional , List , Union # noqa
22import linecache
33import logging
44import os
1111import bugsnag
1212
1313from bugsnag .breadcrumbs import Breadcrumb
14- from bugsnag .utils import fully_qualified_class_name as class_name
15- from bugsnag .utils import FilterDict , package_version , SanitizingJSONEncoder
14+ from bugsnag .notifier import _NOTIFIER_INFORMATION
15+ from bugsnag .utils import (
16+ fully_qualified_class_name as class_name ,
17+ FilterDict ,
18+ SanitizingJSONEncoder
19+ )
1620from bugsnag .error import Error
21+ from bugsnag .feature_flags import FeatureFlag , FeatureFlagDelegate
1722
1823__all__ = ('Event' ,)
1924
@@ -31,8 +36,8 @@ class Event:
3136 """
3237 An occurrence of an exception for delivery to Bugsnag
3338 """
34- NOTIFIER_NAME = "Python Bugsnag Notifier"
35- NOTIFIER_URL = "https://github.com/bugsnag/bugsnag-python"
39+ NOTIFIER_NAME = _NOTIFIER_INFORMATION [ 'name' ]
40+ NOTIFIER_URL = _NOTIFIER_INFORMATION [ 'url' ]
3641 PAYLOAD_VERSION = "4.0"
3742 SUPPORTED_SEVERITIES = ["info" , "warning" , "error" ]
3843
@@ -65,6 +70,10 @@ def __init__(self, exception: BaseException, config, request_config,
6570 self ._breadcrumbs = [
6671 deepcopy (breadcrumb ) for breadcrumb in config .breadcrumbs
6772 ]
73+ self ._feature_flag_delegate = options .pop (
74+ 'feature_flag_delegate' ,
75+ FeatureFlagDelegate ()
76+ ).copy ()
6877
6978 def get_config (key ):
7079 return options .pop (key , getattr (self .config , key ))
@@ -237,6 +246,26 @@ def add_tab(self, name, dictionary):
237246
238247 self .metadata [name ].update (dictionary )
239248
249+ @property
250+ def feature_flags (self ) -> List [FeatureFlag ]:
251+ return self ._feature_flag_delegate .to_list ()
252+
253+ def add_feature_flag (
254+ self ,
255+ name : Union [str , bytes ],
256+ variant : Union [None , str , bytes ] = None
257+ ) -> None :
258+ self ._feature_flag_delegate .add (name , variant )
259+
260+ def add_feature_flags (self , feature_flags : List [FeatureFlag ]) -> None :
261+ self ._feature_flag_delegate .merge (feature_flags )
262+
263+ def clear_feature_flag (self , name : Union [str , bytes ]) -> None :
264+ self ._feature_flag_delegate .remove (name )
265+
266+ def clear_feature_flags (self ) -> None :
267+ self ._feature_flag_delegate .clear ()
268+
240269 def _generate_error_list (
241270 self ,
242271 exception : BaseException ,
@@ -397,7 +426,6 @@ def _code_for(self, file_name, line, window_size=7):
397426
398427 def _payload (self ):
399428 # Fetch the notifier version from the package
400- notifier_version = package_version ("bugsnag" ) or "unknown"
401429 encoder = SanitizingJSONEncoder (
402430 self .config .logger ,
403431 separators = (',' , ':' ),
@@ -407,11 +435,7 @@ def _payload(self):
407435 # Construct the payload dictionary
408436 return encoder .encode ({
409437 "apiKey" : self .api_key ,
410- "notifier" : {
411- "name" : self .NOTIFIER_NAME ,
412- "url" : self .NOTIFIER_URL ,
413- "version" : notifier_version ,
414- },
438+ "notifier" : _NOTIFIER_INFORMATION ,
415439 "events" : [{
416440 "severity" : self .severity ,
417441 "severityReason" : self .severity_reason ,
@@ -437,6 +461,7 @@ def _payload(self):
437461 "session" : self .session ,
438462 "breadcrumbs" : [
439463 breadcrumb .to_dict () for breadcrumb in self ._breadcrumbs
440- ]
464+ ],
465+ "featureFlags" : self ._feature_flag_delegate .to_json ()
441466 }]
442467 })
0 commit comments