From 9cc2e5bd3a82b1c71bb65762007117550fb936da Mon Sep 17 00:00:00 2001 From: Emmanuelle Vargas-Gonzalez Date: Wed, 31 Mar 2021 11:02:05 -0400 Subject: [PATCH] remove backwards compatible imports, remove pretty=True from _STIXBase.__str()__, and simplify _STIXBase.__repr()__ (breaking) --- stix2/base.py | 25 ++++++++++--------------- stix2/properties.py | 7 ++----- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/stix2/base.py b/stix2/base.py index d905fb0..8a5a517 100644 --- a/stix2/base.py +++ b/stix2/base.py @@ -1,5 +1,6 @@ """Base classes for type definitions in the STIX2 library.""" +import collections.abc import copy import re 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 revoke as _revoke -try: - from collections.abc import Mapping -except ImportError: - from collections import Mapping DEFAULT_ERROR = "{type} must have {property}='{expected}'." 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) -class _STIXBase(Mapping): +class _STIXBase(collections.abc.Mapping): """Base class for STIX object types""" def object_properties(self): @@ -67,7 +64,7 @@ class _STIXBase(Mapping): self.__class__, prop_name, reason=str(exc), ) from exc - # interproperty constraint methods + # inter-property constraint methods def _check_mutually_exclusive_properties(self, list_of_properties, at_least_one=True): current_properties = self.properties_populated() @@ -80,9 +77,9 @@ class _STIXBase(Mapping): if not list_of_properties: list_of_properties = sorted(list(self.__class__._properties.keys())) if isinstance(self, _Observable): - props_to_remove = ["type", "id", "defanged", "spec_version"] + props_to_remove = {"type", "id", "defanged", "spec_version"} 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] current_properties = self.properties_populated() @@ -211,14 +208,12 @@ class _STIXBase(Mapping): super(_STIXBase, self).__setattr__(name, value) 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): - props = [(k, self[k]) for k in self.object_properties() if self.get(k)] - return '{0}({1})'.format( - self.__class__.__name__, - ', '.join(['{0!s}={1!r}'.format(k, v) for k, v in props]), - ) + props = ', '.join([f"{k}={self[k]!r}" for k in self.object_properties() if self.get(k)]) + return f'{self.__class__.__name__}({props})' def __deepcopy__(self, memo): # 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 - if isinstance(value, Mapping): + if isinstance(value, collections.abc.Mapping): json_value = { k: _make_json_serializable(v) for k, v in value.items() diff --git a/stix2/properties.py b/stix2/properties.py index 9dc1e6c..8fb8a75 100644 --- a/stix2/properties.py +++ b/stix2/properties.py @@ -2,6 +2,7 @@ import base64 import binascii +import collections.abc import copy import inspect import re @@ -16,10 +17,6 @@ from .exceptions import ( from .parsing import parse, parse_observable 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_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): valid = item - elif isinstance(item, Mapping): + elif isinstance(item, collections.abc.Mapping): # attempt a mapping-like usage... valid = self.contained(**item)