summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjortel <devnull@localhost>2010-01-29 19:59:38 +0000
committerjortel <devnull@localhost>2010-01-29 19:59:38 +0000
commitcc3de90994e9f38375712538d578f236b8f17ac9 (patch)
treedb48ea36f1bef821c4f263cc1efb1167b6057613
parent462c118d0c2feeeed588550c14fabf30ecd42fc5 (diff)
downloadsuds-cc3de90994e9f38375712538d578f236b8f17ac9.tar.gz
Add a local document store containing textual copies of static and frequently used documents such as the (http://schemas.xmlsoap.org/soap/encoding/) soap section 5 encoding schema. This is contained because of reports of problems with the http://schemas.xmlsoap.org site.
-rw-r--r--suds/__init__.py2
-rw-r--r--suds/reader.py15
-rw-r--r--suds/store.py565
-rw-r--r--suds/xsd/sxbasic.py12
4 files changed, 586 insertions, 8 deletions
diff --git a/suds/__init__.py b/suds/__init__.py
index bed0da7..3f19a97 100644
--- a/suds/__init__.py
+++ b/suds/__init__.py
@@ -27,7 +27,7 @@ import sys
#
__version__ = '0.3.9'
-__build__="(beta) R648-20100129"
+__build__="(beta) R649-20100129"
#
# Exceptions
diff --git a/suds/reader.py b/suds/reader.py
index 54964b0..c1ec748 100644
--- a/suds/reader.py
+++ b/suds/reader.py
@@ -21,6 +21,7 @@ Contains xml document reader classes.
from suds.sax.parser import Parser
from suds.transport import Request
+from suds.store import DocumentStore
from logging import getLogger
@@ -69,11 +70,17 @@ class DocumentReader:
cache = self.options.cache
d = cache.get(id)
if d is None:
- fp = self.options.transport.open(Request(url))
- sax = Parser()
- d = sax.parse(file=fp)
+ d = self.download(url)
cache.put(id, d)
return d
+
+ def download(self, url):
+ store = DocumentStore()
+ fp = store.open(url)
+ if fp is None:
+ fp = self.options.transport.open(Request(url))
+ sax = Parser()
+ return sax.parse(file=fp)
class DefinitionsReader:
@@ -125,4 +132,4 @@ class DefinitionsReader:
d.options = self.options
for imp in d.imports:
imp.imported.options = self.options
- return d \ No newline at end of file
+ return d
diff --git a/suds/store.py b/suds/store.py
new file mode 100644
index 0000000..2ec1917
--- /dev/null
+++ b/suds/store.py
@@ -0,0 +1,565 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the (LGPL) GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Library Lesser General Public License for more details at
+# ( http://www.gnu.org/licenses/lgpl.html ).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# written by: Jeff Ortel ( jortel@redhat.com )
+
+"""
+Contains XML text for documents to be distributed
+with the suds lib. Also, contains classes for accessing
+these documents.
+"""
+
+from StringIO import StringIO
+from logging import getLogger
+
+log = getLogger(__name__)
+
+
+#
+# Soap section 5 encoding schema.
+#
+encoding = \
+"""<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://schemas.xmlsoap.org/soap/encoding/">
+
+ <xs:attribute name="root">
+ <xs:annotation>
+ <xs:documentation>
+ 'root' can be used to distinguish serialization roots from other
+ elements that are present in a serialization but are not roots of
+ a serialized value graph
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:boolean">
+ <xs:pattern value="0|1"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attributeGroup name="commonAttributes">
+ <xs:annotation>
+ <xs:documentation>
+ Attributes common to all elements that function as accessors or
+ represent independent (multi-ref) values. The href attribute is
+ intended to be used in a manner like CONREF. That is, the element
+ content should be empty iff the href attribute appears
+ </xs:documentation>
+ </xs:annotation>
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:attribute name="href" type="xs:anyURI"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:attributeGroup>
+
+ <!-- Global Attributes. The following attributes are intended to be usable via qualified attribute names on any complex type referencing them. -->
+
+ <!-- Array attributes. Needed to give the type and dimensions of an array's contents, and the offset for partially-transmitted arrays. -->
+
+ <xs:simpleType name="arrayCoordinate">
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+
+ <xs:attribute name="arrayType" type="xs:string"/>
+ <xs:attribute name="offset" type="tns:arrayCoordinate"/>
+
+ <xs:attributeGroup name="arrayAttributes">
+ <xs:attribute ref="tns:arrayType"/>
+ <xs:attribute ref="tns:offset"/>
+ </xs:attributeGroup>
+
+ <xs:attribute name="position" type="tns:arrayCoordinate"/>
+
+ <xs:attributeGroup name="arrayMemberAttributes">
+ <xs:attribute ref="tns:position"/>
+ </xs:attributeGroup>
+
+ <xs:group name="Array">
+ <xs:sequence>
+ <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
+ </xs:sequence>
+ </xs:group>
+
+ <xs:element name="Array" type="tns:Array"/>
+ <xs:complexType name="Array">
+ <xs:annotation>
+ <xs:documentation>
+ 'Array' is a complex type for accessors identified by position
+ </xs:documentation>
+ </xs:annotation>
+ <xs:group ref="tns:Array" minOccurs="0"/>
+ <xs:attributeGroup ref="tns:arrayAttributes"/>
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:complexType>
+
+ <!-- 'Struct' is a complex type for accessors identified by name.
+ Constraint: No element may be have the same name as any other,
+ nor may any element have a maxOccurs > 1. -->
+
+ <xs:element name="Struct" type="tns:Struct"/>
+
+ <xs:group name="Struct">
+ <xs:sequence>
+ <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
+ </xs:sequence>
+ </xs:group>
+
+ <xs:complexType name="Struct">
+ <xs:group ref="tns:Struct" minOccurs="0"/>
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:complexType>
+
+ <!-- 'Base64' can be used to serialize binary data using base64 encoding
+ as defined in RFC2045 but without the MIME line length limitation. -->
+
+ <xs:simpleType name="base64">
+ <xs:restriction base="xs:base64Binary"/>
+ </xs:simpleType>
+
+ <!-- Element declarations corresponding to each of the simple types in the
+ XML Schemas Specification. -->
+
+ <xs:element name="duration" type="tns:duration"/>
+ <xs:complexType name="duration">
+ <xs:simpleContent>
+ <xs:extension base="xs:duration">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="dateTime" type="tns:dateTime"/>
+ <xs:complexType name="dateTime">
+ <xs:simpleContent>
+ <xs:extension base="xs:dateTime">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+
+
+ <xs:element name="NOTATION" type="tns:NOTATION"/>
+ <xs:complexType name="NOTATION">
+ <xs:simpleContent>
+ <xs:extension base="xs:QName">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+
+ <xs:element name="time" type="tns:time"/>
+ <xs:complexType name="time">
+ <xs:simpleContent>
+ <xs:extension base="xs:time">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="date" type="tns:date"/>
+ <xs:complexType name="date">
+ <xs:simpleContent>
+ <xs:extension base="xs:date">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="gYearMonth" type="tns:gYearMonth"/>
+ <xs:complexType name="gYearMonth">
+ <xs:simpleContent>
+ <xs:extension base="xs:gYearMonth">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="gYear" type="tns:gYear"/>
+ <xs:complexType name="gYear">
+ <xs:simpleContent>
+ <xs:extension base="xs:gYear">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="gMonthDay" type="tns:gMonthDay"/>
+ <xs:complexType name="gMonthDay">
+ <xs:simpleContent>
+ <xs:extension base="xs:gMonthDay">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="gDay" type="tns:gDay"/>
+ <xs:complexType name="gDay">
+ <xs:simpleContent>
+ <xs:extension base="xs:gDay">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="gMonth" type="tns:gMonth"/>
+ <xs:complexType name="gMonth">
+ <xs:simpleContent>
+ <xs:extension base="xs:gMonth">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="boolean" type="tns:boolean"/>
+ <xs:complexType name="boolean">
+ <xs:simpleContent>
+ <xs:extension base="xs:boolean">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="base64Binary" type="tns:base64Binary"/>
+ <xs:complexType name="base64Binary">
+ <xs:simpleContent>
+ <xs:extension base="xs:base64Binary">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="hexBinary" type="tns:hexBinary"/>
+ <xs:complexType name="hexBinary">
+ <xs:simpleContent>
+ <xs:extension base="xs:hexBinary">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="float" type="tns:float"/>
+ <xs:complexType name="float">
+ <xs:simpleContent>
+ <xs:extension base="xs:float">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="double" type="tns:double"/>
+ <xs:complexType name="double">
+ <xs:simpleContent>
+ <xs:extension base="xs:double">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="anyURI" type="tns:anyURI"/>
+ <xs:complexType name="anyURI">
+ <xs:simpleContent>
+ <xs:extension base="xs:anyURI">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="QName" type="tns:QName"/>
+ <xs:complexType name="QName">
+ <xs:simpleContent>
+ <xs:extension base="xs:QName">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+
+ <xs:element name="string" type="tns:string"/>
+ <xs:complexType name="string">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="normalizedString" type="tns:normalizedString"/>
+ <xs:complexType name="normalizedString">
+ <xs:simpleContent>
+ <xs:extension base="xs:normalizedString">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="token" type="tns:token"/>
+ <xs:complexType name="token">
+ <xs:simpleContent>
+ <xs:extension base="xs:token">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="language" type="tns:language"/>
+ <xs:complexType name="language">
+ <xs:simpleContent>
+ <xs:extension base="xs:language">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="Name" type="tns:Name"/>
+ <xs:complexType name="Name">
+ <xs:simpleContent>
+ <xs:extension base="xs:Name">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="NMTOKEN" type="tns:NMTOKEN"/>
+ <xs:complexType name="NMTOKEN">
+ <xs:simpleContent>
+ <xs:extension base="xs:NMTOKEN">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="NCName" type="tns:NCName"/>
+ <xs:complexType name="NCName">
+ <xs:simpleContent>
+ <xs:extension base="xs:NCName">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="NMTOKENS" type="tns:NMTOKENS"/>
+ <xs:complexType name="NMTOKENS">
+ <xs:simpleContent>
+ <xs:extension base="xs:NMTOKENS">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="ID" type="tns:ID"/>
+ <xs:complexType name="ID">
+ <xs:simpleContent>
+ <xs:extension base="xs:ID">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="IDREF" type="tns:IDREF"/>
+ <xs:complexType name="IDREF">
+ <xs:simpleContent>
+ <xs:extension base="xs:IDREF">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="ENTITY" type="tns:ENTITY"/>
+ <xs:complexType name="ENTITY">
+ <xs:simpleContent>
+ <xs:extension base="xs:ENTITY">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="IDREFS" type="tns:IDREFS"/>
+ <xs:complexType name="IDREFS">
+ <xs:simpleContent>
+ <xs:extension base="xs:IDREFS">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="ENTITIES" type="tns:ENTITIES"/>
+ <xs:complexType name="ENTITIES">
+ <xs:simpleContent>
+ <xs:extension base="xs:ENTITIES">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="decimal" type="tns:decimal"/>
+ <xs:complexType name="decimal">
+ <xs:simpleContent>
+ <xs:extension base="xs:decimal">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="integer" type="tns:integer"/>
+ <xs:complexType name="integer">
+ <xs:simpleContent>
+ <xs:extension base="xs:integer">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="nonPositiveInteger" type="tns:nonPositiveInteger"/>
+ <xs:complexType name="nonPositiveInteger">
+ <xs:simpleContent>
+ <xs:extension base="xs:nonPositiveInteger">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="negativeInteger" type="tns:negativeInteger"/>
+ <xs:complexType name="negativeInteger">
+ <xs:simpleContent>
+ <xs:extension base="xs:negativeInteger">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="long" type="tns:long"/>
+ <xs:complexType name="long">
+ <xs:simpleContent>
+ <xs:extension base="xs:long">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="int" type="tns:int"/>
+ <xs:complexType name="int">
+ <xs:simpleContent>
+ <xs:extension base="xs:int">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="short" type="tns:short"/>
+ <xs:complexType name="short">
+ <xs:simpleContent>
+ <xs:extension base="xs:short">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="byte" type="tns:byte"/>
+ <xs:complexType name="byte">
+ <xs:simpleContent>
+ <xs:extension base="xs:byte">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="nonNegativeInteger" type="tns:nonNegativeInteger"/>
+ <xs:complexType name="nonNegativeInteger">
+ <xs:simpleContent>
+ <xs:extension base="xs:nonNegativeInteger">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="unsignedLong" type="tns:unsignedLong"/>
+ <xs:complexType name="unsignedLong">
+ <xs:simpleContent>
+ <xs:extension base="xs:unsignedLong">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="unsignedInt" type="tns:unsignedInt"/>
+ <xs:complexType name="unsignedInt">
+ <xs:simpleContent>
+ <xs:extension base="xs:unsignedInt">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="unsignedShort" type="tns:unsignedShort"/>
+ <xs:complexType name="unsignedShort">
+ <xs:simpleContent>
+ <xs:extension base="xs:unsignedShort">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="unsignedByte" type="tns:unsignedByte"/>
+ <xs:complexType name="unsignedByte">
+ <xs:simpleContent>
+ <xs:extension base="xs:unsignedByte">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="positiveInteger" type="tns:positiveInteger"/>
+ <xs:complexType name="positiveInteger">
+ <xs:simpleContent>
+ <xs:extension base="xs:positiveInteger">
+ <xs:attributeGroup ref="tns:commonAttributes"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:element name="anyType"/>
+</xs:schema>
+"""
+
+
+class DocumentStore:
+ """
+ The I{suds} document store provides a local repository
+ for xml documnts.
+ @cvar protocol: The URL protocol for the store.
+ @type protocol: str
+ @cvar store: The mapping of URL location to documents.
+ @type store: dict
+ """
+
+ protocol = 'suds'
+
+ store = {
+ 'schemas.xmlsoap.org/soap/encoding/' : encoding
+ }
+
+ def open(self, url):
+ """
+ Open a document at the specified url.
+ @param url: A document URL.
+ @type url: str
+ @return: A file pointer to the document.
+ @rtype: StringIO
+ """
+ protocol, location = url.split('://', 1)
+ if protocol == self.protocol:
+ return StringIO(self.store[location])
+ else:
+ return None
diff --git a/suds/xsd/sxbasic.py b/suds/xsd/sxbasic.py
index a10e0cd..4c7e8a4 100644
--- a/suds/xsd/sxbasic.py
+++ b/suds/xsd/sxbasic.py
@@ -786,6 +786,12 @@ class Factory:
#######################################################
# Static Import Bindings :-(
#######################################################
-Import.bind('http://schemas.xmlsoap.org/soap/encoding/')
-Import.bind('http://www.w3.org/XML/1998/namespace', 'http://www.w3.org/2001/xml.xsd')
-Import.bind('http://www.w3.org/2001/XMLSchema', 'http://www.w3.org/2001/XMLSchema.xsd')
+Import.bind(
+ 'http://schemas.xmlsoap.org/soap/encoding/',
+ 'suds://schemas.xmlsoap.org/soap/encoding/')
+Import.bind(
+ 'http://www.w3.org/XML/1998/namespace',
+ 'http://www.w3.org/2001/xml.xsd')
+Import.bind(
+ 'http://www.w3.org/2001/XMLSchema',
+ 'http://www.w3.org/2001/XMLSchema.xsd')