コード例 #1
0
ファイル: _base.py プロジェクト: yanni21/spyne
    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
コード例 #2
0
ファイル: to_parent.py プロジェクト: armandomeeuwenoord/spyne
    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
コード例 #3
0
    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
コード例 #4
0
    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
コード例 #5
0
ファイル: _base.py プロジェクト: harshil07/spyne
    def close(self):
        try:
            self.gen.throw(Break())
        except StopIteration:
            pass

        self._cb_finish()
コード例 #6
0
ファイル: xml.py プロジェクト: albatros-tan/spyne
    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
コード例 #7
0
    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
コード例 #8
0
ファイル: xml.py プロジェクト: cdcanasg/spyne
    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
コード例 #9
0
ファイル: xml.py プロジェクト: zhuhj89/spyne
    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
コード例 #10
0
    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
コード例 #11
0
    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
コード例 #12
0
ファイル: _base.py プロジェクト: umarmughal824/spyne
    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)
コード例 #13
0
    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 = [""]
コード例 #14
0
    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 = [""]
コード例 #15
0
ファイル: xml.py プロジェクト: cdcanasg/spyne
    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()
コード例 #16
0
    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
コード例 #17
0
 def close(self):
     try:
         self.gen.throw(Break())
     except (Break, StopIteration, GeneratorExit):
         pass
     self._cb_finish()
コード例 #18
0
ファイル: xml.py プロジェクト: cdcanasg/spyne
    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
コード例 #19
0
 def close(self):
     try:
         self.gen.throw(Break())
     except Break:
         pass
     self._cb_finish()
コード例 #20
0
    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)