summaryrefslogtreecommitdiff
path: root/suds/wsdl.py
diff options
context:
space:
mode:
authorjortel <devnull@localhost>2008-09-30 21:57:44 +0000
committerjortel <devnull@localhost>2008-09-30 21:57:44 +0000
commit54f9f5a3ea905677725d414152807577ed1ccd83 (patch)
tree8302625d083903736449336dbf37846dec15a444 /suds/wsdl.py
parent59509aa35c791f51bb40d39d89d26ed33978446c (diff)
downloadsuds-54f9f5a3ea905677725d414152807577ed1ccd83.tar.gz
Updated wsdl Definitions and Service: moved methods Definitions->Service. Updated client.py and bindings to support port-based, qualified method lookups as client.service.<port>.<method> for service defining multiple ports. Also, added Client.setport() to set the default port. Also added Client.merge_methods() to that even though services define multiple ports, methods can be invoked via unqualified reference as: client.service.<method> just as thought all methods defined in (1) port. All method names MUST be unique for this to work correcty. Updated entire message flow to pass the wsdl.Method. Moved ServiceDescription to separate module. WARNING: Users that have been working with service with multiple ports and don't know it will have to either do: 1) client.merge_methods() 2) client.setport(), 3) use qualified references to methods as: client.service.<port>.<method>() - or then will get a PortNotFound exception.
Diffstat (limited to 'suds/wsdl.py')
-rw-r--r--suds/wsdl.py51
1 files changed, 34 insertions, 17 deletions
diff --git a/suds/wsdl.py b/suds/wsdl.py
index bf5efa6..c1e6e45 100644
--- a/suds/wsdl.py
+++ b/suds/wsdl.py
@@ -173,7 +173,6 @@ class Definitions(WObject):
self.port_types = {}
self.bindings = {}
self.service = None
- self.methods = {}
self.add_children(self.root)
self.children.sort()
pmd = self.__metadata__.__print__
@@ -272,20 +271,9 @@ class Definitions(WObject):
m.message = SFactory.object('message')
m.message.input = op.input
m.message.output = op.output
- self.methods[name] = m
-
- def method(self, name):
- """
- Get a method defined an one of the portTypes by name.
- @param name: A method name.
- @type name: str
- @return: The requested method object.
- @rtype: I{Method}
- """
- m = self.methods.get(name)
- if m is None:
- raise Exception('method "%s", not-found', name)
- return m
+ m.qname = ':'.join((p.name, name))
+ self.service.methods[m.name] = m
+ self.service.methods[m.qname] = m
class Import(WObject):
@@ -580,8 +568,10 @@ class Binding(NamedObject):
class Service(NamedObject):
"""
Represents <service/>.
- @ivar port: The contained port.
- @type port: Port
+ @ivar port: The contained ports.
+ @type port: [Port,..]
+ @ivar methods: The contained methods for all ports.
+ @type methods: [Method,..]
"""
def __init__(self, root, definitions):
@@ -593,6 +583,7 @@ class Service(NamedObject):
"""
NamedObject.__init__(self, root, definitions)
self.ports = []
+ self.methods = {}
for p in root.getChildren('port'):
port = SFactory.object('Port')
port.name = p.get('name')
@@ -600,6 +591,32 @@ class Service(NamedObject):
address = p.getChild('address')
port.location = address.get('location').encode('utf-8')
self.ports.append(port)
+
+ def port(self, name):
+ """
+ Locate a port by name.
+ @param name: A port name.
+ @type name: str
+ @return: The port object.
+ @rtype: I{Port}
+ """
+ for p in self.ports:
+ if p.name == name:
+ return p
+ raise PortNotFound(name)
+
+ def method(self, name):
+ """
+ Get a method defined an one of the portTypes by name.
+ @param name: A method name.
+ @type name: str
+ @return: The requested method object.
+ @rtype: I{Method}
+ """
+ m = self.methods.get(name)
+ if m is None:
+ raise MethodNotFound(name)
+ return m
def resolve(self, definitions):
"""