fiddler-client 3.3.1__py3-none-any.whl → 3.4.0.dev2__py3-none-any.whl

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.
fiddler/VERSION CHANGED
@@ -1 +1 @@
1
- 3.3.1
1
+ 3.4.0.dev2
@@ -286,7 +286,7 @@ class AlertRule(
286
286
  pagerduty_services=pagerduty_services,
287
287
  pagerduty_severity=pagerduty_severity,
288
288
  webhooks=webhooks,
289
- ).dict()
289
+ ).dict(exclude_none=True)
290
290
  except ValidationError as e:
291
291
  logger.exception('Invalid input: The format of input is not correct')
292
292
  raise e
fiddler/entities/xai.py CHANGED
@@ -89,44 +89,6 @@ class XaiMixin:
89
89
 
90
90
  return namedtuple('Explain', response.json()['data'])(**response.json()['data'])
91
91
 
92
- @handle_api_error
93
- def get_fairness(
94
- self,
95
- data_source: DatasetDataSource | SqlSliceQueryDataSource,
96
- protected_features: list[str],
97
- positive_outcome: str | int | float | bool,
98
- score_threshold: float | None = None,
99
- ) -> tuple:
100
- """
101
- Get fairness analysis on a dataset or a slice.
102
-
103
- :param data_source: DataSource for the input dataset to compute
104
- fairness on (DatasetDataSource or SqlSliceQueryDataSource)
105
- :param protected_features: list of protected attribute names to compute
106
- Fairness analysis on
107
- :param positive_outcome: name of the positive outcome to compute
108
- Fairness analysis on
109
- :param score_threshold: Binary threshold value (between 0 and 1). Default to 0.5
110
-
111
- :return: A named tuple with the fairness results.
112
- """
113
- self._check_id_attributes()
114
-
115
- payload: dict[str, Any] = {
116
- 'model_id': self.id,
117
- 'data_source': data_source.dict(exclude_none=True),
118
- 'protected_features': protected_features,
119
- 'positive_outcome': positive_outcome,
120
- }
121
- if score_threshold:
122
- payload['score_threshold'] = score_threshold
123
-
124
- response = self._client().post(url='/v3/analytics/fairness', data=payload)
125
-
126
- return namedtuple('Fairness', response.json()['data'])(
127
- **response.json()['data']
128
- )
129
-
130
92
  @handle_api_error
131
93
  def get_slice(
132
94
  self,
@@ -1,5 +1,7 @@
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
 
@@ -24,6 +26,8 @@ from fiddler.tests.constants import (
24
26
  PROJECT_ID,
25
27
  PROJECT_NAME,
26
28
  TEST_EMAILS,
29
+ TEST_PAGERDUTY_SERVICES,
30
+ TEST_PAGERDUTY_SEVERITY,
27
31
  TEST_WEBHOOKS,
28
32
  URL,
29
33
  )
@@ -77,8 +81,8 @@ API_RESPONSE_200 = {
77
81
 
78
82
  ALERT_NOTIFICATION_API_RESPONSE_200 = {
79
83
  'data': {
80
- 'emails': TEST_EMAILS,
81
- 'webhooks': TEST_WEBHOOKS,
84
+ 'emails': [],
85
+ 'webhooks': [],
82
86
  'pagerduty_services': [],
83
87
  'pagerduty_severity': '',
84
88
  },
@@ -332,30 +336,126 @@ def test_disable_notifications(caplog) -> None:
332
336
 
333
337
 
334
338
  @responses.activate
335
- def test_set_notifications() -> None:
339
+ def test_set_notifications_email() -> None:
336
340
  responses.get(
337
341
  url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
338
342
  json=API_RESPONSE_200,
339
343
  )
340
344
 
341
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
342
348
  resp = responses.patch(
343
349
  url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
344
- json=ALERT_NOTIFICATION_API_RESPONSE_200,
350
+ json=notification_resp,
345
351
  )
346
352
  notifications = alert_rule.set_notification_config(
347
353
  emails=TEST_EMAILS,
348
- webhooks=TEST_WEBHOOKS,
349
354
  )
350
355
  assert json.loads(resp.calls[0].request.body) == {
351
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) == {
352
442
  'webhooks': TEST_WEBHOOKS,
353
- 'pagerduty_services': None,
354
- 'pagerduty_severity': None,
355
443
  }
356
- assert notifications == NotificationConfig(
357
- **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,
358
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']
359
459
 
360
460
 
361
461
  @responses.activate
@@ -219,104 +219,6 @@ EXPLAIN_RESPONSE_200 = {
219
219
  'kind': 'NORMAL',
220
220
  }
221
221
 
222
- FAIRNESS_RESPONSE_200 = {
223
- 'data': {
224
- 'protected_attributes': ['Gender'],
225
- 'label_distribution': {
226
- 'columns': ['Gender', 'data_label', 'count'],
227
- 'labels': [
228
- ['Female', 'Churned', 79],
229
- ['Female', 'Not Churned', 377],
230
- ['Male', 'Churned', 39],
231
- ['Male', 'Not Churned', 505],
232
- ],
233
- },
234
- 'model_outcomes': {
235
- 'columns': ['Gender', 'model_outcome', 'count'],
236
- 'outcomes': [
237
- ['Female', 'Churned', 51],
238
- ['Female', 'Not Churned', 405],
239
- ['Male', 'Churned', 28],
240
- ['Male', 'Not Churned', 516],
241
- ],
242
- },
243
- 'technical_metrics': {
244
- 'columns': [
245
- 'Gender',
246
- 'true_positive_rate',
247
- 'false_positive_rate',
248
- 'true_negative_rate',
249
- 'false_negative_rate',
250
- 'false_omission_rate',
251
- 'false_discovery_rate',
252
- ],
253
- 'values': [
254
- [
255
- 'Female',
256
- 0.569620253164557,
257
- 0.015915119363395226,
258
- 0.9840848806366048,
259
- 0.43037974683544306,
260
- 0.08395061728395062,
261
- 0.11764705882352941,
262
- ],
263
- [
264
- 'Male',
265
- 0.5897435897435898,
266
- 0.009900990099009901,
267
- 0.9900990099009901,
268
- 0.41025641025641024,
269
- 0.031007751937984496,
270
- 0.17857142857142858,
271
- ],
272
- ],
273
- },
274
- 'fairness_metrics': {
275
- 'demographic_parity': {
276
- 'index': ['dp'],
277
- 'columns': ['Female', 'Male'],
278
- 'data': [[0.1118421052631579, 0.051470588235294115]],
279
- 'ratio': 0.4602076124567474,
280
- },
281
- 'equal_opportunity': {
282
- 'index': ['tpr'],
283
- 'columns': ['Female', 'Male'],
284
- 'data': [[0.569620253164557, 0.5897435897435898]],
285
- 'ratio': 0.9658778205833792,
286
- },
287
- 'group_benefit_equality': {
288
- 'index': ['group_benefit'],
289
- 'columns': ['Female', 'Male'],
290
- 'data': [[0.6455696202531646, 0.717948717948718]],
291
- 'ratio': 0.8991862567811935,
292
- },
293
- 'disparate_impact': {
294
- 'pairs': [
295
- {
296
- 'reference': ['Female'],
297
- 'groups': [['Male']],
298
- 'values': [0.4602076124567474],
299
- },
300
- {
301
- 'reference': ['Male'],
302
- 'groups': [['Female']],
303
- 'values': [0.4602076124567474],
304
- },
305
- ],
306
- 'absolute_min': {
307
- 'groups': [['Female'], ['Male']],
308
- 'value': 0.4602076124567474,
309
- },
310
- },
311
- },
312
- 'model_task': 'BINARY_CLASSIFICATION',
313
- 'total_samples': 1000,
314
- 'valid_samples': 1000,
315
- },
316
- 'api_version': '3.0',
317
- 'kind': 'NORMAL',
318
- }
319
-
320
222
  FETCH_SLICE_RESPONSE_200 = {
321
223
  'data': {
322
224
  'metadata': {
@@ -653,30 +555,6 @@ def test_explain() -> None:
653
555
  )
654
556
 
655
557
 
656
- @responses.activate
657
- def test_fairness() -> None:
658
- responses.get(
659
- url=f'{URL}/v3/models/{MODEL_ID}',
660
- json=MODEL_API_RESPONSE_200,
661
- )
662
- model = Model.get(id_=MODEL_ID)
663
-
664
- responses.post(
665
- url=f'{URL}/v3/analytics/fairness',
666
- json=FAIRNESS_RESPONSE_200,
667
- )
668
- fairness = model.get_fairness(
669
- data_source=DatasetDataSource(
670
- env_type='PRODUCTION',
671
- ),
672
- protected_features=['Gender'],
673
- positive_outcome='Churned',
674
- )
675
- assert fairness == namedtuple('Fairness', FAIRNESS_RESPONSE_200['data'])(
676
- **FAIRNESS_RESPONSE_200['data']
677
- )
678
-
679
-
680
558
  @responses.activate
681
559
  def test_get_slice() -> None:
682
560
  responses.get(
@@ -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',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.3.1
3
+ Version: 3.4.0.dev2
4
4
  Summary: Python client for Fiddler Platform
5
5
  Home-page: https://fiddler.ai
6
6
  Author: Fiddler Labs
@@ -1,4 +1,4 @@
1
- fiddler/VERSION,sha256=7yp5wvfcN4AKc_2ZMLMHgkziCvkgy8cVkyNFZBjnfms,6
1
+ fiddler/VERSION,sha256=OsbxGngFod6pq5rBBkwkHkBw7Gm0SAeOuUpKKfMB1wQ,11
2
2
  fiddler/__init__.py,sha256=pBLW7thJD1HkYhH5bJJbJFXSN8FNezos-rBU3HWhb4A,3794
3
3
  fiddler/configs.py,sha256=ZimSo0Gk7j1BFkjDHdRdycrGZ8oh-7G5TBXYiOh1HvU,217
4
4
  fiddler/connection.py,sha256=fLdSXpu5dwoK-h4Vtc9nbdKENOJ7jfEmrnDhVAtChck,5677
@@ -17,7 +17,7 @@ fiddler/constants/model_deployment.py,sha256=SfagLKVD7tK1QmYQFJLDrA4-6FaSeNF6tik
17
17
  fiddler/constants/xai.py,sha256=GR8VguB6FTfMJZ291FIbfDsY4S9BGOft3VxNW5jMf90,214
18
18
  fiddler/entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  fiddler/entities/alert_record.py,sha256=RcDACWDNpntkiId-JpkLQvVeIbuaZAzn6AWl2zYIh9A,3564
20
- fiddler/entities/alert_rule.py,sha256=4z6rhmP3Rqa46nDj490AoGExBLaqOsJE1Ct36wcoKuQ,10492
20
+ fiddler/entities/alert_rule.py,sha256=otenqprXqODzd-pGeTDB6sFzHBCioeMrGGVYOtUw_n8,10509
21
21
  fiddler/entities/base.py,sha256=YCTLt1ta8UbD7u-5BW7v_ocA4S7LevEncI5XPS_SB60,2106
22
22
  fiddler/entities/baseline.py,sha256=k3D-K8WC5MkHDILyejRaH1v9jdCIymT96McDBOVQ9A0,7907
23
23
  fiddler/entities/custom_expression.py,sha256=SdS61JiI0gOxWwHAGxkHh1vqS5XsRtyeNSDs5E-Sg2U,6568
@@ -33,7 +33,7 @@ fiddler/entities/project.py,sha256=G5omjjKHEjvhenMvW-R0bYwrkRVHixIOhTPZb1pS7FI,4
33
33
  fiddler/entities/surrogate.py,sha256=94RkJmv8uwNhRL8PaliuiRv-R0EXDMKJTimE9boXKwQ,3077
34
34
  fiddler/entities/user.py,sha256=ev_Xx9QHAdEHYzNDafzQihXOcD8ME5XkpKgc8MiqCnw,1243
35
35
  fiddler/entities/webhook.py,sha256=BhwV-05EaFtOATbnlPWUaGeziRSewBPSNSGsYFbIRfc,4514
36
- fiddler/entities/xai.py,sha256=BlknQh4vPMDUQUZUuvHlKQzacEeQucbrFNy5xf10-x8,21173
36
+ fiddler/entities/xai.py,sha256=GaippPwXFrNda1O4aBMkYTm6WJZ8HWqw7sq-GMKyx7g,19739
37
37
  fiddler/libs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  fiddler/libs/http_client.py,sha256=bl2V-q66NoPHm950CiDqOoF-kCPztYWUYNy9hVUsbqg,6027
39
39
  fiddler/libs/json_encoder.py,sha256=brsrWySvtZdaBArIkqKM5WwJUbvZf6ZbKozn1CewjOc,512
@@ -70,7 +70,7 @@ fiddler/schemas/xai.py,sha256=AZbjjBlTDZbQGj3U-pTM1UX_LJltjy__2t-kM2v5FuY,739
70
70
  fiddler/schemas/xai_params.py,sha256=7WbUCBojzZckjOA2NUxnk5y3M2WKKXclSzkt5HBfyUU,313
71
71
  fiddler/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
72
  fiddler/tests/conftest.py,sha256=Dmz9FKAFHYdq1AWmcY7NES9pU4cbY9qKWQiojjaX_0E,840
73
- fiddler/tests/constants.py,sha256=XuDw_3kzQEcgum-FynCfJzp-sAuRZ0wFS_w9tACFh6s,1264
73
+ fiddler/tests/constants.py,sha256=hKIh_XoGJVL8mWhdtUiMo0niII0iCXLkGMSVNv6y7l0,1352
74
74
  fiddler/tests/test_connection.py,sha256=d8WoB0QRZEObWfeRAZRXRm1kw9wfEysmeo4Bld7x8js,1865
75
75
  fiddler/tests/test_json_encoder.py,sha256=GJeFT5tTA4RTfZn1q2xm1V5SEj5DNsW3LeHPVfFxcFw,783
76
76
  fiddler/tests/test_logger.py,sha256=bhpS8TLrYBUOIzuk9XAs_Inot54LOWhw0A-8oXhZ2FM,312
@@ -78,7 +78,7 @@ fiddler/tests/test_utils.py,sha256=AF6y7UfboEkCa-nNw0aF30SdHC7yW2Hh78J4H_4s78k,3
78
78
  fiddler/tests/utils.py,sha256=FEDbASW4pYZktdEK2FLnIDyZCwBzpb60m6EzkvOkwSc,335
79
79
  fiddler/tests/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  fiddler/tests/apis/test_alert_record.py,sha256=_0EBRDn87TqTiO1KYEHKQQVtVZjj4lYjbt8Ix-RRTSg,3118
81
- fiddler/tests/apis/test_alert_rule.py,sha256=o0bi6CNTgHIM19oCJTStgB01jWHgUIJcueAGavd-DM4,11258
81
+ fiddler/tests/apis/test_alert_rule.py,sha256=0qwyTxRdt1tW1DuMwaqFJgbAEIV9cQ9xSo9F3XS660U,14638
82
82
  fiddler/tests/apis/test_baseline.py,sha256=R_vvbZdSenpYMSydurENJrE_uNWE3sJR9sHJksfU_Jk,7494
83
83
  fiddler/tests/apis/test_custom_metric.py,sha256=QlNa80M9PxqaqzW-3nCtH5kKLRHYu2iqFDautBusbos,8208
84
84
  fiddler/tests/apis/test_dataset.py,sha256=1Xc9Ng91fLMc2C6dpKfse42fQ0anza3ZOKOD1TqCvTQ,4636
@@ -94,15 +94,15 @@ fiddler/tests/apis/test_model_surrogate.py,sha256=h3OPgD1-_n6gTd0YH_hDcBBRjBfXv1
94
94
  fiddler/tests/apis/test_project.py,sha256=IEYT3imD4dZJg-OT888G4jQJ_AxxHN5_VkCHcmwUnGA,6015
95
95
  fiddler/tests/apis/test_segment.py,sha256=hQiXpZEKLJrnlRBLLMsP3jph8H8K7AEUw17sMK6BuF8,7804
96
96
  fiddler/tests/apis/test_webhook.py,sha256=Tf6bggAFeUA0a9TKTjJ34dM_UM_l6_Q-5N9utyuieeE,8099
97
- fiddler/tests/apis/test_xai.py,sha256=BJxqrdAxk7qivWR7JYygfguAm-sdDTDpaBxzz0deG8s,30888
97
+ fiddler/tests/apis/test_xai.py,sha256=pg7SGC1D8vqGxRhNmlI94c7pDMlb0KWj2Ow9GGIQCEM,26943
98
98
  fiddler/utils/__init__.py,sha256=ooAJR6_tVaF6UKZriz5ynZPj8IeCzaDIPKV23F-e4Fk,53
99
99
  fiddler/utils/helpers.py,sha256=Xl_T_se9SOeMTmVJAOVzzmkekUsmpFMlAb2KvPCWfTw,2908
100
100
  fiddler/utils/logger.py,sha256=FdJ3LkS9dbRjWsw5oJmNNsd7q0XRVEIvx5-TWys7L0k,669
101
101
  fiddler/utils/model_generator.py,sha256=TwQMQDpy-0gcq6HyL68s37N-sk_nGPq33mmppK6i7hI,2203
102
102
  fiddler/utils/validations.py,sha256=i8NtgrpCsitq6BPa5lygpKDh07oaOXu7PAlCIcMvqzY,408
103
103
  fiddler/utils/version.py,sha256=iC8Ry7UFl9EJW_xU1WbzO_l4yK6V7eQ6U5exB3xT864,531
104
- fiddler_client-3.3.1.dist-info/LICENSE.txt,sha256=w8-LUAb_VLBWSsCNmih0pAqLIicJfGu8OJXpDjkIg_o,559
105
- fiddler_client-3.3.1.dist-info/METADATA,sha256=FHpLgL7fqr__hT059Z9_wfWWY5xzpRTqhD6qc6h4KXg,1589
106
- fiddler_client-3.3.1.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
107
- fiddler_client-3.3.1.dist-info/top_level.txt,sha256=ndC6LqvKmrTTs8czRlBOYdYgSqZbHuMf0zHt_HWpzzk,8
108
- fiddler_client-3.3.1.dist-info/RECORD,,
104
+ fiddler_client-3.4.0.dev2.dist-info/LICENSE.txt,sha256=w8-LUAb_VLBWSsCNmih0pAqLIicJfGu8OJXpDjkIg_o,559
105
+ fiddler_client-3.4.0.dev2.dist-info/METADATA,sha256=xosKzZsH9kXQTYJ0mZjQOXZgcklKrkobJdRy9agMPbI,1594
106
+ fiddler_client-3.4.0.dev2.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
107
+ fiddler_client-3.4.0.dev2.dist-info/top_level.txt,sha256=ndC6LqvKmrTTs8czRlBOYdYgSqZbHuMf0zHt_HWpzzk,8
108
+ fiddler_client-3.4.0.dev2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (73.0.1)
2
+ Generator: setuptools (74.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5