Skip to content
This repository was archived by the owner on Dec 5, 2025. It is now read-only.

Commit ab752c8

Browse files
committed
refactor: enums to use CaseInsensitiveMixin for has_value
1 parent 26483a6 commit ab752c8

File tree

1 file changed

+22
-42
lines changed

1 file changed

+22
-42
lines changed

pycti/utils/constants.py

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,22 @@
1212
from stix2.utils import NOW
1313

1414

15-
class StixCyberObservableTypes(Enum):
15+
class CaseInsensitiveMixin:
16+
"""Mixin providing case-insensitive value checking for Enum classes."""
17+
_lower_values_cache = None
18+
19+
@classmethod
20+
def _get_lower_values(cls):
21+
if cls._lower_values_cache is None:
22+
cls._lower_values_cache = {v.lower() for v in cls._value2member_map_}
23+
return cls._lower_values_cache
24+
25+
@classmethod
26+
def has_value(cls, value):
27+
return value.lower() in cls._get_lower_values()
28+
29+
30+
class StixCyberObservableTypes(CaseInsensitiveMixin, Enum):
1631
AUTONOMOUS_SYSTEM = "Autonomous-System"
1732
DIRECTORY = "Directory"
1833
DOMAIN_NAME = "Domain-Name"
@@ -47,74 +62,44 @@ class StixCyberObservableTypes(Enum):
4762
SIMPLE_OBSERVABLE = "Simple-Observable"
4863
PERSONA = "Persona"
4964

50-
@classmethod
51-
def has_value(cls, value):
52-
lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_))
53-
return value.lower() in lower_attr
5465

55-
56-
class IdentityTypes(Enum):
66+
class IdentityTypes(CaseInsensitiveMixin, Enum):
5767
SECTOR = "Sector"
5868
ORGANIZATION = "Organization"
5969
INDIVIDUAL = "Individual"
6070
SYSTEM = "System"
6171

62-
@classmethod
63-
def has_value(cls, value):
64-
lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_))
65-
return value.lower() in lower_attr
66-
6772

68-
class ThreatActorTypes(Enum):
73+
class ThreatActorTypes(CaseInsensitiveMixin, Enum):
6974
THREAT_ACTOR_GROUP = "Threat-Actor-Group"
7075
THREAT_ACTOR_INDIVIDUAL = "Threat-Actor-Individual"
7176

72-
@classmethod
73-
def has_value(cls, value):
74-
lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_))
75-
return value.lower() in lower_attr
76-
7777

78-
class LocationTypes(Enum):
78+
class LocationTypes(CaseInsensitiveMixin, Enum):
7979
REGION = "Region"
8080
COUNTRY = "Country"
8181
ADMINISTRATIVE_AREA = "Administrative-Area"
8282
CITY = "City"
8383
POSITION = "Position"
8484

85-
@classmethod
86-
def has_value(cls, value):
87-
lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_))
88-
return value.lower() in lower_attr
8985

90-
91-
class ContainerTypes(Enum):
86+
class ContainerTypes(CaseInsensitiveMixin, Enum):
9287
NOTE = "Note"
9388
OBSERVED_DATA = "Observed-Data"
9489
OPINION = "Opinion"
9590
REPORT = "Report"
9691
GROUPING = "Grouping"
9792
CASE = "Case"
9893

99-
@classmethod
100-
def has_value(cls, value):
101-
lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_))
102-
return value.lower() in lower_attr
103-
10494

105-
class StixMetaTypes(Enum):
95+
class StixMetaTypes(CaseInsensitiveMixin, Enum):
10696
MARKING_DEFINITION = "Marking-Definition"
10797
LABEL = "Label"
10898
EXTERNAL_REFERENCE = "External-Reference"
10999
KILL_CHAIN_PHASE = "Kill-Chain-Phase"
110100

111-
@classmethod
112-
def has_value(cls, value):
113-
lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_))
114-
return value.lower() in lower_attr
115-
116101

117-
class MultipleRefRelationship(Enum):
102+
class MultipleRefRelationship(CaseInsensitiveMixin, Enum):
118103
OPERATING_SYSTEM = "operating-system"
119104
SAMPLE = "sample"
120105
CONTAINS = "contains"
@@ -132,11 +117,6 @@ class MultipleRefRelationship(Enum):
132117
INSTALLED_SOFTWARE = "installed-software"
133118
RELATION_ANALYSIS_SCO = "analysis-sco"
134119

135-
@classmethod
136-
def has_value(cls, value):
137-
lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_))
138-
return value.lower() in lower_attr
139-
140120

141121
# Custom objects
142122

0 commit comments

Comments
 (0)