fiddler-client 3.3.0.dev1__tar.gz → 3.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. {fiddler_client-3.3.0.dev1/fiddler_client.egg-info → fiddler_client-3.3.2}/PKG-INFO +1 -1
  2. fiddler_client-3.3.2/fiddler/VERSION +1 -0
  3. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/decorators.py +1 -1
  4. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/alert_rule.py +14 -8
  5. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_alert_rule.py +127 -7
  6. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/constants.py +2 -0
  7. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/test_logger.py +2 -2
  8. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2/fiddler_client.egg-info}/PKG-INFO +1 -1
  9. fiddler_client-3.3.0.dev1/fiddler/VERSION +0 -1
  10. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/LICENSE.txt +0 -0
  11. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/MANIFEST.in +0 -0
  12. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/PUBLIC.md +0 -0
  13. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/README.md +0 -0
  14. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/__init__.py +0 -0
  15. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/configs.py +0 -0
  16. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/connection.py +0 -0
  17. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/__init__.py +0 -0
  18. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/alert_rule.py +0 -0
  19. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/baseline.py +0 -0
  20. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/common.py +0 -0
  21. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/dataset.py +0 -0
  22. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/events.py +0 -0
  23. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/job.py +0 -0
  24. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/model.py +0 -0
  25. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/model_deployment.py +0 -0
  26. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/constants/xai.py +0 -0
  27. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/__init__.py +0 -0
  28. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/alert_record.py +0 -0
  29. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/base.py +0 -0
  30. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/baseline.py +0 -0
  31. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/custom_expression.py +0 -0
  32. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/dataset.py +0 -0
  33. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/events.py +0 -0
  34. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/file.py +0 -0
  35. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/job.py +0 -0
  36. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/model.py +0 -0
  37. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/model_artifact.py +0 -0
  38. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/model_deployment.py +0 -0
  39. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/organization.py +0 -0
  40. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/project.py +0 -0
  41. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/surrogate.py +0 -0
  42. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/user.py +0 -0
  43. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/webhook.py +0 -0
  44. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/entities/xai.py +0 -0
  45. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/exceptions.py +0 -0
  46. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/libs/__init__.py +0 -0
  47. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/libs/http_client.py +0 -0
  48. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/libs/json_encoder.py +0 -0
  49. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/libs/semver.py +0 -0
  50. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/packtools/__init__.py +0 -0
  51. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/packtools/gem.py +0 -0
  52. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/packtools/keras_ig_helpers.py +0 -0
  53. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/packtools/project_attributions_helpers.py +0 -0
  54. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/packtools/template_model.py +0 -0
  55. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/__init__.py +0 -0
  56. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/alert_record.py +0 -0
  57. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/alert_rule.py +0 -0
  58. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/base.py +0 -0
  59. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/baseline.py +0 -0
  60. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/custom_expression.py +0 -0
  61. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/custom_features.py +0 -0
  62. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/dataset.py +0 -0
  63. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/events.py +0 -0
  64. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/file.py +0 -0
  65. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/filter_query.py +0 -0
  66. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/job.py +0 -0
  67. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/model.py +0 -0
  68. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/model_deployment.py +0 -0
  69. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/model_schema.py +0 -0
  70. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/model_spec.py +0 -0
  71. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/model_task_params.py +0 -0
  72. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/organization.py +0 -0
  73. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/project.py +0 -0
  74. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/response.py +0 -0
  75. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/server_info.py +0 -0
  76. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/user.py +0 -0
  77. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/webhook.py +0 -0
  78. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/xai.py +0 -0
  79. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/schemas/xai_params.py +0 -0
  80. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/__init__.py +0 -0
  81. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/__init__.py +0 -0
  82. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_alert_record.py +0 -0
  83. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_baseline.py +0 -0
  84. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_custom_metric.py +0 -0
  85. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_dataset.py +0 -0
  86. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_events.py +0 -0
  87. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_files.py +0 -0
  88. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_generate_model.py +0 -0
  89. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_job.py +0 -0
  90. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_mixin.py +0 -0
  91. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_model.py +0 -0
  92. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_model_artifact.py +0 -0
  93. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_model_deployment.py +0 -0
  94. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_model_surrogate.py +0 -0
  95. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_project.py +0 -0
  96. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_segment.py +0 -0
  97. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_webhook.py +0 -0
  98. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/apis/test_xai.py +0 -0
  99. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/conftest.py +0 -0
  100. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/test_connection.py +0 -0
  101. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/test_json_encoder.py +0 -0
  102. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/test_utils.py +0 -0
  103. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/tests/utils.py +0 -0
  104. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/utils/__init__.py +0 -0
  105. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/utils/helpers.py +0 -0
  106. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/utils/logger.py +0 -0
  107. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/utils/model_generator.py +0 -0
  108. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/utils/validations.py +0 -0
  109. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/utils/version.py +0 -0
  110. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler/version.py +0 -0
  111. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler_client.egg-info/SOURCES.txt +0 -0
  112. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler_client.egg-info/dependency_links.txt +0 -0
  113. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler_client.egg-info/requires.txt +0 -0
  114. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/fiddler_client.egg-info/top_level.txt +0 -0
  115. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/setup.cfg +0 -0
  116. {fiddler_client-3.3.0.dev1 → fiddler_client-3.3.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.3.0.dev1
3
+ Version: 3.3.2
4
4
  Summary: Python client for Fiddler Platform
5
5
  Home-page: https://fiddler.ai
6
6
  Author: Fiddler Labs
@@ -0,0 +1 @@
1
+ 3.3.2
@@ -39,7 +39,7 @@ def handle_api_error(func: _WrappedFuncType) -> _WrappedFuncType:
39
39
  error_resp = ErrorResponse(**e.response.json())
40
40
  except requests.JSONDecodeError:
41
41
  raise HttpError(
42
- message=f'Invalid response content-type - {e.response.content}'
42
+ message=f"Invalid response content-type - {e.response.content}" # type: ignore
43
43
  )
44
44
 
45
45
  if status_code == HTTPStatus.CONFLICT:
@@ -5,6 +5,8 @@ from datetime import datetime
5
5
  from typing import Any, Iterator
6
6
  from uuid import UUID
7
7
 
8
+ from pydantic import ValidationError
9
+
8
10
  from fiddler.constants.alert_rule import AlertCondition, BinSize, CompareTo, Priority
9
11
  from fiddler.decorators import handle_api_error
10
12
  from fiddler.entities.base import BaseEntity
@@ -276,14 +278,18 @@ class AlertRule(
276
278
 
277
279
  :return: NotificationConfig object
278
280
  """
279
- payload: dict[str, Any] = {}
280
- if emails is not None:
281
- payload['emails'] = emails
282
- if pagerduty_services is not None:
283
- payload['pagerduty_services'] = pagerduty_services
284
- payload['pagerduty_severity'] = pagerduty_severity
285
- if webhooks is not None:
286
- payload['webhooks'] = webhooks
281
+
282
+ # Validating input
283
+ try:
284
+ payload: dict[str, Any] = NotificationConfig(
285
+ emails=emails,
286
+ pagerduty_services=pagerduty_services,
287
+ pagerduty_severity=pagerduty_severity,
288
+ webhooks=webhooks,
289
+ ).dict(exclude_none=True)
290
+ except ValidationError as e:
291
+ logger.exception('Invalid input: The format of input is not correct')
292
+ raise e
287
293
  response = self._client().patch(
288
294
  url=self._get_notification_url(id_=self.id),
289
295
  data=payload,
@@ -1,10 +1,13 @@
1
1
  import json
2
2
  import logging
3
+ import uuid
4
+ from copy import deepcopy
3
5
  from http import HTTPStatus
4
6
  from uuid import UUID
5
7
 
6
8
  import pytest
7
9
  import responses
10
+ from pydantic import ValidationError
8
11
 
9
12
  from fiddler.constants.alert_rule import AlertCondition, BinSize, CompareTo, Priority
10
13
  from fiddler.entities.alert_rule import AlertRule
@@ -23,6 +26,8 @@ from fiddler.tests.constants import (
23
26
  PROJECT_ID,
24
27
  PROJECT_NAME,
25
28
  TEST_EMAILS,
29
+ TEST_PAGERDUTY_SERVICES,
30
+ TEST_PAGERDUTY_SEVERITY,
26
31
  TEST_WEBHOOKS,
27
32
  URL,
28
33
  )
@@ -76,8 +81,8 @@ API_RESPONSE_200 = {
76
81
 
77
82
  ALERT_NOTIFICATION_API_RESPONSE_200 = {
78
83
  'data': {
79
- 'emails': TEST_EMAILS,
80
- 'webhooks': TEST_WEBHOOKS,
84
+ 'emails': [],
85
+ 'webhooks': [],
81
86
  'pagerduty_services': [],
82
87
  'pagerduty_severity': '',
83
88
  },
@@ -331,28 +336,143 @@ def test_disable_notifications(caplog) -> None:
331
336
 
332
337
 
333
338
  @responses.activate
334
- def test_set_notifications() -> None:
339
+ def test_set_notifications_email() -> None:
335
340
  responses.get(
336
341
  url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
337
342
  json=API_RESPONSE_200,
338
343
  )
339
344
 
340
345
  alert_rule = AlertRule.get(id_=ALERT_RULE_ID)
346
+ notification_resp = deepcopy(ALERT_NOTIFICATION_API_RESPONSE_200)
347
+ notification_resp['data']['emails'] = TEST_EMAILS
341
348
  resp = responses.patch(
342
349
  url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
343
- json=ALERT_NOTIFICATION_API_RESPONSE_200,
350
+ json=notification_resp,
344
351
  )
345
352
  notifications = alert_rule.set_notification_config(
346
353
  emails=TEST_EMAILS,
347
- webhooks=TEST_WEBHOOKS,
348
354
  )
349
355
  assert json.loads(resp.calls[0].request.body) == {
350
356
  'emails': TEST_EMAILS,
357
+ }
358
+ assert notifications == notification_resp['data']
359
+
360
+ # Removing the emails from the notification config
361
+ notification_resp['data']['emails'] = []
362
+ resp = responses.patch(
363
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
364
+ json=notification_resp,
365
+ )
366
+ notifications = alert_rule.set_notification_config(
367
+ emails=[],
368
+ )
369
+ assert json.loads(resp.calls[0].request.body) == {
370
+ 'emails': [],
371
+ }
372
+ assert notifications == notification_resp['data']
373
+
374
+
375
+ @responses.activate
376
+ def test_set_notifications_pagerduty() -> None:
377
+ responses.get(
378
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
379
+ json=API_RESPONSE_200,
380
+ )
381
+
382
+ alert_rule = AlertRule.get(id_=ALERT_RULE_ID)
383
+ notification_resp = deepcopy(ALERT_NOTIFICATION_API_RESPONSE_200)
384
+ notification_resp['data']['pagerduty_services'] = TEST_PAGERDUTY_SERVICES
385
+ notification_resp['data']['pagerduty_severity'] = TEST_PAGERDUTY_SEVERITY
386
+ resp = responses.patch(
387
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
388
+ json=notification_resp,
389
+ )
390
+ notifications = alert_rule.set_notification_config(
391
+ pagerduty_services=TEST_PAGERDUTY_SERVICES,
392
+ pagerduty_severity=TEST_PAGERDUTY_SEVERITY,
393
+ )
394
+
395
+ assert json.loads(resp.calls[0].request.body) == {
396
+ 'pagerduty_services': TEST_PAGERDUTY_SERVICES,
397
+ 'pagerduty_severity': TEST_PAGERDUTY_SEVERITY,
398
+ }
399
+ assert notifications == notification_resp['data']
400
+
401
+ # Removing the webhooks from the notification config
402
+ notification_resp['data']['pagerduty_services'] = []
403
+ notification_resp['data']['pagerduty_severity'] = ''
404
+ resp = responses.patch(
405
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
406
+ json=notification_resp,
407
+ )
408
+ notifications = alert_rule.set_notification_config(
409
+ pagerduty_services=[],
410
+ pagerduty_severity='',
411
+ )
412
+ assert json.loads(resp.calls[0].request.body) == {
413
+ 'pagerduty_services': [],
414
+ 'pagerduty_severity': '',
415
+ }
416
+ assert notifications == notification_resp['data']
417
+
418
+
419
+ @responses.activate
420
+ def test_set_notifications_webhooks() -> None:
421
+ responses.get(
422
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
423
+ json=API_RESPONSE_200,
424
+ )
425
+
426
+ alert_rule = AlertRule.get(id_=ALERT_RULE_ID)
427
+ notification_resp = deepcopy(ALERT_NOTIFICATION_API_RESPONSE_200)
428
+ notification_resp['data']['webhooks'] = TEST_WEBHOOKS
429
+ resp = responses.patch(
430
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
431
+ json=notification_resp,
432
+ )
433
+ notifications = alert_rule.set_notification_config(
434
+ webhooks=TEST_WEBHOOKS,
435
+ )
436
+
437
+ notification_resp['data']['webhooks'] = [
438
+ uuid.UUID(webhook_uuid)
439
+ for webhook_uuid in notification_resp['data']['webhooks']
440
+ ]
441
+ assert json.loads(resp.calls[0].request.body) == {
351
442
  'webhooks': TEST_WEBHOOKS,
352
443
  }
353
- assert notifications == NotificationConfig(
354
- **ALERT_NOTIFICATION_API_RESPONSE_200['data']
444
+ assert notifications == notification_resp['data']
445
+
446
+ # Removing the webhooks from the notification config
447
+ notification_resp['data']['webhooks'] = []
448
+ resp = responses.patch(
449
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
450
+ json=notification_resp,
355
451
  )
452
+ notifications = alert_rule.set_notification_config(
453
+ webhooks=[],
454
+ )
455
+ assert json.loads(resp.calls[0].request.body) == {
456
+ 'webhooks': [],
457
+ }
458
+ assert notifications == notification_resp['data']
459
+
460
+
461
+ @responses.activate
462
+ def test_set_notifications_invalid_input(caplog) -> None:
463
+ responses.get(
464
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
465
+ json=API_RESPONSE_200,
466
+ )
467
+
468
+ alert_rule = AlertRule.get(id_=ALERT_RULE_ID)
469
+
470
+ with pytest.raises(ValidationError):
471
+ alert_rule.set_notification_config(
472
+ emails=TEST_EMAILS[0],
473
+ webhooks=TEST_WEBHOOKS,
474
+ )
475
+ assert 'Invalid input: The format of input is not correct' in caplog.messages[0]
356
476
 
357
477
 
358
478
  @responses.activate
@@ -21,6 +21,8 @@ DATASET_NAME = 'dataset3'
21
21
  BASELINE_ID = 'af05646f-0cef-4638-84c9-0d195df2575d'
22
22
  ALERT_RULE_ID = 'ed8f18e6-c319-4374-8884-71126a6bab85'
23
23
  TEST_EMAILS = ['test@fiddler.ai', 'admin@fiddler.ai']
24
+ TEST_PAGERDUTY_SERVICES = ['service1', 'service2']
25
+ TEST_PAGERDUTY_SEVERITY = 'critical'
24
26
  TEST_WEBHOOKS = [
25
27
  'e20bf4cc-d2cf-4540-baef-d96913b14f1b',
26
28
  '6e796fda-0111-4a72-82cd-f0f219e903e1',
@@ -6,7 +6,7 @@ from fiddler.utils.logger import set_logging
6
6
 
7
7
  def test_set_logging() -> None:
8
8
  app_logger = logging.getLogger(LOGGER_NAME)
9
- assert len(app_logger.handlers) == 0
9
+ assert len(app_logger.handlers) == 2
10
10
 
11
11
  set_logging(level=logging.ERROR)
12
- assert len(app_logger.handlers) == 1
12
+ assert len(app_logger.handlers) == 3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.3.0.dev1
3
+ Version: 3.3.2
4
4
  Summary: Python client for Fiddler Platform
5
5
  Home-page: https://fiddler.ai
6
6
  Author: Fiddler Labs
@@ -1 +0,0 @@
1
- 3.3.0.dev1