Skip to content

Commit fc4a5f9

Browse files
committed
Move removal of empty values to to_dict
This will make the dict more similar to the original response.
1 parent bab9464 commit fc4a5f9

File tree

2 files changed

+17
-42
lines changed

2 files changed

+17
-42
lines changed

minfraud/models.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,23 @@ def to_dict(self):
2020
result = {}
2121
for key, value in self.__dict__.items():
2222
if hasattr(value, "to_dict") and callable(value.to_dict):
23-
result[key] = value.to_dict()
23+
if d := value.to_dict():
24+
result[key] = d
2425
elif hasattr(value, "raw"):
2526
# geoip2 uses "raw" for historical reasons
26-
result[key] = value.raw
27+
if d := value.raw:
28+
result[key] = d
2729
elif isinstance(value, list):
28-
result[key] = [
29-
(
30-
item.to_dict()
31-
if hasattr(item, "to_dict") and callable(item.to_dict)
32-
else item
33-
)
34-
for item in value
35-
]
36-
else:
30+
ls = []
31+
for e in value:
32+
if hasattr(e, "to_dict") and callable(e.to_dict):
33+
if e := e.to_dict():
34+
ls.append(e)
35+
elif e is not None:
36+
ls.append(e)
37+
if ls:
38+
result[key] = ls
39+
elif value is not None:
3740
result[key] = value
3841
return result
3942

tests/test_models.py

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -281,15 +281,15 @@ def test_score(self):
281281
self.assertEqual("INVALID_INPUT", score.warnings[0].code)
282282
self.assertEqual(99, score.ip_address.risk)
283283

284-
self.assertEqual(response, self._remove_empty_values(score.to_dict()))
284+
self.assertEqual(response, score.to_dict())
285285

286286
def test_insights(self):
287287
response = self.factors_response()
288288
del response["risk_score_reasons"]
289289
del response["subscores"]
290290
insights = Insights(None, **response)
291291
self.check_insights_data(insights, response["id"])
292-
self.assertEqual(response, self._remove_empty_values(insights.to_dict()))
292+
self.assertEqual(response, insights.to_dict())
293293

294294
def test_factors(self):
295295
response = self.factors_response()
@@ -321,7 +321,7 @@ def test_factors(self):
321321
)
322322
self.assertEqual(0.17, factors.subscores.time_of_day)
323323

324-
self.assertEqual(response, self._remove_empty_values(factors.to_dict()))
324+
self.assertEqual(response, factors.to_dict())
325325

326326
def factors_response(self):
327327
return {
@@ -409,31 +409,3 @@ def check_risk_score_reasons_data(self, reasons):
409409
self.assertEqual(
410410
"Risk due to IP being an Anonymous IP", reasons[0].reasons[0].reason
411411
)
412-
413-
def _remove_empty_values(self, data):
414-
if isinstance(data, dict):
415-
m = {}
416-
for k, v in data.items():
417-
v = self._remove_empty_values(v)
418-
if self._is_not_empty(v):
419-
m[k] = v
420-
return m
421-
422-
if isinstance(data, list):
423-
ls = []
424-
for e in data:
425-
e = self._remove_empty_values(e)
426-
if self._is_not_empty(e):
427-
ls.append(e)
428-
return ls
429-
430-
return data
431-
432-
def _is_not_empty(self, v):
433-
if v is None:
434-
return False
435-
if isinstance(v, dict) and not v:
436-
return False
437-
if isinstance(v, list) and not v:
438-
return False
439-
return True

0 commit comments

Comments
 (0)