summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjortel <devnull@localhost>2010-01-12 17:53:21 +0000
committerjortel <devnull@localhost>2010-01-12 17:53:21 +0000
commit8f4faa9ecb07f6bab61bb4e7210d67d96897c1df (patch)
tree212e4e04f6847fa59d5f1886e0bd697914dfec88
parentdb65417513c25da9571ca649fd8f374605c2a260 (diff)
downloadsuds-8f4faa9ecb07f6bab61bb4e7210d67d96897c1df.tar.gz
Decouple the sax.Parser and the Transport.
-rw-r--r--suds/sax/parser.py26
-rw-r--r--suds/wsdl.py7
-rw-r--r--suds/xsd/sxbasic.py12
3 files changed, 23 insertions, 22 deletions
diff --git a/suds/sax/parser.py b/suds/sax/parser.py
index 447d174..69f871b 100644
--- a/suds/sax/parser.py
+++ b/suds/sax/parser.py
@@ -34,8 +34,6 @@ from suds.sax.document import Document
from suds.sax.element import Element
from suds.sax.text import Text
from suds.sax.attribute import Attribute
-from suds.transport import Request
-from suds.transport.http import HttpTransport
from xml.sax import make_parser, InputSource, ContentHandler
from xml.sax.handler import feature_external_ges
from cStringIO import StringIO
@@ -106,7 +104,7 @@ class Handler(ContentHandler):
class Parser:
- """ sax parser """
+ """ SAX Parser """
@classmethod
def saxparser(cls):
@@ -115,15 +113,15 @@ class Parser:
h = Handler()
p.setContentHandler(h)
return (p, h)
-
- def __init__(self, transport=None):
- if transport is None:
- self.transport = HttpTransport()
- else:
- self.transport = transport
-
- def parse(self, file=None, url=None, string=None):
+ def parse(self, file=None, string=None):
+ """
+ SAX parse XML text.
+ @param file: Parse a python I{file-like} object.
+ @type file: I{file-like} object.
+ @param string: Parse string XML.
+ @type string: str
+ """
timer = metrics.Timer()
timer.start()
sax, handler = self.saxparser()
@@ -132,12 +130,6 @@ class Parser:
timer.stop()
metrics.log.debug('sax (%s) duration: %s', file, timer)
return handler.nodes[0]
- if url is not None:
- fp = self.transport.open(Request(url))
- sax.parse(fp)
- timer.stop()
- metrics.log.debug('sax (%s) duration: %s', url, timer)
- return handler.nodes[0]
if string is not None:
source = InputSource(None)
source.setByteStream(StringIO(string))
diff --git a/suds/wsdl.py b/suds/wsdl.py
index b449711..f9708fd 100644
--- a/suds/wsdl.py
+++ b/suds/wsdl.py
@@ -23,6 +23,7 @@ found in the document.
from logging import getLogger
from suds import *
from suds.sax import splitPrefix
+from suds.transport import Request
from suds.sax.parser import Parser
from suds.sax.element import Element
from suds.bindings.document import Document
@@ -168,8 +169,10 @@ class Definitions(WObject):
@type options: L{options.Options}
"""
log.debug('reading wsdl at: %s ...', url)
- p = Parser(options.transport)
- root = p.parse(url=url).root()
+ fp = options.transport.open(Request(url))
+ p = Parser()
+ d = p.parse(file=fp)
+ root = d.root()
WObject.__init__(self, root)
self.id = objid(self)
self.options = options
diff --git a/suds/xsd/sxbasic.py b/suds/xsd/sxbasic.py
index 04af36d..15ef40e 100644
--- a/suds/xsd/sxbasic.py
+++ b/suds/xsd/sxbasic.py
@@ -26,7 +26,7 @@ from suds.xsd.sxbase import *
from suds.xsd.query import *
from suds.sax import splitPrefix, Namespace
from suds.sax.parser import Parser
-from suds.transport import TransportError
+from suds.transport import Request, TransportError
from urlparse import urljoin
@@ -528,7 +528,10 @@ class Import(SchemaObject):
if '://' not in url:
url = urljoin(self.schema.baseurl, url)
transport = self.schema.options.transport
- root = Parser(transport).parse(url=url).root()
+ p = Parser()
+ fp = transport.open(Request(url))
+ d = p.parse(file=fp)
+ root = d.root()
root.set('url', url)
return self.schema.instance(root, url)
except TransportError:
@@ -579,7 +582,10 @@ class Include(SchemaObject):
if '://' not in url:
url = urljoin(self.schema.baseurl, url)
transport = self.schema.options.transport
- root = Parser(transport).parse(url=url).root()
+ p = Parser()
+ fp = transport.open(Request(url))
+ d = p.parse(file=fp)
+ root = d.root()
root.set('url', url)
self.__applytns(root)
return self.schema.instance(root, url)