60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
|
|
class ObjectPathComponent(object):
|
|
pass
|
|
|
|
|
|
class BasicObjectPathComponent(ObjectPathComponent):
|
|
def __init__(self, property_name, is_key=False):
|
|
self.property_name = property_name
|
|
# TODO: set is_key to True if this component is a dictionary key
|
|
# self.is_key = is_key
|
|
|
|
def __str__(self):
|
|
return self.property_name
|
|
|
|
|
|
class ListObjectPathComponent(ObjectPathComponent):
|
|
def __init__(self, property_name, index):
|
|
self.property_name = property_name
|
|
self.index = index
|
|
|
|
def __str__(self):
|
|
return "%s[%s]" % (self.property_name, self.index)
|
|
|
|
|
|
class ReferenceObjectPathComponent(ObjectPathComponent):
|
|
def __init__(self, reference_property_name):
|
|
self.property_name = reference_property_name
|
|
|
|
def __str__(self):
|
|
return self.property_name
|
|
|
|
|
|
class ObjectPath(object):
|
|
def __init__(self, object_type_name, property_path):
|
|
self.object_type_name = object_type_name
|
|
self.property_path = [x if isinstance(x, ObjectPathComponent) else ObjectPath.create_ObjectPathComponent(x)
|
|
for x in property_path]
|
|
|
|
def __str__(self):
|
|
return "%s:%s" % (self.object_type_name, ".".join(["%s" % x for x in self.property_path]))
|
|
|
|
def merge(self, other):
|
|
self.property_path.extend(other.property_path)
|
|
return self
|
|
|
|
@staticmethod
|
|
def make_object_path(lhs):
|
|
path_as_parts = lhs.split(":")
|
|
return ObjectPath(path_as_parts[0], path_as_parts[1].split("."))
|
|
|
|
@staticmethod
|
|
def create_ObjectPathComponent(component_name):
|
|
if component_name.endswith("_ref"):
|
|
return ReferenceObjectPathComponent(component_name)
|
|
elif component_name.find("[") != -1:
|
|
parse1 = component_name.split("[")
|
|
return ListObjectPathComponent(parse1[0], parse1[1][:-1])
|
|
else:
|
|
return BasicObjectPathComponent(component_name)
|