Skip to content

Commit 32e83e3

Browse files
ref: use a more typing-friendly singleton for backup ScrubbedData (#90297)
avoids this crash in mypy: python/mypy#18964 <!-- Describe your PR here. -->
1 parent 456e174 commit 32e83e3

File tree

2 files changed

+33
-28
lines changed

2 files changed

+33
-28
lines changed

src/sentry/backup/comparators.py

+5-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import enum
34
import re
45
from abc import ABC, abstractmethod
56
from collections import defaultdict
@@ -22,17 +23,9 @@
2223

2324
UNIX_EPOCH = unix_zero_date = datetime.fromtimestamp(0, timezone.utc).isoformat()
2425

25-
26-
class ScrubbedData:
27-
"""A singleton class used to indicate data has been scrubbed, without indicating what that data
28-
is. A unit type indicating "scrubbing was successful" only."""
29-
30-
instance: ScrubbedData
31-
32-
def __new__(cls):
33-
if getattr(cls, "instance", None) is None:
34-
cls.instance = super().__new__(cls)
35-
return cls.instance
26+
# A singleton class used to indicate data has been scrubbed, without indicating what that data
27+
# is. A unit type indicating "scrubbing was successful" only.
28+
ScrubbedData = enum.Enum("ScrubbedData", "SCRUBBED_DATA")
3629

3730

3831
class JSONScrubbingComparator(ABC):
@@ -106,7 +99,7 @@ def __scrub__(
10699
right: Any,
107100
f: (
108101
Callable[[list[str]], list[str]] | Callable[[list[str]], ScrubbedData]
109-
) = lambda _: ScrubbedData(),
102+
) = lambda _: ScrubbedData.SCRUBBED_DATA,
110103
) -> None:
111104
"""Removes all of the fields compared by this comparator from the `fields` dict, so that the
112105
remaining fields may be compared for equality. Public callers should use the inheritance-safe wrapper, `scrub`, rather than using this internal method directly.

tests/sentry/backup/test_comparators.py

+28-16
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,12 @@ def test_good_auto_suffix_comparator_scrubbed():
291291
}
292292
cmp.scrub(left, right)
293293
assert left["scrubbed"]
294-
assert left["scrubbed"]["AutoSuffixComparator::same"] is ScrubbedData()
295-
assert left["scrubbed"]["AutoSuffixComparator::suffixed"] is ScrubbedData()
294+
assert left["scrubbed"]["AutoSuffixComparator::same"] is ScrubbedData.SCRUBBED_DATA
295+
assert left["scrubbed"]["AutoSuffixComparator::suffixed"] is ScrubbedData.SCRUBBED_DATA
296296

297297
assert right["scrubbed"]
298-
assert right["scrubbed"]["AutoSuffixComparator::same"] is ScrubbedData()
299-
assert right["scrubbed"]["AutoSuffixComparator::suffixed"] is ScrubbedData()
298+
assert right["scrubbed"]["AutoSuffixComparator::same"] is ScrubbedData.SCRUBBED_DATA
299+
assert right["scrubbed"]["AutoSuffixComparator::suffixed"] is ScrubbedData.SCRUBBED_DATA
300300

301301

302302
def test_good_datetime_equality_comparator():
@@ -970,10 +970,10 @@ def test_good_foreign_key_comparator_scrubbed():
970970
right = deepcopy(left)
971971
cmp.scrub(left, right)
972972
assert left["scrubbed"]
973-
assert left["scrubbed"]["ForeignKeyComparator::user"] is ScrubbedData()
973+
assert left["scrubbed"]["ForeignKeyComparator::user"] is ScrubbedData.SCRUBBED_DATA
974974

975975
assert right["scrubbed"]
976-
assert right["scrubbed"]["ForeignKeyComparator::user"] is ScrubbedData()
976+
assert right["scrubbed"]["ForeignKeyComparator::user"] is ScrubbedData.SCRUBBED_DATA
977977

978978

979979
def test_bad_foreign_key_comparator_set_primary_key_maps_not_called():
@@ -1171,11 +1171,11 @@ def test_good_ignored_comparator_scrubbed():
11711171
right = deepcopy(left)
11721172
cmp.scrub(left, right)
11731173
assert left["scrubbed"]
1174-
assert left["scrubbed"]["IgnoredComparator::ignored_field"] is ScrubbedData()
1174+
assert left["scrubbed"]["IgnoredComparator::ignored_field"] is ScrubbedData.SCRUBBED_DATA
11751175
assert left["scrubbed"].get("IgnoredComparator::other_field") is None
11761176

11771177
assert right["scrubbed"]
1178-
assert right["scrubbed"]["IgnoredComparator::ignored_field"] is ScrubbedData()
1178+
assert right["scrubbed"]["IgnoredComparator::ignored_field"] is ScrubbedData.SCRUBBED_DATA
11791179
assert right["scrubbed"].get("IgnoredComparator::other_field") is None
11801180

11811181

@@ -1271,10 +1271,10 @@ def test_good_secret_hex_comparator_scrubbed():
12711271
}
12721272
cmp.scrub(left, right)
12731273
assert left["scrubbed"]
1274-
assert left["scrubbed"]["SecretHexComparator::secret_hex_field"] is ScrubbedData()
1274+
assert left["scrubbed"]["SecretHexComparator::secret_hex_field"] is ScrubbedData.SCRUBBED_DATA
12751275

12761276
assert right["scrubbed"]
1277-
assert right["scrubbed"]["SecretHexComparator::secret_hex_field"] is ScrubbedData()
1277+
assert right["scrubbed"]["SecretHexComparator::secret_hex_field"] is ScrubbedData.SCRUBBED_DATA
12781278

12791279

12801280
def test_good_subscription_id_comparator():
@@ -1406,10 +1406,16 @@ def test_good_subscription_id_comparator_scrubbed():
14061406
}
14071407
cmp.scrub(left, right)
14081408
assert left["scrubbed"]
1409-
assert left["scrubbed"]["SubscriptionIDComparator::subscription_id_field"] is ScrubbedData()
1409+
assert (
1410+
left["scrubbed"]["SubscriptionIDComparator::subscription_id_field"]
1411+
is ScrubbedData.SCRUBBED_DATA
1412+
)
14101413

14111414
assert right["scrubbed"]
1412-
assert right["scrubbed"]["SubscriptionIDComparator::subscription_id_field"] is ScrubbedData()
1415+
assert (
1416+
right["scrubbed"]["SubscriptionIDComparator::subscription_id_field"]
1417+
is ScrubbedData.SCRUBBED_DATA
1418+
)
14131419

14141420

14151421
def test_good_unordered_list_comparator():
@@ -1520,10 +1526,16 @@ def test_good_unordered_list_comparator_scrubbed():
15201526
}
15211527
cmp.scrub(left, right)
15221528
assert left["scrubbed"]
1523-
assert left["scrubbed"]["UnorderedListComparator::unordered_list_field"] is ScrubbedData()
1529+
assert (
1530+
left["scrubbed"]["UnorderedListComparator::unordered_list_field"]
1531+
is ScrubbedData.SCRUBBED_DATA
1532+
)
15241533

15251534
assert right["scrubbed"]
1526-
assert right["scrubbed"]["UnorderedListComparator::unordered_list_field"] is ScrubbedData()
1535+
assert (
1536+
right["scrubbed"]["UnorderedListComparator::unordered_list_field"]
1537+
is ScrubbedData.SCRUBBED_DATA
1538+
)
15271539

15281540

15291541
def test_good_uuid4_comparator():
@@ -1625,10 +1637,10 @@ def test_good_uuid4_comparator_scrubbed():
16251637
}
16261638
cmp.scrub(left, right)
16271639
assert left["scrubbed"]
1628-
assert left["scrubbed"]["UUID4Comparator::guid_field"] is ScrubbedData()
1640+
assert left["scrubbed"]["UUID4Comparator::guid_field"] is ScrubbedData.SCRUBBED_DATA
16291641

16301642
assert right["scrubbed"]
1631-
assert right["scrubbed"]["UUID4Comparator::guid_field"] is ScrubbedData()
1643+
assert right["scrubbed"]["UUID4Comparator::guid_field"] is ScrubbedData.SCRUBBED_DATA
16321644

16331645

16341646
def test_good_user_password_obfuscating_comparator_claimed_user():

0 commit comments

Comments
 (0)