remove backwards compatible imports, remove pretty=True from _STIXBase.__str()__, and simplify _STIXBase.__repr()__ (breaking)

pull/1/head
Emmanuelle Vargas-Gonzalez 2021-03-31 11:02:05 -04:00
parent bde9aaa13e
commit 9cc2e5bd3a
2 changed files with 12 additions and 20 deletions

View File

@ -1,5 +1,6 @@
"""Base classes for type definitions in the STIX2 library.""" """Base classes for type definitions in the STIX2 library."""
import collections.abc
import copy import copy
import re import re
import uuid import uuid
@ -21,10 +22,6 @@ from .utils import NOW, PREFIX_21_REGEX, get_timestamp
from .versioning import new_version as _new_version from .versioning import new_version as _new_version
from .versioning import revoke as _revoke from .versioning import revoke as _revoke
try:
from collections.abc import Mapping
except ImportError:
from collections import Mapping
DEFAULT_ERROR = "{type} must have {property}='{expected}'." DEFAULT_ERROR = "{type} must have {property}='{expected}'."
SCO_DET_ID_NAMESPACE = uuid.UUID("00abedb4-aa42-466c-9c01-fed23315a9b7") SCO_DET_ID_NAMESPACE = uuid.UUID("00abedb4-aa42-466c-9c01-fed23315a9b7")
@ -34,7 +31,7 @@ def get_required_properties(properties):
return (k for k, v in properties.items() if v.required) return (k for k, v in properties.items() if v.required)
class _STIXBase(Mapping): class _STIXBase(collections.abc.Mapping):
"""Base class for STIX object types""" """Base class for STIX object types"""
def object_properties(self): def object_properties(self):
@ -67,7 +64,7 @@ class _STIXBase(Mapping):
self.__class__, prop_name, reason=str(exc), self.__class__, prop_name, reason=str(exc),
) from exc ) from exc
# interproperty constraint methods # inter-property constraint methods
def _check_mutually_exclusive_properties(self, list_of_properties, at_least_one=True): def _check_mutually_exclusive_properties(self, list_of_properties, at_least_one=True):
current_properties = self.properties_populated() current_properties = self.properties_populated()
@ -80,9 +77,9 @@ class _STIXBase(Mapping):
if not list_of_properties: if not list_of_properties:
list_of_properties = sorted(list(self.__class__._properties.keys())) list_of_properties = sorted(list(self.__class__._properties.keys()))
if isinstance(self, _Observable): if isinstance(self, _Observable):
props_to_remove = ["type", "id", "defanged", "spec_version"] props_to_remove = {"type", "id", "defanged", "spec_version"}
else: else:
props_to_remove = ["type"] props_to_remove = {"type"}
list_of_properties = [prop for prop in list_of_properties if prop not in props_to_remove] list_of_properties = [prop for prop in list_of_properties if prop not in props_to_remove]
current_properties = self.properties_populated() current_properties = self.properties_populated()
@ -211,14 +208,12 @@ class _STIXBase(Mapping):
super(_STIXBase, self).__setattr__(name, value) super(_STIXBase, self).__setattr__(name, value)
def __str__(self): def __str__(self):
return self.serialize(pretty=True) # Note: use .serialize() or fp_serialize() directly if specific formatting options are needed.
return self.serialize()
def __repr__(self): def __repr__(self):
props = [(k, self[k]) for k in self.object_properties() if self.get(k)] props = ', '.join([f"{k}={self[k]!r}" for k in self.object_properties() if self.get(k)])
return '{0}({1})'.format( return f'{self.__class__.__name__}({props})'
self.__class__.__name__,
', '.join(['{0!s}={1!r}'.format(k, v) for k, v in props]),
)
def __deepcopy__(self, memo): def __deepcopy__(self, memo):
# Assume: we can ignore the memo argument, because no object will ever contain the same sub-object multiple times. # Assume: we can ignore the memo argument, because no object will ever contain the same sub-object multiple times.
@ -415,7 +410,7 @@ def _make_json_serializable(value):
json_value = value # default assumption json_value = value # default assumption
if isinstance(value, Mapping): if isinstance(value, collections.abc.Mapping):
json_value = { json_value = {
k: _make_json_serializable(v) k: _make_json_serializable(v)
for k, v in value.items() for k, v in value.items()

View File

@ -2,6 +2,7 @@
import base64 import base64
import binascii import binascii
import collections.abc
import copy import copy
import inspect import inspect
import re import re
@ -16,10 +17,6 @@ from .exceptions import (
from .parsing import parse, parse_observable from .parsing import parse, parse_observable
from .utils import _get_dict, get_class_hierarchy_names, parse_into_datetime from .utils import _get_dict, get_class_hierarchy_names, parse_into_datetime
try:
from collections.abc import Mapping
except ImportError:
from collections import Mapping
TYPE_REGEX = re.compile(r'^-?[a-z0-9]+(-[a-z0-9]+)*-?$') TYPE_REGEX = re.compile(r'^-?[a-z0-9]+(-[a-z0-9]+)*-?$')
TYPE_21_REGEX = re.compile(r'^([a-z][a-z0-9]*)+([a-z0-9-]+)*-?$') TYPE_21_REGEX = re.compile(r'^([a-z][a-z0-9]*)+([a-z0-9-]+)*-?$')
@ -239,7 +236,7 @@ class ListProperty(Property):
if isinstance(item, self.contained): if isinstance(item, self.contained):
valid = item valid = item
elif isinstance(item, Mapping): elif isinstance(item, collections.abc.Mapping):
# attempt a mapping-like usage... # attempt a mapping-like usage...
valid = self.contained(**item) valid = self.contained(**item)