Split `find_property_index` and support multiple levels of nesting.
parent
60da259805
commit
91cae0b5b7
|
@ -165,24 +165,18 @@ def _get_dict(data):
|
||||||
raise ValueError("Cannot convert '%s' to dictionary." % str(data))
|
raise ValueError("Cannot convert '%s' to dictionary." % str(data))
|
||||||
|
|
||||||
|
|
||||||
def find_property_index(obj, properties, tuple_to_find):
|
def _iterate_over_values(dict_values, tuple_to_find):
|
||||||
"""Recursively find the property in the object model, return the index
|
"""Loop recursively over dictionary values"""
|
||||||
according to the _properties OrderedDict. If it's a list look for
|
|
||||||
individual objects. Returns and integer indicating its location
|
|
||||||
"""
|
|
||||||
from .base import _STIXBase
|
from .base import _STIXBase
|
||||||
try:
|
for pv in dict_values:
|
||||||
if tuple_to_find[1] in obj._inner.values():
|
|
||||||
return properties.index(tuple_to_find[0])
|
|
||||||
raise ValueError
|
|
||||||
except ValueError:
|
|
||||||
for pv in obj._inner.values():
|
|
||||||
if isinstance(pv, list):
|
if isinstance(pv, list):
|
||||||
for item in pv:
|
for item in pv:
|
||||||
if isinstance(item, _STIXBase):
|
if isinstance(item, _STIXBase):
|
||||||
val = find_property_index(item,
|
val = find_property_index(
|
||||||
|
item,
|
||||||
item.object_properties(),
|
item.object_properties(),
|
||||||
tuple_to_find)
|
tuple_to_find
|
||||||
|
)
|
||||||
if val is not None:
|
if val is not None:
|
||||||
return val
|
return val
|
||||||
elif isinstance(item, dict):
|
elif isinstance(item, dict):
|
||||||
|
@ -198,13 +192,61 @@ def find_property_index(obj, properties, tuple_to_find):
|
||||||
return len(tuple_to_find[0])
|
return len(tuple_to_find[0])
|
||||||
for item in pv.values():
|
for item in pv.values():
|
||||||
if isinstance(item, _STIXBase):
|
if isinstance(item, _STIXBase):
|
||||||
val = find_property_index(item,
|
index = find_property_index(
|
||||||
|
item,
|
||||||
item.object_properties(),
|
item.object_properties(),
|
||||||
tuple_to_find)
|
tuple_to_find
|
||||||
if val is not None:
|
)
|
||||||
return val
|
if index is not None:
|
||||||
else:
|
return index
|
||||||
return 0
|
elif isinstance(item, dict):
|
||||||
|
dict_properties = item.keys()
|
||||||
|
index = find_property_index(
|
||||||
|
item,
|
||||||
|
dict_properties,
|
||||||
|
tuple_to_find
|
||||||
|
)
|
||||||
|
if index is not None:
|
||||||
|
return index
|
||||||
|
|
||||||
|
|
||||||
|
def find_property_index(obj, properties, tuple_to_find):
|
||||||
|
"""Recursively find the property in the object model, return the index
|
||||||
|
according to the ``properties`` OrderedDict when working with `stix2`
|
||||||
|
objects. If it's a list look for individual objects. Returns and integer
|
||||||
|
indicating its location.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
This method is intended to pretty print `stix2` properties for better
|
||||||
|
visual feedback when working with the library.
|
||||||
|
|
||||||
|
Warnings:
|
||||||
|
This method may not be able to produce the same output if called
|
||||||
|
multiple times and makes a best effort attempt to print the properties
|
||||||
|
according to the technical specification.
|
||||||
|
|
||||||
|
See Also:
|
||||||
|
py:meth:`stix2.base._STIXBase.serialize` for more information.
|
||||||
|
|
||||||
|
"""
|
||||||
|
from .base import _STIXBase
|
||||||
|
try:
|
||||||
|
if isinstance(obj, _STIXBase):
|
||||||
|
if tuple_to_find[1] in obj._inner.values():
|
||||||
|
return properties.index(tuple_to_find[0])
|
||||||
|
elif isinstance(obj, dict):
|
||||||
|
for idx, val in enumerate(sorted(obj)):
|
||||||
|
if (tuple_to_find[0] == val and
|
||||||
|
obj.get(val) == tuple_to_find[1]):
|
||||||
|
return idx
|
||||||
|
raise ValueError
|
||||||
|
except ValueError:
|
||||||
|
if isinstance(obj, _STIXBase):
|
||||||
|
index = _iterate_over_values(obj._inner.values(), tuple_to_find)
|
||||||
|
return index
|
||||||
|
elif isinstance(obj, dict):
|
||||||
|
index = _iterate_over_values(obj.values(), tuple_to_find)
|
||||||
|
return index
|
||||||
|
|
||||||
|
|
||||||
def new_version(data, **kwargs):
|
def new_version(data, **kwargs):
|
||||||
|
|
Loading…
Reference in New Issue