def clone_object(self, mgr, tome, type_info): clone = tome.__class__(tome.name) # props for ii in range(len(tome.props)): prop = tome.props[ii] clone_prop = clone.props[ii] marshaller = mgr.require_data_marshaller(prop.value_type.clazz) clone_prop.value = marshaller.clone_data(mgr, prop.value, prop.value_type) # additional non-pop tomes for child_tome in tome.values(): if util.get_prop(tome, child_tome.name) is None: marshaller = mgr.require_data_marshaller(child_tome.type_info.clazz) clone.add_tome(marshaller.clone_data(mgr, child_tome, child_tome.type_info)) return clone
def _load_tome_now(self, tome, reader, template=None): # props self._load_tome_props(tome, reader, template) # load additional non-prop tomes from the reader for tome_reader in reader.children: if util.get_prop(tome, tome_reader.name) is None: tome.add_tome(self.load_tome(tome_reader)) # add additional non-prop tomes from the template if template is not None: for template_tome in template.values(): if template_tome.name not in tome: tome.add_tome # clone any additional tomes inside our template if template is not None: for tmplChild in template.values(): if not tmplChild.name in tome: tome.add_tome(self.clone(tmplChild))
def _load_tome_props(self, tome, reader, template=None): # template's class must be equal to, or subclass of, tome's class if template is not None and not isinstance(template, tome.__class__): raise LoadError(reader.data, "Incompatible template [tome_name=%s, tome_class=%s, template_name=%s, template_class=%s" % (tome.name, str(tome.__class__), template.name, str(template.__class__))) for prop in tome.props: # if we have a tome template, get its corresponding prop t_prop = None if template is not None: t_prop = util.get_prop(template, prop.name) LOG.debug("template prop [tome=%s, prop=%s]" % (template, t_prop)) if t_prop is None: raise LoadError(reader.data, "Missing prop in template [template=%s, prop=%s]" % (template.name, prop.name)) # load the prop try: self._load_tome_prop(tome, prop, t_prop, reader) except LoadError: raise except Exception as e: raise LoadError(reader.data, "Error loading prop '%s'" % prop.name, cause=e)