From dd2a1db5c15139507f7318922cd4aa38452a9cff Mon Sep 17 00:00:00 2001 From: Emmanuelle Vargas-Gonzalez Date: Mon, 14 Aug 2017 08:27:49 -0400 Subject: [PATCH] Change SROs to OrderedDict approach. Removed COMMON_PROPERTIES. --- stix2/sro.py | 75 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/stix2/sro.py b/stix2/sro.py index c13fff3..49e607a 100644 --- a/stix2/sro.py +++ b/stix2/sro.py @@ -1,31 +1,39 @@ """STIX 2.0 Relationship Objects.""" +from collections import OrderedDict + from .base import _STIXBase -from .common import COMMON_PROPERTIES -from .properties import (IDProperty, IntegerProperty, ListProperty, +from .other import ExternalReference, GranularMarking +from .properties import (BooleanProperty, IDProperty, IntegerProperty, ListProperty, ReferenceProperty, StringProperty, TimestampProperty, TypeProperty) +from .utils import NOW class Relationship(_STIXBase): _type = 'relationship' - _properties = COMMON_PROPERTIES.copy() - _properties.update({ - 'id': IDProperty(_type), - 'type': TypeProperty(_type), - 'relationship_type': StringProperty(required=True), - 'description': StringProperty(), - 'source_ref': ReferenceProperty(required=True), - 'target_ref': ReferenceProperty(required=True), - }) + _properties = OrderedDict() + _properties.update([ + ('type', TypeProperty(_type)), + ('id', IDProperty(_type)), + ('created_by_ref', ReferenceProperty(type="identity")), + ('created', TimestampProperty(default=lambda: NOW, precision='millisecond')), + ('modified', TimestampProperty(default=lambda: NOW, precision='millisecond')), + ('relationship_type', StringProperty(required=True)), + ('description', StringProperty()), + ('source_ref', ReferenceProperty(required=True)), + ('target_ref', ReferenceProperty(required=True)), + ('revoked', BooleanProperty()), + ('labels', ListProperty(StringProperty)), + ('external_references', ListProperty(ExternalReference)), + ('object_marking_refs', ListProperty(ReferenceProperty(type="marking-definition"))), + ('granular_markings', ListProperty(GranularMarking)), + ]) # Explicitly define the first three kwargs to make readable Relationship declarations. - def __init__(self, source_ref=None, relationship_type=None, target_ref=None, - **kwargs): - # TODO: - # - description - + def __init__(self, source_ref=None, relationship_type=None, + target_ref=None, **kwargs): # Allow (source_ref, relationship_type, target_ref) as positional args. if source_ref and not kwargs.get('source_ref'): kwargs['source_ref'] = source_ref @@ -39,24 +47,29 @@ class Relationship(_STIXBase): class Sighting(_STIXBase): _type = 'sighting' - _properties = COMMON_PROPERTIES.copy() - _properties.update({ - 'id': IDProperty(_type), - 'type': TypeProperty(_type), - 'first_seen': TimestampProperty(), - 'last_seen': TimestampProperty(), - 'count': IntegerProperty(), - 'sighting_of_ref': ReferenceProperty(required=True), - 'observed_data_refs': ListProperty(ReferenceProperty(type="observed-data")), - 'where_sighted_refs': ListProperty(ReferenceProperty(type="identity")), - 'summary': StringProperty(), - }) + _properties = OrderedDict() + _properties.update([ + ('id', IDProperty(_type)), + ('type', TypeProperty(_type)), + ('created_by_ref', ReferenceProperty(type="identity")), + ('created', TimestampProperty(default=lambda: NOW, precision='millisecond')), + ('modified', TimestampProperty(default=lambda: NOW, precision='millisecond')), + ('first_seen', TimestampProperty()), + ('last_seen', TimestampProperty()), + ('count', IntegerProperty()), + ('sighting_of_ref', ReferenceProperty(required=True)), + ('observed_data_refs', ListProperty(ReferenceProperty(type="observed-data"))), + ('where_sighted_refs', ListProperty(ReferenceProperty(type="identity"))), + ('summary', BooleanProperty()), + ('revoked', BooleanProperty()), + ('labels', ListProperty(StringProperty)), + ('external_references', ListProperty(ExternalReference)), + ('object_marking_refs', ListProperty(ReferenceProperty(type="marking-definition"))), + ('granular_markings', ListProperty(GranularMarking)), + ]) # Explicitly define the first kwargs to make readable Sighting declarations. def __init__(self, sighting_of_ref=None, **kwargs): - # TODO: - # - description - # Allow sighting_of_ref as a positional arg. if sighting_of_ref and not kwargs.get('sighting_of_ref'): kwargs['sighting_of_ref'] = sighting_of_ref