blob: ee469958ae27ed9d5556e53ace1c4c93ae53488c [file] [log] [blame]
#
# -*- coding: utf-8 -*-
#
# This file is part of reclass
#
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from enum import Enum
from reclass.utils.dictpath import DictPath
ItemTypes = Enum('ItemTypes',
['COMPOSITE', 'DICTIONARY', 'INV_QUERY', 'LIST',
'REFERENCE', 'SCALAR'])
class Item(object):
def __init__(self, item, settings):
self._settings = settings
self.contents = item
def allRefs(self):
return True
@property
def has_references(self):
return False
@property
def has_inv_query(self):
return False
def is_container(self):
return False
@property
def is_complex(self):
return (self.has_references | self.has_inv_query)
def merge_over(self, item):
msg = "Item class {0} does not implement merge_over()"
raise NotImplementedError(msg.format(self.__class__.__name__))
def render(self, context, exports):
msg = "Item class {0} does not implement render()"
raise NotImplementedError(msg.format(self.__class__.__name__))
def type_str(self):
return self.type.name.lower()
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.contents)
class ItemWithReferences(Item):
def __init__(self, items, settings):
super(ItemWithReferences, self).__init__(items, settings)
self.assembleRefs()
@property
def has_references(self):
return len(self._refs) > 0
def get_references(self):
return self._refs
# NOTE: possibility of confusion. Looks like 'assemble' should be either
# 'gather' or 'extract'.
def assembleRefs(self, context={}):
self._refs = []
self.allRefs = True
for item in self.contents:
if item.has_references:
item.assembleRefs(context)
self._refs.extend(item.get_references())
if item.allRefs is False:
self.allRefs = False
class ContainerItem(Item):
def is_container(self):
return True
def render(self, context, inventory):
return self.contents