1
- from typing import Any , Dict , Optional , List # noqa
1
+ from typing import Any , Dict , Optional , List , Union # noqa
2
2
import linecache
3
3
import logging
4
4
import os
11
11
import bugsnag
12
12
13
13
from 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
+ )
16
20
from bugsnag .error import Error
21
+ from bugsnag .feature_flags import FeatureFlag , FeatureFlagDelegate
17
22
18
23
__all__ = ('Event' ,)
19
24
@@ -31,8 +36,8 @@ class Event:
31
36
"""
32
37
An occurrence of an exception for delivery to Bugsnag
33
38
"""
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' ]
36
41
PAYLOAD_VERSION = "4.0"
37
42
SUPPORTED_SEVERITIES = ["info" , "warning" , "error" ]
38
43
@@ -65,6 +70,10 @@ def __init__(self, exception: BaseException, config, request_config,
65
70
self ._breadcrumbs = [
66
71
deepcopy (breadcrumb ) for breadcrumb in config .breadcrumbs
67
72
]
73
+ self ._feature_flag_delegate = options .pop (
74
+ 'feature_flag_delegate' ,
75
+ FeatureFlagDelegate ()
76
+ ).copy ()
68
77
69
78
def get_config (key ):
70
79
return options .pop (key , getattr (self .config , key ))
@@ -237,6 +246,26 @@ def add_tab(self, name, dictionary):
237
246
238
247
self .metadata [name ].update (dictionary )
239
248
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
+
240
269
def _generate_error_list (
241
270
self ,
242
271
exception : BaseException ,
@@ -397,7 +426,6 @@ def _code_for(self, file_name, line, window_size=7):
397
426
398
427
def _payload (self ):
399
428
# Fetch the notifier version from the package
400
- notifier_version = package_version ("bugsnag" ) or "unknown"
401
429
encoder = SanitizingJSONEncoder (
402
430
self .config .logger ,
403
431
separators = (',' , ':' ),
@@ -407,11 +435,7 @@ def _payload(self):
407
435
# Construct the payload dictionary
408
436
return encoder .encode ({
409
437
"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 ,
415
439
"events" : [{
416
440
"severity" : self .severity ,
417
441
"severityReason" : self .severity_reason ,
@@ -437,6 +461,7 @@ def _payload(self):
437
461
"session" : self .session ,
438
462
"breadcrumbs" : [
439
463
breadcrumb .to_dict () for breadcrumb in self ._breadcrumbs
440
- ]
464
+ ],
465
+ "featureFlags" : self ._feature_flag_delegate .to_json ()
441
466
}]
442
467
})
0 commit comments