def complex_to_parent(self, ctx, cls, inst, parent, name, use_ns=False, **kwargs): inst = cls.get_serialization_instance(inst) # TODO: Put xml attributes as well in the below element() call. with parent.element(name): ret = self._write_members(ctx, cls, inst, parent, use_ns=False, **kwargs) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass
def _write_members(self, ctx, cls, inst, parent, use_ns=True, **kwargs): parent_cls = getattr(cls, '__extends__', None) if not (parent_cls is None): ret = self._write_members(ctx, parent_cls, inst, parent, **kwargs) if ret is not None: try: while True: sv2 = (yield) ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass for k, v in cls._type_info.items(): attr = self.get_cls_attrs(v) if attr.exc: continue try: # e.g. SqlAlchemy could throw NoSuchColumnError subvalue = getattr(inst, k, None) except: subvalue = None # This is a tight loop, so enable this only when necessary. # logger.debug("get %r(%r) from %r: %r" % (k, v, inst, subvalue)) sub_ns = attr.sub_ns if sub_ns is None: sub_ns = cls.get_namespace() sub_name = attr.sub_name if sub_name is None: sub_name = k if use_ns: name = "{%s}%s" % (sub_ns, sub_name) else: name = sub_name if issubclass(v, XmlData): if subvalue is not None: self.to_parent(ctx, v, inst, parent, name=name, **kwargs) continue if subvalue is not None or attr.min_occurs > 0: ret = self.to_parent(ctx, v, subvalue, parent, name, **kwargs) if ret is not None: try: while True: sv2 = (yield) ret.send(sv2) except Break as b: try: ret.throw(b) except StopIteration: pass
def schema_validation_error_to_parent(self, ctx, cls, inst, parent, ns): PREF_SOAP_ENV = ctx.app.interface.prefmap[NS_SOAP_ENV] tag_name = "{%s}Fault" % NS_SOAP_ENV with parent.element(tag_name): parent.write( E("faultcode", '%s:%s' % (PREF_SOAP_ENV, inst.faultcode)), # HACK: Does anyone know a better way of injecting raw xml entities? E("faultstring", html.fromstring(inst.faultstring).text), E("faultactor", inst.faultactor), ) if isinstance(etree._Element): parent.write(E.detail(inst.detail)) # add other nonstandard fault subelements with get_members_etree ret = self._write_members(ctx, cls, inst, parent) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass
def fault_to_parent(self, ctx, cls, inst, parent, name): PREF_SOAP_ENV = ctx.app.interface.prefmap[NS_SOAP_ENV] tag_name = "{%s}Fault" % NS_SOAP_ENV with parent.element(tag_name): parent.write( E("faultcode", '%s:%s' % (PREF_SOAP_ENV, inst.faultcode)), E("faultstring", inst.faultstring), E("faultactor", inst.faultactor), ) if isinstance(etree._Element): parent.write(E.detail(inst.detail)) # add other nonstandard fault subelements with get_members_etree ret = self._write_members(ctx, cls, inst, parent) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass
def close(self): try: self.gen.throw(Break()) except StopIteration: pass self._cb_finish()
def gen_members_parent(self, ctx, cls, inst, parent, tag_name, subelts, add_type): attrib = {} if add_type: tnn = cls.get_type_name_ns(self.app.interface) if tnn != None: attrib[XSI_TYPE] = tnn else: # this only happens on incomplete interface states for eg. # get_object_as_xml where the full init is not performed for # perf reasons attrib[XSI_TYPE] = cls.get_type_name() if isinstance(parent, etree._Element): elt = etree.SubElement(parent, tag_name, attrib=attrib) elt.extend(subelts) ret = self._get_members_etree(ctx, cls, inst, elt) if isgenerator(ret): try: while True: y = (yield) # may throw Break ret.send(y) except Break: try: ret.throw(Break()) except StopIteration: pass else: with parent.element(tag_name, attrib=attrib): for e in subelts: parent.write(e) ret = self._get_members_etree(ctx, cls, inst, parent) if isgenerator(ret): try: while True: y = (yield) ret.send(y) except Break: try: ret.throw(Break()) except StopIteration: pass
def _write_members(self, ctx, cls, inst, parent): parent_cls = getattr(cls, '__extends__', None) if not (parent_cls is None): ret = self._write_members(ctx, parent_cls, inst, parent) if ret is not None: try: while True: sv2 = (yield) ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass for k, v in cls._type_info.items(): try: # to guard against e.g. SqlAlchemy throwing NoSuchColumnError subvalue = getattr(inst, k, None) except: subvalue = None # This is a tight loop, so enable this only when necessary. # logger.debug("get %r(%r) from %r: %r" % (k, v, inst, subvalue)) if issubclass(v, XmlData): if subvalue is not None: parent.write(self.to_string(k.type, subvalue)) continue sub_ns = v.Attributes.sub_ns if sub_ns is None: sub_ns = cls.get_namespace() sub_name = v.Attributes.sub_name if sub_name is None: sub_name = k name = "{%s}%s" % (sub_ns, sub_name) if subvalue is not None or v.Attributes.min_occurs > 0: ret = self.to_parent(ctx, v, subvalue, parent, name) if ret is not None: try: while True: sv2 = (yield) ret.send(sv2) except Break as b: try: ret.throw(b) except StopIteration: pass
def gen_members_parent(self, ctx, cls, inst, parent, tag_name, subelts, add_type): attrib = {} if add_type: attrib[XSI_TYPE] = cls.get_type_name_ns(self.app.interface) if isinstance(parent, etree._Element): elt = etree.SubElement(parent, tag_name, attrib=attrib) elt.extend(subelts) ret = self._get_members_etree(ctx, cls, inst, elt) if isgenerator(ret): try: while True: y = (yield) # may throw Break ret.send(y) except Break: try: ret.throw(Break()) except StopIteration: pass else: with parent.element(tag_name, attrib=attrib): for e in subelts: parent.write(e) ret = self._get_members_etree(ctx, cls, inst, parent) if isgenerator(ret): try: while True: y = (yield) ret.send(y) except Break: try: ret.throw(Break()) except StopIteration: pass
def gen_members_parent(self, ctx, cls, inst, parent, tag_name, subelts): delay = set() if isinstance(parent, etree._Element): elt = etree.SubElement(parent, tag_name) elt.extend(subelts) ret = self._get_members_etree(ctx, cls, inst, elt, delay) if isgenerator(ret): try: while True: y = (yield) # may throw Break ret.send(y) except Break: try: ret.throw(Break()) except StopIteration: pass else: with parent.element(tag_name): for e in subelts: parent.write(e) ret = self._get_members_etree(ctx, cls, inst, parent, delay) if isgenerator(ret): try: while True: y = (yield) ret.send(y) except Break: try: ret.throw(Break()) except StopIteration: pass
def get_out_string_push(self, ctx): """Uses the ``ctx.out_object`` to directly set ``ctx.out_string``.""" ret = ctx.out_protocol.serialize(ctx, message=ProtocolBase.RESPONSE) if isgenerator(ret): try: while True: y = (yield) ret.send(y) except Break: try: ret.throw(Break()) except StopIteration: pass
def _complex_to_parent_do(self, ctx, cls, inst, parent, **kwargs): # parent.write(u"\u200c") # zero-width non-joiner parent.write(" ") # FIXME: to force empty tags to be sent as # <a></a> instead of <a/> ret = self._write_members(ctx, cls, inst, parent, **kwargs) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass
def convert_pull_to_push(self, ctx, gen): oobj, = ctx.out_object if oobj is None: gen.throw(Break()) elif isinstance(oobj, PushBase): pass elif len(ctx.pusher_stack) > 0: oobj = ctx.pusher_stack[-1] assert isinstance(oobj, PushBase) else: raise ValueError("%r is not a PushBase instance" % oobj) retval = self.init_interim_push(oobj, ctx, gen) return self.pusher_try_close(ctx, oobj, retval)
def get_out_string(self, ctx): """Uses the ``ctx.out_object`` to set ``ctx.out_document`` and later ``ctx.out_string``.""" # This means the user wanted to override the way Spyne generates the # outgoing byte stream. So we leave it alone. if ctx.out_string is not None: return if ctx.out_document is None: ret = ctx.out_protocol.serialize(ctx, message=ctx.out_protocol.RESPONSE) if isgenerator(ret): try: while True: y = (yield) ret.send(y) except Break: try: ret.throw(Break()) except StopIteration: pass if ctx.service_class != None: if ctx.out_error is None: ctx.service_class.event_manager.fire_event( 'method_return_document', ctx) else: ctx.service_class.event_manager.fire_event( 'method_exception_document', ctx) ctx.out_protocol.create_out_string(ctx) if ctx.service_class != None: if ctx.out_error is None: ctx.service_class.event_manager.fire_event( 'method_return_string', ctx) else: ctx.service_class.event_manager.fire_event( 'method_exception_string', ctx) if ctx.out_string is None: ctx.out_string = [""]
def get_out_string_pull(self, ctx): """Uses the ``ctx.out_object`` to set ``ctx.out_document`` and later ``ctx.out_string``.""" # This means the user wanted to override the way Spyne generates the # outgoing byte stream. So we leave it alone. if ctx.out_string is not None: return if ctx.out_document is None: ret = ctx.out_protocol.serialize(ctx, message=ProtocolBase.RESPONSE) if isgenerator(ret): oobj, = ctx.out_object if oobj is None: ret.throw(Break()) else: assert isinstance(oobj, PushBase), \ "%r is not a PushBase instance" % oobj self.run_push(oobj, ctx, [], ret) oobj.close() if ctx.service_class != None: if ctx.out_error is None: ctx.service_class.event_manager.fire_event( 'method_return_document', ctx) else: ctx.service_class.event_manager.fire_event( 'method_exception_document', ctx) ctx.out_protocol.create_out_string(ctx) if ctx.service_class != None: if ctx.out_error is None: ctx.service_class.event_manager.fire_event( 'method_return_string', ctx) else: ctx.service_class.event_manager.fire_event( 'method_exception_string', ctx) if ctx.out_string is None: ctx.out_string = [""]
def incgen(self, ctx, cls, inst, ns, name=None): if name is None: name = cls.get_type_name() with etree.xmlfile(ctx.out_stream) as xf: ret = self.to_parent(ctx, cls, inst, xf, ns, name) if isgenerator(ret): try: while True: y = (yield) # may throw Break ret.send(y) except Break: try: ret.throw(Break()) except StopIteration: pass if hasattr(ctx.out_stream, 'finish'): ctx.out_stream.finish()
def complex_to_parent(self, ctx, cls, inst, parent, name, **kwargs): inst = cls.get_serialization_instance(inst) attrs = self._gen_attr_dict(inst, cls.get_flat_type_info(cls)) with parent.element(name, attrib=attrs): parent.write(" ") ret = self._write_members(ctx, cls, inst, parent, **kwargs) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass
def close(self): try: self.gen.throw(Break()) except (Break, StopIteration, GeneratorExit): pass self._cb_finish()
def _get_members_etree(self, ctx, cls, inst, parent): try: parent_cls = getattr(cls, '__extends__', None) if not (parent_cls is None): ret = self._get_members_etree(ctx, parent_cls, inst, parent) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass for k, v in cls._type_info.items(): sub_cls_attrs = self.get_cls_attrs(v) if sub_cls_attrs.exc: continue try: subvalue = getattr(inst, k, None) except: # e.g. SqlAlchemy could throw NoSuchColumnError subvalue = None # This is a tight loop, so enable this only when necessary. # logger.debug("get %r(%r) from %r: %r" % (k, v, inst, subvalue)) sub_ns = v.Attributes.sub_ns if sub_ns is None: sub_ns = cls.get_namespace() sub_name = v.Attributes.sub_name if sub_name is None: sub_name = k mo = v.Attributes.max_occurs if subvalue is not None and mo > 1: if isinstance(subvalue, PushBase): while True: sv = (yield) ret = self.to_parent(ctx, v, sv, parent, sub_ns, sub_name) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass else: for sv in subvalue: ret = self.to_parent(ctx, v, sv, parent, sub_ns, sub_name) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass # Don't include empty values for # non-nillable optional attributes. elif subvalue is not None or v.Attributes.min_occurs > 0: ret = self.to_parent(ctx, v, subvalue, parent, sub_ns, sub_name) if ret is not None: try: while True: sv2 = (yield) ret.send(sv2) except Break as b: try: ret.throw(b) except StopIteration: pass except Break: pass
def close(self): try: self.gen.throw(Break()) except Break: pass self._cb_finish()
def _get_members_etree(self, ctx, cls, inst, parent, delay): try: parent_cls = getattr(cls, '__extends__', None) if not (parent_cls is None): ret = self._get_members_etree(ctx, parent_cls, inst, parent, delay) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass for k, v in cls._type_info.items(): try: subvalue = getattr(inst, k, None) except: # to guard against e.g. SqlAlchemy throwing NoSuchColumnError subvalue = None # This is a tight loop, so enable this only when necessary. # logger.debug("get %r(%r) from %r: %r" % (k, v, inst, subvalue)) sub_ns = v.Attributes.sub_ns if sub_ns is None: sub_ns = cls.get_namespace() sub_name = v.Attributes.sub_name if sub_name is None: sub_name = k if issubclass(v, XmlAttribute): if v.attribute_of in cls._type_info.keys(): delay.add(k) continue elif issubclass(v, XmlData): v.marshall(self, sub_name, subvalue, parent) continue mo = v.Attributes.max_occurs if subvalue is not None and mo > 1: if isinstance(subvalue, PushBase): while True: sv = (yield) ret = self.to_parent(ctx, v, sv, parent, sub_ns, sub_name) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass else: for sv in subvalue: ret = self.to_parent(ctx, v, sv, parent, sub_ns, sub_name) if ret is not None: try: while True: sv2 = (yield) # may throw Break ret.send(sv2) except Break: try: ret.throw(Break()) except StopIteration: pass # Don't include empty values for non-nillable optional attributes. elif subvalue is not None or v.Attributes.min_occurs > 0: ret = self.to_parent(ctx, v, subvalue, parent, sub_ns, sub_name) if ret is not None: try: while True: sv2 = (yield) ret.send(sv2) except Break as b: try: ret.throw(b) except StopIteration: pass except Break: pass if isinstance(parent, etree._Element): # attribute_of won't work with async. for k in delay: v = cls._type_info[k] subvalue = getattr(inst, k, None) sub_name = v.Attributes.sub_name if sub_name is None: sub_name = k a_of = v.attribute_of ns = cls.__namespace__ attr_parents = parent.findall("{%s}%s" % (ns, a_of)) if cls._type_info[a_of].Attributes.max_occurs > 1: for subsubvalue, attr_parent in zip( subvalue, attr_parents): self.to_parent(ctx, v, subsubvalue, attr_parent, v.get_namespace(), k) else: for attr_parent in attr_parents: self.to_parent(ctx, v, subvalue, attr_parent, v.get_namespace(), k)