| @@ -0,0 +1,5 @@ | |||
| [report] | |||
| omit = | |||
| */python?.?/* | |||
| */site-packages/nose/* | |||
| @@ -0,0 +1,2 @@ | |||
| repo_token: 5AkyFNIcadJWZQU8iA6f9GPtJs2xP8V6C | |||
| @@ -1,6 +1,12 @@ | |||
| language: python | |||
| python: | |||
| - "2.6" | |||
| - "2.7" | |||
| script: ./tox | |||
| env: | |||
| - TOX_ENV=py26 | |||
| - TOX_ENV=py27 | |||
| - TOX_ENV=py33 | |||
| - TOX_ENV=py34 | |||
| - TOX_ENV=flake8 | |||
| install: | |||
| - pip install tox | |||
| script: | |||
| - tox -e $TOX_ENV | |||
| @@ -1,3 +1,5 @@ | |||
| [](https://travis-ci.org/kartoch/wstools)[](https://coveralls.io/r/kartoch/wstools?branch=master) | |||
| General | |||
| ======== | |||
| - Homepage: https://github.com/pycontribs/wstools | |||
| @@ -1,8 +1,7 @@ | |||
| #!/usr/bin/env python | |||
| import os | |||
| import re | |||
| from setuptools import setup, find_packages | |||
| from setuptools import setup | |||
| url = "https://github.com/pycontribs/wstools.git" | |||
| @@ -12,23 +11,24 @@ def read(*rnames): | |||
| os.path.join('.', *rnames) | |||
| ).read() | |||
| long_description = """WSDL parsing services package for Web Services for Python. see """ + url \ | |||
| + read('README.txt')\ | |||
| + read('CHANGES.txt')\ | |||
| long_description = \ | |||
| "WSDL parsing services package for Web Services for Python. see" + url | |||
| from src.wstools.version import __version__ | |||
| from wstools.version import __version__ | |||
| install_requires = [ | |||
| 'docutils' | |||
| ] | |||
| setup( | |||
| name="wstools", | |||
| version=__version__, | |||
| description="wstools", | |||
| maintainer="Gregory Warnes, kiorky, sorin", | |||
| maintainer_email="Gregory.R.Warnes@Pfizer.com, kiorky@cryptelium.net, sorin.sbarnea+os@gmail.com", | |||
| maintainer_email="Gregory.R.Warnes@Pfizer.com, " | |||
| + " kiorky@cryptelium.net, " + "sorin.sbarnea+os@gmail.com", | |||
| url=url, | |||
| long_description=long_description, | |||
| packages=find_packages('src'), | |||
| package_dir={'': 'src'}, | |||
| include_package_data=True, | |||
| install_requires=['docutils'], | |||
| tests_require=['virtualenv>=1.8.4', 'pytest'], | |||
| packages=['wstools'], | |||
| install_requires=install_requires, | |||
| ) | |||
| @@ -1,298 +0,0 @@ | |||
| # Copyright (c) 2003, The Regents of the University of California, | |||
| # through Lawrence Berkeley National Laboratory (subject to receipt of | |||
| # any required approvals from the U.S. Dept. of Energy). All rights | |||
| # reserved. | |||
| # | |||
| """Logging""" | |||
| ident = "$Id$" | |||
| import os | |||
| import sys | |||
| WARN = 1 | |||
| DEBUG = 2 | |||
| class ILogger: | |||
| '''Logger interface, by default this class | |||
| will be used and logging calls are no-ops. | |||
| ''' | |||
| level = 0 | |||
| def __init__(self, msg): | |||
| return | |||
| def warning(self, *args, **kw): | |||
| return | |||
| def debug(self, *args, **kw): | |||
| return | |||
| def error(self, *args, **kw): | |||
| return | |||
| def setLevel(cls, level): | |||
| cls.level = level | |||
| setLevel = classmethod(setLevel) | |||
| debugOn = lambda self: self.level >= DEBUG | |||
| warnOn = lambda self: self.level >= WARN | |||
| class BasicLogger(ILogger): | |||
| last = '' | |||
| def __init__(self, msg, out=sys.stdout): | |||
| self.msg, self.out = msg, out | |||
| def warning(self, msg, *args, **kw): | |||
| if self.warnOn() is False: | |||
| return | |||
| if BasicLogger.last != self.msg: | |||
| BasicLogger.last = self.msg | |||
| print >>self, "---- ", self.msg, " ----" | |||
| print >>self, " %s " % self.WARN, | |||
| print >>self, msg % args | |||
| WARN = '[WARN]' | |||
| def debug(self, msg, *args, **kw): | |||
| if self.debugOn() is False: | |||
| return | |||
| if BasicLogger.last != self.msg: | |||
| BasicLogger.last = self.msg | |||
| print >>self, "---- ", self.msg, " ----" | |||
| print >>self, " %s " % self.DEBUG, | |||
| print >>self, msg % args | |||
| DEBUG = '[DEBUG]' | |||
| def error(self, msg, *args, **kw): | |||
| if BasicLogger.last != self.msg: | |||
| BasicLogger.last = self.msg | |||
| print >>self, "---- ", self.msg, " ----" | |||
| print >>self, " %s " % self.ERROR, | |||
| print >>self, msg % args | |||
| ERROR = '[ERROR]' | |||
| def write(self, *args): | |||
| '''Write convenience function; writes strings. | |||
| ''' | |||
| for s in args: | |||
| self.out.write(s) | |||
| event = ''.join(*args) | |||
| _LoggerClass = BasicLogger | |||
| class GridLogger(ILogger): | |||
| def debug(self, msg, *args, **kw): | |||
| kw['component'] = self.msg | |||
| gridLog(event=msg % args, level='DEBUG', **kw) | |||
| def warning(self, msg, *args, **kw): | |||
| kw['component'] = self.msg | |||
| gridLog(event=msg % args, level='WARNING', **kw) | |||
| def error(self, msg, *args, **kw): | |||
| kw['component'] = self.msg | |||
| gridLog(event=msg % args, level='ERROR', **kw) | |||
| # | |||
| # Registry of send functions for gridLog | |||
| # | |||
| GLRegistry = {} | |||
| class GLRecord(dict): | |||
| """Grid Logging Best Practices Record, Distributed Logging Utilities | |||
| The following names are reserved: | |||
| event -- log event name | |||
| Below is EBNF for the event name part of a log message. | |||
| name = <nodot> ( "." <name> )? | |||
| nodot = {RFC3896-chars except "."} | |||
| Suffixes: | |||
| start: Immediately before the first action in a task. | |||
| end: Immediately after the last action in a task (that succeeded). | |||
| error: an error condition that does not correspond to an end event. | |||
| ts -- timestamp | |||
| level -- logging level (see levels below) | |||
| status -- integer status code | |||
| gid -- global grid identifier | |||
| gid, cgid -- parent/child identifiers | |||
| prog -- program name | |||
| More info: http://www.cedps.net/wiki/index.php/LoggingBestPractices#Python | |||
| reserved -- list of reserved names, | |||
| omitname -- list of reserved names, output only values ('ts', 'event',) | |||
| levels -- dict of levels and description | |||
| """ | |||
| reserved = ('ts', 'event', 'level', 'status', 'gid', 'prog') | |||
| omitname = () | |||
| levels = dict(FATAL='Component cannot continue, or system is unusable.', | |||
| ALERT='Action must be taken immediately.', | |||
| CRITICAL='Critical conditions (on the system).', | |||
| ERROR='Errors in the component; not errors from elsewhere.', | |||
| WARNING='Problems that are recovered from, usually.', | |||
| NOTICE='Normal but significant condition.', | |||
| INFO='Informational messages that would be useful to a deployer or administrator.', | |||
| DEBUG='Lower level information concerning program logic decisions, internal state, etc.', | |||
| TRACE='Finest granularity, similar to "stepping through" the component or system.',) | |||
| def __init__(self, date=None, **kw): | |||
| kw['ts'] = date or self.GLDate() | |||
| kw['gid'] = kw.get('gid') or os.getpid() | |||
| dict.__init__(self, kw) | |||
| def __str__(self): | |||
| """ | |||
| """ | |||
| from cStringIO import StringIO | |||
| s = StringIO() | |||
| n = " " | |||
| reserved = self.reserved | |||
| omitname = self.omitname | |||
| levels = self.levels | |||
| for k in (list(filter(lambda i: i in self, reserved)) + | |||
| list(filter(lambda i: i not in reserved, self.keys())) | |||
| ): | |||
| v = self[k] | |||
| if k in omitname: | |||
| s.write("%s " % self.format[type(v)](v)) | |||
| continue | |||
| if k == reserved[2] and v not in levels: | |||
| pass | |||
| s.write("%s=%s " % (k, self.format[type(v)](v))) | |||
| s.write("\n") | |||
| return s.getvalue() | |||
| class GLDate(str): | |||
| """Grid logging Date Format | |||
| all timestamps should all be in the same time zone (UTC). | |||
| Grid timestamp value format that is a highly readable variant of the ISO8601 time standard [1]: | |||
| YYYY-MM-DDTHH:MM:SS.SSSSSSZ | |||
| """ | |||
| def __new__(self, args=None): | |||
| """args -- datetime (year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]) | |||
| """ | |||
| import datetime | |||
| args = args or datetime.datetime.utcnow() | |||
| l = (args.year, args.month, args.day, args.hour, args.minute, args.second, | |||
| args.microsecond, args.tzinfo or 'Z') | |||
| return str.__new__(self, "%04d-%02d-%02dT%02d:%02d:%02d.%06d%s" % l) | |||
| format = {int: str, float: lambda x: "%lf" % x, long: str, str: lambda x: x, | |||
| unicode: str, GLDate: str, } | |||
| def gridLog(**kw): | |||
| """Send GLRecord, Distributed Logging Utilities | |||
| If the scheme is passed as a keyword parameter | |||
| the value is expected to be a callable function | |||
| that takes 2 parameters: url, outputStr | |||
| GRIDLOG_ON -- turn grid logging on | |||
| GRIDLOG_DEST -- provide URL destination | |||
| """ | |||
| import os | |||
| if not bool(int(os.environ.get('GRIDLOG_ON', 0))): | |||
| return | |||
| url = os.environ.get('GRIDLOG_DEST') | |||
| if url is None: | |||
| return | |||
| ## NOTE: urlparse problem w/customized schemes | |||
| try: | |||
| scheme = url[:url.find('://')] | |||
| send = GLRegistry[scheme] | |||
| send(url, str(GLRecord(**kw)), ) | |||
| except Exception, ex: | |||
| print >>sys.stderr, "*** gridLog failed -- %s" % (str(kw)) | |||
| def sendUDP(url, outputStr): | |||
| from socket import socket, AF_INET, SOCK_DGRAM | |||
| idx1 = url.find('://') + 3 | |||
| idx2 = url.find('/', idx1) | |||
| if idx2 < idx1: | |||
| idx2 = len(url) | |||
| netloc = url[idx1:idx2] | |||
| host, port = (netloc.split(':') + [80])[0:2] | |||
| socket(AF_INET, SOCK_DGRAM).sendto(outputStr, (host, int(port)), ) | |||
| def writeToFile(url, outputStr): | |||
| print >> open(url.split('://')[1], 'a+'), outputStr | |||
| GLRegistry["gridlog-udp"] = sendUDP | |||
| GLRegistry["file"] = writeToFile | |||
| def setBasicLogger(): | |||
| '''Use Basic Logger. | |||
| ''' | |||
| setLoggerClass(BasicLogger) | |||
| BasicLogger.setLevel(0) | |||
| def setGridLogger(): | |||
| '''Use GridLogger for all logging events. | |||
| ''' | |||
| setLoggerClass(GridLogger) | |||
| def setBasicLoggerWARN(): | |||
| '''Use Basic Logger. | |||
| ''' | |||
| setLoggerClass(BasicLogger) | |||
| BasicLogger.setLevel(WARN) | |||
| def setBasicLoggerDEBUG(): | |||
| '''Use Basic Logger. | |||
| ''' | |||
| setLoggerClass(BasicLogger) | |||
| BasicLogger.setLevel(DEBUG) | |||
| def setLoggerClass(loggingClass): | |||
| '''Set Logging Class. | |||
| ''' | |||
| def setLoggerClass(loggingClass): | |||
| '''Set Logging Class. | |||
| ''' | |||
| assert issubclass(loggingClass, ILogger), 'loggingClass must subclass ILogger' | |||
| global _LoggerClass | |||
| _LoggerClass = loggingClass | |||
| def setLevel(level=0): | |||
| '''Set Global Logging Level. | |||
| ''' | |||
| ILogger.level = level | |||
| def getLevel(): | |||
| return ILogger.level | |||
| def getLogger(msg): | |||
| '''Return instance of Logging class. | |||
| ''' | |||
| return _LoggerClass(msg) | |||
| @@ -1 +0,0 @@ | |||
| #! /usr/bin/env python | |||
| @@ -1,25 +0,0 @@ | |||
| ############################################################################ | |||
| # Joshua R. Boverhof, David W. Robertson, LBNL | |||
| # See LBNLCopyright for copyright notice! | |||
| ########################################################################### | |||
| import unittest | |||
| import test_wsdl | |||
| """ | |||
| import utils | |||
| TODO: find where the hell is the missing utils package what is supposed to contain the MatchTestLoader() | |||
| import utils | |||
| def makeTestSuite(): | |||
| suite = unittest.TestSuite() | |||
| suite.addTest(test_wsdl.makeTestSuite("services_by_file")) | |||
| return suite | |||
| def main(): | |||
| loader = utils.MatchTestLoader(True, None, "makeTestSuite") | |||
| unittest.main(defaultTest="makeTestSuite", testLoader=loader) | |||
| """ | |||
| if __name__ == "__main__": | |||
| main() | |||
| @@ -1,42 +0,0 @@ | |||
| #!/usr/bin/env python | |||
| ############################################################################ | |||
| # Joshua R. Boverhof, David W. Robertson, LBNL | |||
| # See LBNLCopyright for copyright notice! | |||
| ########################################################################### | |||
| import unittest | |||
| import tarfile | |||
| import os | |||
| import ConfigParser | |||
| import test_wsdl | |||
| SECTION = 'files' | |||
| CONFIG_FILE = 'config.txt' | |||
| def extractFiles(section, option): | |||
| config = ConfigParser.ConfigParser() | |||
| config.read(CONFIG_FILE) | |||
| archives = config.get(section, option) | |||
| archives = eval(archives) | |||
| for file in archives: | |||
| tar = tarfile.open(file) | |||
| if not os.access(tar.membernames[0], os.R_OK): | |||
| for i in tar.getnames(): | |||
| tar.extract(i) | |||
| def makeTestSuite(): | |||
| suite = unittest.TestSuite() | |||
| suite.addTest(test_wsdl.makeTestSuite("services_by_file")) | |||
| return suite | |||
| def main(): | |||
| extractFiles(SECTION, 'archives') | |||
| unittest.main(defaultTest="makeTestSuite") | |||
| if __name__ == "__main__": | |||
| main() | |||
| @@ -1,33 +0,0 @@ | |||
| #!/usr/bin/env python | |||
| """ | |||
| The main purpose of this file is to run tox only with the current existing python interpretors. | |||
| """ | |||
| import os | |||
| import sys | |||
| import logging | |||
| if __name__ == "__main__": | |||
| log = logging.getLogger() | |||
| # now we'll detect which python interpretors we have on this machine and run the tests for all of them | |||
| #'python2.5':'py25', | |||
| known_pys = { 'python2.6':'py26', 'python2.7':'py27' } # ,'python3':'py3', 'python3.2':'py32', 'python4':'py4'} | |||
| #known_pys = { 'python2.7':'py27' } # ,'python3':'py3', 'python3.2':'py32', 'python4':'py4'} | |||
| detected_pys = set() | |||
| for known_py in known_pys: | |||
| if os.system("which %s >/dev/null" % known_py) == 0: | |||
| detected_pys.add(known_pys[known_py]) | |||
| #detected_pys.add('docs') | |||
| #os.system("python setup.py test") | |||
| cmds = ["autopep8 --ignore=E501 -i *.py tendo/*.py demo/*.py", | |||
| #"pep8", | |||
| "./tox -e %s" % ",".join(detected_pys)] | |||
| for cmd in cmds: | |||
| if os.system(cmd) != 0: | |||
| print("ERROR: Command `%s` failed, testing stopped here." % cmd) | |||
| sys.exit(6) | |||
| @@ -3,41 +3,15 @@ | |||
| # See Copyright for copyright notice! | |||
| ########################################################################### | |||
| ########################################################################### | |||
| # Config file for the unit test framework. | |||
| # Sections below. | |||
| ########################################################################### | |||
| ########################################################################## | |||
| # SECTION [files] - archives of wsdl/xsd files. | |||
| # | |||
| ########################################################################## | |||
| [files] | |||
| archives = ('xmethods.tar.gz', 'schema.tar.gz') | |||
| ########################################################################## | |||
| # SECTION [services_by_file] - all services locally available for | |||
| # testing. | |||
| ########################################################################## | |||
| [services_by_file] | |||
| ogsi = schema/ogsi/ogsi_service.wsdl | |||
| airport = xmethods/airport.wsdl | |||
| distance = xmethods/Distance.wsdl | |||
| freedb = xmethods/freedb.wsdl | |||
| globalweather = xmethods/globalweather.wsdl | |||
| IHaddock = xmethods/IHaddock.wsdl | |||
| ip2geo = xmethods/ip2geo.wsdl | |||
| magic = xmethods/magic.wsdl | |||
| query = xmethods/query.wsdl | |||
| RateInfo = xmethods/RateInfo.wsdl | |||
| SHA1Encrypt = xmethods/SHA1Encrypt.wsdl | |||
| siteInsepct = xmethods/siteInspect.wsdl | |||
| TemperatureService = xmethods/TemperatureService.wsdl | |||
| usweather = xmethods/usweather.wsdl | |||
| zip2geo = xmethods/zip2geo.wsdl | |||
| SolveSystem = xmethods/SolveSystem.wsdl.xml | |||
| ip2geo = data/ip2geo.wsdl | |||
| zip2geo = data/zip2geo.wsdl | |||
| soapi-dlw = data/soapi-1.63.0-dlw.wsdl | |||
| soapi-re = data/soapi-1.63.0-re.wsdl | |||
| ########################################################################## | |||
| # SECTION [services_by_http] - | |||
| @@ -0,0 +1,144 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <wsdl:definitions xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://ws.cdyne.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://ws.cdyne.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> | |||
| <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Our system uses a multiple sources for resolution. Including a host database, trace route information, and other systems. Resolves IP addresses to Organization, Country, City, and State/Province, Latitude, Longitude. In most US cities it will also provide some extra information such as Area Code, and more.</wsdl:documentation> | |||
| <wsdl:types> | |||
| <s:schema elementFormDefault="qualified" targetNamespace="http://ws.cdyne.com/"> | |||
| <s:element name="ResolveIP"> | |||
| <s:complexType> | |||
| <s:sequence> | |||
| <s:element minOccurs="0" maxOccurs="1" name="ipAddress" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="licenseKey" type="s:string" /> | |||
| </s:sequence> | |||
| </s:complexType> | |||
| </s:element> | |||
| <s:element name="ResolveIPResponse"> | |||
| <s:complexType> | |||
| <s:sequence> | |||
| <s:element minOccurs="0" maxOccurs="1" name="ResolveIPResult" type="tns:IPInformation" /> | |||
| </s:sequence> | |||
| </s:complexType> | |||
| </s:element> | |||
| <s:complexType name="IPInformation"> | |||
| <s:sequence> | |||
| <s:element minOccurs="0" maxOccurs="1" name="City" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="StateProvince" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="Country" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="Organization" type="s:string" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="Latitude" type="s:double" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="Longitude" type="s:double" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="AreaCode" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="TimeZone" type="s:string" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="HasDaylightSavings" type="s:boolean" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="Certainty" type="s:short" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="RegionName" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="CountryCode" type="s:string" /> | |||
| </s:sequence> | |||
| </s:complexType> | |||
| <s:element name="IPInformation" nillable="true" type="tns:IPInformation" /> | |||
| </s:schema> | |||
| </wsdl:types> | |||
| <wsdl:message name="ResolveIPSoapIn"> | |||
| <wsdl:part name="parameters" element="tns:ResolveIP" /> | |||
| </wsdl:message> | |||
| <wsdl:message name="ResolveIPSoapOut"> | |||
| <wsdl:part name="parameters" element="tns:ResolveIPResponse" /> | |||
| </wsdl:message> | |||
| <wsdl:message name="ResolveIPHttpGetIn"> | |||
| <wsdl:part name="ipAddress" type="s:string" /> | |||
| <wsdl:part name="licenseKey" type="s:string" /> | |||
| </wsdl:message> | |||
| <wsdl:message name="ResolveIPHttpGetOut"> | |||
| <wsdl:part name="Body" element="tns:IPInformation" /> | |||
| </wsdl:message> | |||
| <wsdl:message name="ResolveIPHttpPostIn"> | |||
| <wsdl:part name="ipAddress" type="s:string" /> | |||
| <wsdl:part name="licenseKey" type="s:string" /> | |||
| </wsdl:message> | |||
| <wsdl:message name="ResolveIPHttpPostOut"> | |||
| <wsdl:part name="Body" element="tns:IPInformation" /> | |||
| </wsdl:message> | |||
| <wsdl:portType name="IP2GeoSoap"> | |||
| <wsdl:operation name="ResolveIP"> | |||
| <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Use a License Key of 0 for Testing</wsdl:documentation> | |||
| <wsdl:input message="tns:ResolveIPSoapIn" /> | |||
| <wsdl:output message="tns:ResolveIPSoapOut" /> | |||
| </wsdl:operation> | |||
| </wsdl:portType> | |||
| <wsdl:portType name="IP2GeoHttpGet"> | |||
| <wsdl:operation name="ResolveIP"> | |||
| <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Use a License Key of 0 for Testing</wsdl:documentation> | |||
| <wsdl:input message="tns:ResolveIPHttpGetIn" /> | |||
| <wsdl:output message="tns:ResolveIPHttpGetOut" /> | |||
| </wsdl:operation> | |||
| </wsdl:portType> | |||
| <wsdl:portType name="IP2GeoHttpPost"> | |||
| <wsdl:operation name="ResolveIP"> | |||
| <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Use a License Key of 0 for Testing</wsdl:documentation> | |||
| <wsdl:input message="tns:ResolveIPHttpPostIn" /> | |||
| <wsdl:output message="tns:ResolveIPHttpPostOut" /> | |||
| </wsdl:operation> | |||
| </wsdl:portType> | |||
| <wsdl:binding name="IP2GeoSoap" type="tns:IP2GeoSoap"> | |||
| <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> | |||
| <wsdl:operation name="ResolveIP"> | |||
| <soap:operation soapAction="http://ws.cdyne.com/ResolveIP" style="document" /> | |||
| <wsdl:input> | |||
| <soap:body use="literal" /> | |||
| </wsdl:input> | |||
| <wsdl:output> | |||
| <soap:body use="literal" /> | |||
| </wsdl:output> | |||
| </wsdl:operation> | |||
| </wsdl:binding> | |||
| <wsdl:binding name="IP2GeoSoap12" type="tns:IP2GeoSoap"> | |||
| <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> | |||
| <wsdl:operation name="ResolveIP"> | |||
| <soap12:operation soapAction="http://ws.cdyne.com/ResolveIP" style="document" /> | |||
| <wsdl:input> | |||
| <soap12:body use="literal" /> | |||
| </wsdl:input> | |||
| <wsdl:output> | |||
| <soap12:body use="literal" /> | |||
| </wsdl:output> | |||
| </wsdl:operation> | |||
| </wsdl:binding> | |||
| <wsdl:binding name="IP2GeoHttpGet" type="tns:IP2GeoHttpGet"> | |||
| <http:binding verb="GET" /> | |||
| <wsdl:operation name="ResolveIP"> | |||
| <http:operation location="/ResolveIP" /> | |||
| <wsdl:input> | |||
| <http:urlEncoded /> | |||
| </wsdl:input> | |||
| <wsdl:output> | |||
| <mime:mimeXml part="Body" /> | |||
| </wsdl:output> | |||
| </wsdl:operation> | |||
| </wsdl:binding> | |||
| <wsdl:binding name="IP2GeoHttpPost" type="tns:IP2GeoHttpPost"> | |||
| <http:binding verb="POST" /> | |||
| <wsdl:operation name="ResolveIP"> | |||
| <http:operation location="/ResolveIP" /> | |||
| <wsdl:input> | |||
| <mime:content type="application/x-www-form-urlencoded" /> | |||
| </wsdl:input> | |||
| <wsdl:output> | |||
| <mime:mimeXml part="Body" /> | |||
| </wsdl:output> | |||
| </wsdl:operation> | |||
| </wsdl:binding> | |||
| <wsdl:service name="IP2Geo"> | |||
| <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Our system uses a multiple sources for resolution. Including a host database, trace route information, and other systems. Resolves IP addresses to Organization, Country, City, and State/Province, Latitude, Longitude. In most US cities it will also provide some extra information such as Area Code, and more.</wsdl:documentation> | |||
| <wsdl:port name="IP2GeoSoap" binding="tns:IP2GeoSoap"> | |||
| <soap:address location="http://ws.cdyne.com/ip2geo/ip2geo.asmx" /> | |||
| </wsdl:port> | |||
| <wsdl:port name="IP2GeoSoap12" binding="tns:IP2GeoSoap12"> | |||
| <soap12:address location="http://ws.cdyne.com/ip2geo/ip2geo.asmx" /> | |||
| </wsdl:port> | |||
| <wsdl:port name="IP2GeoHttpGet" binding="tns:IP2GeoHttpGet"> | |||
| <http:address location="http://ws.cdyne.com/ip2geo/ip2geo.asmx" /> | |||
| </wsdl:port> | |||
| <wsdl:port name="IP2GeoHttpPost" binding="tns:IP2GeoHttpPost"> | |||
| <http:address location="http://ws.cdyne.com/ip2geo/ip2geo.asmx" /> | |||
| </wsdl:port> | |||
| </wsdl:service> | |||
| </wsdl:definitions> | |||
| @@ -0,0 +1,99 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://ws.cdyne.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://ws.cdyne.com" xmlns="http://schemas.xmlsoap.org/wsdl/"> | |||
| <types> | |||
| <s:schema elementFormDefault="qualified" targetNamespace="http://ws.cdyne.com"> | |||
| <s:element name="GetLatLong"> | |||
| <s:complexType> | |||
| <s:sequence> | |||
| <s:element minOccurs="0" maxOccurs="1" name="zipcode" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="LicenseKey" type="s:string" /> | |||
| </s:sequence> | |||
| </s:complexType> | |||
| </s:element> | |||
| <s:element name="GetLatLongResponse"> | |||
| <s:complexType> | |||
| <s:sequence> | |||
| <s:element minOccurs="1" maxOccurs="1" name="GetLatLongResult" type="s0:LatLongReturn" /> | |||
| </s:sequence> | |||
| </s:complexType> | |||
| </s:element> | |||
| <s:complexType name="LatLongReturn"> | |||
| <s:sequence> | |||
| <s:element minOccurs="1" maxOccurs="1" name="ServiceError" type="s:boolean" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="AddressError" type="s:boolean" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="City" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="StateAbbrev" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="ZipCode" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="County" type="s:string" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="FromLongitude" type="s:decimal" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="FromLatitude" type="s:decimal" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="ToLongitude" type="s:decimal" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="ToLatitude" type="s:decimal" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="AvgLongitude" type="s:decimal" /> | |||
| <s:element minOccurs="1" maxOccurs="1" name="AvgLatitude" type="s:decimal" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="CMSA" type="s:string" /> | |||
| <s:element minOccurs="0" maxOccurs="1" name="PMSA" type="s:string" /> | |||
| </s:sequence> | |||
| </s:complexType> | |||
| <s:element name="LatLongReturn" type="s0:LatLongReturn" /> | |||
| </s:schema> | |||
| </types> | |||
| <message name="GetLatLongSoapIn"> | |||
| <part name="parameters" element="s0:GetLatLong" /> | |||
| </message> | |||
| <message name="GetLatLongSoapOut"> | |||
| <part name="parameters" element="s0:GetLatLongResponse" /> | |||
| </message> | |||
| <message name="GetLatLongHttpGetIn"> | |||
| <part name="zipcode" type="s:string" /> | |||
| <part name="LicenseKey" type="s:string" /> | |||
| </message> | |||
| <message name="GetLatLongHttpGetOut"> | |||
| <part name="Body" element="s0:LatLongReturn" /> | |||
| </message> | |||
| <message name="GetLatLongHttpPostIn"> | |||
| <part name="zipcode" type="s:string" /> | |||
| <part name="LicenseKey" type="s:string" /> | |||
| </message> | |||
| <message name="GetLatLongHttpPostOut"> | |||
| <part name="Body" element="s0:LatLongReturn" /> | |||
| </message> | |||
| <portType name="Zip2GeoSoap"> | |||
| <operation name="GetLatLong"> | |||
| <documentation>This method will convert a zip code to Longitude and Latitude. You will get better accuracy with the plus 4 added to the zipcode. Use a license key of 0 for testing.</documentation> | |||
| <input message="s0:GetLatLongSoapIn" /> | |||
| <output message="s0:GetLatLongSoapOut" /> | |||
| </operation> | |||
| </portType> | |||
| <portType name="Zip2GeoHttpGet"> | |||
| <operation name="GetLatLong"> | |||
| <documentation>This method will convert a zip code to Longitude and Latitude. You will get better accuracy with the plus 4 added to the zipcode. Use a license key of 0 for testing.</documentation> | |||
| <input message="s0:GetLatLongHttpGetIn" /> | |||
| <output message="s0:GetLatLongHttpGetOut" /> | |||
| </operation> | |||
| </portType> | |||
| <portType name="Zip2GeoHttpPost"> | |||
| <operation name="GetLatLong"> | |||
| <documentation>This method will convert a zip code to Longitude and Latitude. You will get better accuracy with the plus 4 added to the zipcode. Use a license key of 0 for testing.</documentation> | |||
| <input message="s0:GetLatLongHttpPostIn" /> | |||
| <output message="s0:GetLatLongHttpPostOut" /> | |||
| </operation> | |||
| </portType> | |||
| <binding name="Zip2GeoSoap" type="s0:Zip2GeoSoap"> | |||
| <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> | |||
| <operation name="GetLatLong"> | |||
| <soap:operation soapAction="http://ws.cdyne.com/GetLatLong" style="document" /> | |||
| <input> | |||
| <soap:body use="literal" /> | |||
| </input> | |||
| <output> | |||
| <soap:body use="literal" /> | |||
| </output> | |||
| </operation> | |||
| </binding> | |||
| <service name="Zip2Geo"> | |||
| <port name="Zip2GeoSoap" binding="s0:Zip2GeoSoap"> | |||
| <soap:address location="http://ws.cdyne.com/ziptogeo/zip2geo.asmx" /> | |||
| </port> | |||
| </service> | |||
| </definitions> | |||
| @@ -13,8 +13,7 @@ from wstools.Utility import DOM | |||
| from wstools.WSDLTools import WSDLReader | |||
| from wstools.TimeoutSocket import TimeoutError | |||
| from wstools import tests | |||
| cwd = os.path.dirname(tests.__file__) | |||
| cwd = 'tests' | |||
| # that's for tox/pytest | |||
| nameGenerator = None | |||
| @@ -31,7 +30,6 @@ def makeTestSuite(section='services_by_file'): | |||
| return suite | |||
| @unittest.skip("skipping due broken assets") | |||
| class WSDLToolsTestCase(unittest.TestCase): | |||
| def __init__(self, methodName='runTest'): | |||
| @@ -71,7 +69,7 @@ class WSDLToolsTestCase(unittest.TestCase): | |||
| if self.path[:7] == 'http://': | |||
| self.wsdl = WSDLReader().loadFromURL(self.path) | |||
| else: | |||
| self.wsdl = WSDLReader().loadFromFile(self.path) | |||
| self.wsdl = WSDLReader().loadFromFile('tests/' + self.path) | |||
| except TimeoutError: | |||
| print "connection timed out" | |||
| @@ -166,11 +164,3 @@ def setUpOptions(section): | |||
| def getOption(cp, section): | |||
| for name, value in cp.items(section): | |||
| yield value | |||
| def main(): | |||
| unittest.main(defaultTest="makeTestSuite") | |||
| if __name__ == "__main__": | |||
| main() | |||
| @@ -14,8 +14,9 @@ def makeTestSuite(): | |||
| return suite | |||
| def main(): | |||
| unittest.main(defaultTest="makeTestSuite") | |||
| def test_runner(): | |||
| runner = unittest.TextTestRunner() | |||
| runner.run(makeTestSuite()) | |||
| if __name__ == "__main__": | |||
| main() | |||
| test_runner() | |||
| @@ -1,46 +0,0 @@ | |||
| #!/bin/bash | |||
| set -e | |||
| if which virtualenv >/dev/null; then | |||
| echo | |||
| else | |||
| sudo easy_install "virtualenv>=1.8.4" | |||
| if [ $? -ne 0 ]; then | |||
| echo "failed to install virtualenv, you'll have to fix this yourself" | |||
| exit 1 | |||
| fi | |||
| fi | |||
| if [ -z "$VIRTUAL_ENV" ] | |||
| then | |||
| virtualenv .tox/tox | |||
| cd .tox/tox | |||
| source bin/activate | |||
| #exit 1 | |||
| fi | |||
| if [ -z "$VIRTUAL_ENV" ] | |||
| then | |||
| echo This script should only be run inside a virtual_env. | |||
| exit 1 | |||
| fi | |||
| easy_install "tox>=1.3" | |||
| #pip install tox --upgrade -v | |||
| # pytest pytest-cov | |||
| python setup.py check --restructuredtext --strict | |||
| autopep8 -i -r src/*.py | |||
| # commented some errors temporarly, TODO: remove them and fix the code | |||
| pep8 --max-line-length=180 --ignore=E502,E128,E123,E127,E125 src | |||
| tox -v $@ | |||
| if [ $? -ne 0 ]; then | |||
| echo "Error: tox returned error code $?" | |||
| else | |||
| echo "Done." | |||
| fi | |||
| @@ -1,43 +1,27 @@ | |||
| [tox] | |||
| minversion=1.3 | |||
| envlist = py26,py27 | |||
| #,py27 | |||
| #,py27,py32 | |||
| #,py27,py32 | |||
| addopts = --ignore=setup.py --ignore=.tox --ignore=setuptools --ignore=third | |||
| [pytest] | |||
| rsyncdirs = scripts | |||
| rsyncignore = .hg third | |||
| addopts = -v -v | |||
| [testenv:docs] | |||
| downloadcache={toxworkdir}/downloadcache | |||
| basepython=python | |||
| changedir=doc | |||
| deps=sphinx | |||
| commands= | |||
| sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html | |||
| [tools] | |||
| downloadcache={toxworkdir}/downloadcache | |||
| testing= | |||
| deps= | |||
| minversion = 1.3 | |||
| envlist = py26,py27,py33,py34,flake8 | |||
| [testenv] | |||
| downloadcache={toxworkdir}/downloadcache | |||
| distribute=True | |||
| sitepackages=False | |||
| deps= | |||
| pytest | |||
| nose | |||
| coveralls | |||
| coverage | |||
| commands= | |||
| py.test src | |||
| #nosetests | |||
| nosetests --with-coverage --cover-package=wstools | |||
| bash -c "coveralls || true" | |||
| whitelist_externals=bash | |||
| [testenv:py26] | |||
| downloadcache={toxworkdir}/downloadcache | |||
| deps= | |||
| unittest2 | |||
| commands= | |||
| py.test src | |||
| [testenv:py27] | |||
| [testenv:py33] | |||
| [testenv:py34] | |||
| [testenv:flake8] | |||
| basepython=python2.7 | |||
| deps=flake8 | |||
| commands=flake8 wstools/ | |||
| @@ -1,17 +1,17 @@ | |||
| #TODO add the license | |||
| #I had to rewrite this class because the python MIME email.mime (version 2.5) | |||
| #are buggy, they use \n instead \r\n for new line which is not compliant | |||
| #to standard! | |||
| # TODO add the license | |||
| # I had to rewrite this class because the python MIME email.mime (version 2.5) | |||
| # are buggy, they use \n instead \r\n for new line which is not compliant | |||
| # to standard! | |||
| # http://bugs.python.org/issue5525 | |||
| #TODO do not load all the message in memory stream it from the disk | |||
| # TODO do not load all the message in memory stream it from the disk | |||
| import re | |||
| import random | |||
| import sys | |||
| #new line | |||
| # new line | |||
| NL = '\r\n' | |||
| _width = len(repr(sys.maxint - 1)) | |||
| @@ -27,32 +27,33 @@ class MIMEMessage: | |||
| self._boundary = "" | |||
| def makeBoundary(self): | |||
| #create the boundary | |||
| # create the boundary | |||
| msgparts = [] | |||
| msgparts.append(self._xmlMessage) | |||
| for i in self._files: | |||
| msgparts.append(i.read()) | |||
| #this sucks, all in memory | |||
| # this sucks, all in memory | |||
| alltext = NL.join(msgparts) | |||
| self._boundary = _make_boundary(alltext) | |||
| #maybe I can save some memory | |||
| # maybe I can save some memory | |||
| del alltext | |||
| del msgparts | |||
| self._startCID = "<" + (_fmt % random.randrange(sys.maxint)) + (_fmt % random.randrange(sys.maxint)) + ">" | |||
| self._startCID = "<" + (_fmt % random.randrange(sys.maxint)) \ | |||
| + (_fmt % random.randrange(sys.maxint)) + ">" | |||
| def toString(self): | |||
| '''it return a string with the MIME message''' | |||
| if len(self._boundary) == 0: | |||
| #the makeBoundary hasn't been called yet | |||
| # the makeBoundary hasn't been called yet | |||
| self.makeBoundary() | |||
| #ok we have everything let's start to spit the message out | |||
| #first the XML | |||
| # ok we have everything let's start to spit the message out | |||
| # first the XML | |||
| returnstr = NL + "--" + self._boundary + NL | |||
| returnstr += "Content-Type: text/xml; charset=\"us-ascii\"" + NL | |||
| returnstr += "Content-Transfer-Encoding: 7bit" + NL | |||
| returnstr += "Content-Id: " + self._startCID + NL + NL | |||
| returnstr += self._xmlMessage + NL | |||
| #then the files | |||
| # then the files | |||
| for file in self._files: | |||
| returnstr += "--" + self._boundary + NL | |||
| returnstr += "Content-Type: application/octet-stream" + NL | |||
| @@ -60,7 +61,7 @@ class MIMEMessage: | |||
| returnstr += "Content-Id: <" + str(id(file)) + ">" + NL + NL | |||
| file.seek(0) | |||
| returnstr += file.read() + NL | |||
| #closing boundary | |||
| # closing boundary | |||
| returnstr += "--" + self._boundary + "--" + NL | |||
| return returnstr | |||
| @@ -91,7 +92,7 @@ class MIMEMessage: | |||
| def _make_boundary(text=None): | |||
| #some code taken from python stdlib | |||
| # some code taken from python stdlib | |||
| # Craft a random boundary. If text is given, ensure that the chosen | |||
| # boundary doesn't appear in the text. | |||
| token = random.randrange(sys.maxint) | |||
| @@ -46,7 +46,8 @@ except: | |||
| class DSIG: | |||
| BASE = "http://www.w3.org/2000/09/xmldsig#" | |||
| C14N = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315" | |||
| C14N_COMM = "http://www.w3.org/TR/2000/CR-xml-c14n-20010315#WithComments" | |||
| C14N_COMM = \ | |||
| "http://www.w3.org/TR/2000/CR-xml-c14n-20010315#WithComments" | |||
| C14N_EXCL = "http://www.w3.org/2001/10/xml-exc-c14n#" | |||
| DIGEST_MD2 = "http://www.w3.org/2000/09/xmldsig#md2" | |||
| DIGEST_MD5 = "http://www.w3.org/2000/09/xmldsig#md5" | |||
| @@ -79,41 +80,55 @@ except: | |||
| class WSRF_V1_2: | |||
| '''OASIS WSRF Specifications Version 1.2 | |||
| ''' | |||
| OASIS WSRF Specifications Version 1.2 | |||
| ''' | |||
| class LIFETIME: | |||
| XSD_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceLifetime-1.2-draft-01.xsd" | |||
| XSD_DRAFT4 = "http://docs.oasis-open.org/wsrf/2004/11/wsrf-WS-ResourceLifetime-1.2-draft-04.xsd" | |||
| WSDL_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceLifetime-1.2-draft-01.wsdl" | |||
| WSDL_DRAFT4 = "http://docs.oasis-open.org/wsrf/2004/11/wsrf-WS-ResourceLifetime-1.2-draft-04.wsdl" | |||
| class LIFETIME: | |||
| XSD_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/" | |||
| "wsrf-WS-ResourceLifetime-1.2-draft-01.xsd" | |||
| XSD_DRAFT4 = "http://docs.oasis-open.org/wsrf/2004/11/" | |||
| "wsrf-WS-ResourceLifetime-1.2-draft-04.xsd" | |||
| WSDL_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/" | |||
| "wsrf-WS-ResourceLifetime-1.2-draft-01.wsdl" | |||
| WSDL_DRAFT4 = "http://docs.oasis-open.org/wsrf/2004/11/" | |||
| "wsrf-WS-ResourceLifetime-1.2-draft-04.wsdl" | |||
| LATEST = WSDL_DRAFT4 | |||
| WSDL_LIST = (WSDL_DRAFT1, WSDL_DRAFT4) | |||
| XSD_LIST = (XSD_DRAFT1, XSD_DRAFT4) | |||
| class PROPERTIES: | |||
| XSD_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties-1.2-draft-01.xsd" | |||
| XSD_DRAFT5 = "http://docs.oasis-open.org/wsrf/2004/11/wsrf-WS-ResourceProperties-1.2-draft-05.xsd" | |||
| WSDL_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties-1.2-draft-01.wsdl" | |||
| WSDL_DRAFT5 = "http://docs.oasis-open.org/wsrf/2004/11/wsrf-WS-ResourceProperties-1.2-draft-05.wsdl" | |||
| XSD_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/" | |||
| "wsrf-WS-ResourceProperties-1.2-draft-01.xsd" | |||
| XSD_DRAFT5 = "http://docs.oasis-open.org/wsrf/2004/11/" | |||
| "wsrf-WS-ResourceProperties-1.2-draft-05.xsd" | |||
| WSDL_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/" | |||
| "wsrf-WS-ResourceProperties-1.2-draft-01.wsdl" | |||
| WSDL_DRAFT5 = "http://docs.oasis-open.org/wsrf/2004/11/" | |||
| "wsrf-WS-ResourceProperties-1.2-draft-05.wsdl" | |||
| LATEST = WSDL_DRAFT5 | |||
| WSDL_LIST = (WSDL_DRAFT1, WSDL_DRAFT5) | |||
| XSD_LIST = (XSD_DRAFT1, XSD_DRAFT5) | |||
| class BASENOTIFICATION: | |||
| XSD_DRAFT1 = "http://docs.oasis-open.org/wsn/2004/06/wsn-WS-BaseNotification-1.2-draft-01.xsd" | |||
| WSDL_DRAFT1 = "http://docs.oasis-open.org/wsn/2004/06/wsn-WS-BaseNotification-1.2-draft-01.wsdl" | |||
| XSD_DRAFT1 = "http://docs.oasis-open.org/wsn/2004/06/" | |||
| "wsn-WS-BaseNotification-1.2-draft-01.xsd" | |||
| WSDL_DRAFT1 = "http://docs.oasis-open.org/wsn/2004/06/" | |||
| "wsn-WS-BaseNotification-1.2-draft-01.wsdl" | |||
| LATEST = WSDL_DRAFT1 | |||
| WSDL_LIST = (WSDL_DRAFT1,) | |||
| XSD_LIST = (XSD_DRAFT1,) | |||
| class BASEFAULTS: | |||
| XSD_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-BaseFaults-1.2-draft-01.xsd" | |||
| XSD_DRAFT3 = "http://docs.oasis-open.org/wsrf/2004/11/wsrf-WS-BaseFaults-1.2-draft-03.xsd" | |||
| #LATEST = DRAFT3 | |||
| #WSDL_LIST = (WSDL_DRAFT1, WSDL_DRAFT3) | |||
| XSD_DRAFT1 = "http://docs.oasis-open.org/wsrf/2004/06/" | |||
| "wsrf-WS-BaseFaults-1.2-draft-01.xsd" | |||
| XSD_DRAFT3 = "http://docs.oasis-open.org/wsrf/2004/11/" | |||
| "wsrf-WS-BaseFaults-1.2-draft-03.xsd" | |||
| # LATEST = DRAFT3 | |||
| # WSDL_LIST = (WSDL_DRAFT1, WSDL_DRAFT3) | |||
| XSD_LIST = (XSD_DRAFT1, XSD_DRAFT3) | |||
| WSRF = WSRF_V1_2 | |||
| @@ -123,16 +138,24 @@ WSRFLIST = (WSRF_V1_2,) | |||
| class OASIS: | |||
| '''URLs for Oasis specifications | |||
| ''' | |||
| WSSE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" | |||
| UTILITY = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" | |||
| WSSE = "http://docs.oasis-open.org/wss/2004/01/" | |||
| "oasis-200401-wss-wssecurity-secext-1.0.xsd" | |||
| UTILITY = "http://docs.oasis-open.org/wss/2004/01/" | |||
| "oasis-200401-wss-wssecurity-utility-1.0.xsd" | |||
| class X509TOKEN: | |||
| Base64Binary = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" | |||
| STRTransform = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0" | |||
| PKCS7 = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#PKCS7" | |||
| X509 = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509" | |||
| X509PKIPathv1 = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1" | |||
| X509v3SubjectKeyIdentifier = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3SubjectKeyIdentifier" | |||
| Base64Binary = "http://docs.oasis-open.org/wss/2004/01/" | |||
| "oasis-200401-wss-soap-message-security-1.0#Base64Binary" | |||
| STRTransform = "http://docs.oasis-open.org/wss/2004/01/" | |||
| "oasis-200401-wss-soap-message-security-1.0" | |||
| PKCS7 = "http://docs.oasis-open.org/wss/2004/01/" | |||
| "oasis-200401-wss-x509-token-profile-1.0#PKCS7" | |||
| X509 = "http://docs.oasis-open.org/wss/2004/01/" | |||
| "oasis-200401-wss-x509-token-profile-1.0#X509" | |||
| X509PKIPathv1 = "http://docs.oasis-open.org/wss/2004/01/" | |||
| "oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1" | |||
| X509v3SubjectKeyIdentifier = "http://docs.oasis-open.org/wss/2004/01/" | |||
| "oasis-200401-wss-x509-token-profile-1.0#X509v3SubjectKeyIdentifier" | |||
| LIFETIME = WSRF_V1_2.LIFETIME.XSD_DRAFT1 | |||
| PROPERTIES = WSRF_V1_2.PROPERTIES.XSD_DRAFT1 | |||
| @@ -141,8 +164,9 @@ class OASIS: | |||
| class APACHE: | |||
| '''This name space is defined by AXIS and it is used for the TC in TCapache.py, | |||
| Map and file attachment (DataHandler) | |||
| ''' | |||
| This name space is defined by AXIS and it is used for the TC in | |||
| TCapache.py, Map and file attachment (DataHandler) | |||
| ''' | |||
| AXIS_NS = "http://xml.apache.org/xml-soap" | |||
| @@ -163,8 +187,10 @@ class WSU: | |||
| class WSR: | |||
| PROPERTIES = "http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceProperties" | |||
| LIFETIME = "http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceLifetime" | |||
| PROPERTIES = \ | |||
| "http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceProperties" | |||
| LIFETIME = \ | |||
| "http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceLifetime" | |||
| class WSA200508: | |||
| @@ -196,7 +222,9 @@ WSA_LIST = (WSA200508, WSA200408, WSA200403, WSA200303) | |||
| class _WSAW(str): | |||
| """ Define ADDRESS attribute to be compatible with WSA* layout """ | |||
| """ | |||
| Define ADDRESS attribute to be compatible with WSA* layout | |||
| """ | |||
| ADDRESS = property(lambda s: s) | |||
| WSAW200605 = _WSAW("http://www.w3.org/2006/05/addressing/wsdl") | |||
| @@ -15,7 +15,6 @@ | |||
| ident = "$Id$" | |||
| import string | |||
| import socket | |||
| import select | |||
| import errno | |||
| @@ -24,7 +23,10 @@ WSAEINVAL = getattr(errno, 'WSAEINVAL', 10022) | |||
| class TimeoutSocket: | |||
| """A socket imposter that supports timeout limits.""" | |||
| """ | |||
| A socket imposter that supports timeout limits. | |||
| """ | |||
| def __init__(self, timeout=20, sock=None): | |||
| self.timeout = float(timeout) | |||
| @@ -57,9 +59,8 @@ class TimeoutSocket: | |||
| code = 0 | |||
| else: | |||
| code, why = why | |||
| if code not in ( | |||
| errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK | |||
| ): | |||
| if code not in \ | |||
| (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): | |||
| raise | |||
| r, w, e = select.select([], [sock], [], timeout) | |||
| if w: | |||
| @@ -3,7 +3,8 @@ A more or less complete user-defined wrapper around tuple objects. | |||
| Adapted version of the standard library's UserList. | |||
| Taken from Stefan Schwarzer's ftputil library, available at | |||
| <http://www.ndh.net/home/sschwarzer/python/python_software.html>, and used under this license: | |||
| <http://www.ndh.net/home/sschwarzer/python/python_software.html>, | |||
| and used under this license: | |||
| @@ -43,11 +44,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| # $Id$ | |||
| #XXX tuple instances (in Python 2.2) contain also: | |||
| # XXX tuple instances (in Python 2.2) contain also: | |||
| # __class__, __delattr__, __getattribute__, __hash__, __new__, | |||
| # __reduce__, __setattr__, __str__ | |||
| # What about these? | |||
| class UserTuple: | |||
| def __init__(self, inittuple=None): | |||
| self.data = () | |||
| if inittuple is not None: | |||
| @@ -17,17 +17,33 @@ ident = "$Id$" | |||
| import sys | |||
| import types | |||
| import httplib | |||
| import urllib | |||
| import socket | |||
| import weakref | |||
| from os.path import isfile | |||
| from string import join, strip, split | |||
| from UserDict import UserDict | |||
| from cStringIO import StringIO | |||
| from TimeoutSocket import TimeoutSocket, TimeoutError | |||
| from urlparse import urlparse | |||
| from httplib import HTTPConnection, HTTPSConnection | |||
| import urllib | |||
| from .TimeoutSocket import TimeoutSocket, TimeoutError | |||
| try: | |||
| from io import StringIO | |||
| except ImportError: | |||
| from cStringIO import StringIO | |||
| try: | |||
| from urlparse import urlparse | |||
| except ImportError: | |||
| from urllib.parse import urlparse | |||
| try: | |||
| from httplib import HTTPConnection, HTTPSConnection | |||
| except ImportError: | |||
| from http.client import HTTPConnection, HTTPSConnection | |||
| from exceptions import Exception | |||
| try: | |||
| from ZSI import _get_idstr | |||
| @@ -91,28 +107,35 @@ if sys.version_info[0:2] < (2, 4, 0, 'final', 0)[0:2]: | |||
| class NamespaceError(Exception): | |||
| """Used to indicate a Namespace Error.""" | |||
| class RecursionError(Exception): | |||
| """Used to indicate a HTTP redirect recursion.""" | |||
| class ParseError(Exception): | |||
| """Used to indicate a XML parsing error.""" | |||
| class DOMException(Exception): | |||
| """Used to indicate a problem processing DOM.""" | |||
| class Base: | |||
| """Base class for instance level Logging""" | |||
| def __init__(self, module=__name__): | |||
| self.logger = logging.getLogger('%s-%s(%s)' % (module, self.__class__, _get_idstr(self))) | |||
| def __init__(self, logger=None): | |||
| self.logger = logger or logging.getLogger(__name__) | |||
| class HTTPResponse: | |||
| """Captures the information in an HTTP response message.""" | |||
| def __init__(self, response): | |||
| @@ -124,7 +147,9 @@ class HTTPResponse: | |||
| class TimeoutHTTP(HTTPConnection): | |||
| """A custom http connection object that supports socket timeout.""" | |||
| def __init__(self, host, port=None, timeout=20): | |||
| HTTPConnection.__init__(self, host, port) | |||
| self.timeout = timeout | |||
| @@ -135,12 +160,14 @@ class TimeoutHTTP(HTTPConnection): | |||
| class TimeoutHTTPS(HTTPSConnection): | |||
| """A custom https object that supports socket timeout. Note that this | |||
| is not really complete. The builtin SSL support in the Python socket | |||
| module requires a real socket (type) to be passed in to be hooked to | |||
| SSL. That means our fake socket won't work and our timeout hacks are | |||
| bypassed for send and recv calls. Since our hack _is_ in place at | |||
| connect() time, it should at least provide some timeout protection.""" | |||
| def __init__(self, host, port=None, timeout=20, **kwargs): | |||
| HTTPSConnection.__init__(self, str(host), port, **kwargs) | |||
| self.timeout = timeout | |||
| @@ -224,15 +251,16 @@ def urlopen(url, timeout=20, redirects=None): | |||
| class DOM: | |||
| """The DOM singleton defines a number of XML related constants and | |||
| provides a number of utility methods for DOM related tasks. It | |||
| also provides some basic abstractions so that the rest of the | |||
| package need not care about actual DOM implementation in use.""" | |||
| looseNamespaces = False # if can't find a referenced namespace, try the default one | |||
| # if can't find a referenced namespace, try the default one | |||
| looseNamespaces = False | |||
| # Namespace stuff related to the SOAP specification. | |||
| NS_SOAP_ENV_1_1 = 'http://schemas.xmlsoap.org/soap/envelope/' | |||
| NS_SOAP_ENC_1_1 = 'http://schemas.xmlsoap.org/soap/encoding/' | |||
| @@ -419,7 +447,7 @@ class DOM: | |||
| if node.nodeType != node.ELEMENT_NODE: | |||
| return 0 | |||
| return node.localName == name and \ | |||
| (nsuri is None or self.nsUriMatch(node.namespaceURI, nsuri)) | |||
| (nsuri is None or self.nsUriMatch(node.namespaceURI, nsuri)) | |||
| def getElement(self, node, name, nsuri=None, default=join): | |||
| """Return the first child of node with a matching name and | |||
| @@ -429,8 +457,7 @@ class DOM: | |||
| for child in node.childNodes: | |||
| if child.nodeType == ELEMENT_NODE: | |||
| if ((child.localName == name or name is None) and | |||
| (nsuri is None or nsmatch(child.namespaceURI, nsuri)) | |||
| ): | |||
| (nsuri is None or nsmatch(child.namespaceURI, nsuri))): | |||
| return child | |||
| if default is not join: | |||
| return default | |||
| @@ -555,7 +582,8 @@ class DOM: | |||
| if DOM.looseNamespaces: | |||
| return self.findTargetNS(orig_node) | |||
| else: | |||
| raise DOMException('Value for prefix %s not found.' % prefix) | |||
| raise DOMException('Value for prefix %s not found.' | |||
| % prefix) | |||
| def findDefaultNS(self, node): | |||
| """Return the current default namespace uri for the given node.""" | |||
| @@ -653,7 +681,7 @@ class DOM: | |||
| try: | |||
| result = self.loadDocument(file) | |||
| except Exception, ex: | |||
| except Exception as ex: | |||
| file.close() | |||
| raise ParseError(('Failed to load document %s' % url,) + ex.args) | |||
| else: | |||
| @@ -664,9 +692,11 @@ DOM = DOM() | |||
| class MessageInterface: | |||
| '''Higher Level Interface, delegates to DOM singleton, must | |||
| be subclassed and implement all methods that throw NotImplementedError. | |||
| ''' | |||
| def __init__(self, sw): | |||
| '''Constructor, May be extended, do not override. | |||
| sw -- soapWriter instance | |||
| @@ -725,8 +755,7 @@ class MessageInterface: | |||
| class ElementProxy(Base, MessageInterface): | |||
| ''' | |||
| ''' | |||
| _soap_env_prefix = 'SOAP-ENV' | |||
| _soap_enc_prefix = 'SOAP-ENC' | |||
| _zsi_prefix = 'ZSI' | |||
| @@ -743,11 +772,11 @@ class ElementProxy(Base, MessageInterface): | |||
| _xml_nsuri = XMLNS.XML | |||
| _xmlns_nsuri = XMLNS.BASE | |||
| standard_ns = {\ | |||
| standard_ns = { | |||
| _xml_prefix: _xml_nsuri, | |||
| _xmlns_prefix: _xmlns_nsuri | |||
| } | |||
| reserved_ns = {\ | |||
| reserved_ns = { | |||
| _soap_env_prefix: _soap_env_nsuri, | |||
| _soap_enc_prefix: _soap_enc_nsuri, | |||
| _zsi_prefix: _zsi_nsuri, | |||
| @@ -783,9 +812,11 @@ class ElementProxy(Base, MessageInterface): | |||
| ''' | |||
| from Ft.Xml import XPath | |||
| if not processorNss: | |||
| context = XPath.Context.Context(self.node, processorNss=self.processorNss) | |||
| context = XPath.Context.Context(self.node, | |||
| processorNss=self.processorNss) | |||
| else: | |||
| context = XPath.Context.Context(self.node, processorNss=processorNss) | |||
| context = XPath.Context.Context(self.node, | |||
| processorNss=processorNss) | |||
| nodes = expression.evaluate(context) | |||
| return map(lambda node: ElementProxy(self.sw, node), nodes) | |||
| @@ -804,7 +835,8 @@ class ElementProxy(Base, MessageInterface): | |||
| if localName and self.node: | |||
| check = self._dom.isElement(self.node, localName, namespaceURI) | |||
| if not check: | |||
| raise NamespaceError('unexpected node type %s, expecting %s' % (self.node, localName)) | |||
| raise NamespaceError('unexpected node type %s, expecting %s' | |||
| % (self.node, localName)) | |||
| def setNode(self, node=None): | |||
| if node: | |||
| @@ -813,13 +845,15 @@ class ElementProxy(Base, MessageInterface): | |||
| else: | |||
| self.node = node | |||
| elif self.node: | |||
| node = self._dom.getElement(self.node, self.name, self.namespaceURI, default=None) | |||
| node = self._dom.getElement(self.node, self.name, | |||
| self.namespaceURI, default=None) | |||
| if not node: | |||
| raise NamespaceError('cant find element (%s, %s)' % (self.namespaceURI, self.name)) | |||
| raise NamespaceError('cant find element (%s, %s)' % | |||
| (self.namespaceURI, self.name)) | |||
| self.node = node | |||
| else: | |||
| #self.node = self._dom.create(self.node, self.name, self.namespaceURI, default=None) | |||
| self.createDocument(self.namespaceURI, localName=self.name, doctype=None) | |||
| self.createDocument(self.namespaceURI, localName=self.name, | |||
| doctype=None) | |||
| self.checkNode() | |||
| @@ -845,7 +879,7 @@ class ElementProxy(Base, MessageInterface): | |||
| prefix = 'ns%d' % self._indx | |||
| try: | |||
| self._dom.findNamespaceURI(prefix, self._getNode()) | |||
| except DOMException, ex: | |||
| except DOMException as ex: | |||
| break | |||
| return prefix | |||
| @@ -857,9 +891,9 @@ class ElementProxy(Base, MessageInterface): | |||
| ''' | |||
| try: | |||
| if node and (node.nodeType == node.ELEMENT_NODE) and \ | |||
| (nsuri == self._dom.findDefaultNS(node)): | |||
| (nsuri == self._dom.findDefaultNS(node)): | |||
| return None | |||
| except DOMException, ex: | |||
| except DOMException as ex: | |||
| pass | |||
| if nsuri == XMLNS.XML: | |||
| return self._xml_prefix | |||
| @@ -910,7 +944,7 @@ class ElementProxy(Base, MessageInterface): | |||
| def getPrefix(self, namespaceURI): | |||
| try: | |||
| prefix = self._getPrefix(node=self.node, nsuri=namespaceURI) | |||
| except NamespaceError, ex: | |||
| except NamespaceError as ex: | |||
| prefix = self._getUniquePrefix() | |||
| self.setNamespaceAttribute(prefix, namespaceURI) | |||
| return prefix | |||
| @@ -942,7 +976,8 @@ class ElementProxy(Base, MessageInterface): | |||
| return self.canonicalize() | |||
| def createDocument(self, namespaceURI, localName, doctype=None): | |||
| '''If specified must be a SOAP envelope, else may contruct an empty document. | |||
| '''If specified must be a SOAP envelope, else may contruct an empty | |||
| document. | |||
| ''' | |||
| prefix = self._soap_env_prefix | |||
| @@ -952,22 +987,27 @@ class ElementProxy(Base, MessageInterface): | |||
| self.node = self._dom.createDocument(None, None, None) | |||
| return | |||
| else: | |||
| raise KeyError('only support creation of document in %s' % self.reserved_ns[prefix]) | |||
| raise KeyError('only support creation of document in %s' % | |||
| self.reserved_ns[prefix]) | |||
| document = self._dom.createDocument(nsuri=namespaceURI, qname=qualifiedName, doctype=doctype) | |||
| document = self._dom.createDocument(nsuri=namespaceURI, | |||
| qname=qualifiedName, | |||
| doctype=doctype) | |||
| self.node = document.childNodes[0] | |||
| #set up reserved namespace attributes | |||
| for prefix, nsuri in self.reserved_ns.items(): | |||
| self._setAttributeNS(namespaceURI=self._xmlns_nsuri, | |||
| qualifiedName='%s:%s' % (self._xmlns_prefix, prefix), | |||
| value=nsuri) | |||
| qualifiedName='%s:%s' % (self._xmlns_prefix, | |||
| prefix), | |||
| value=nsuri) | |||
| ############################################# | |||
| #Methods for attributes | |||
| ############################################# | |||
| def hasAttribute(self, namespaceURI, localName): | |||
| return self._dom.hasAttr(self._getNode(), name=localName, nsuri=namespaceURI) | |||
| return self._dom.hasAttr(self._getNode(), name=localName, | |||
| nsuri=namespaceURI) | |||
| def setAttributeType(self, namespaceURI, localName): | |||
| '''set xsi:type | |||
| @@ -1001,7 +1041,7 @@ class ElementProxy(Base, MessageInterface): | |||
| if namespaceURI: | |||
| try: | |||
| prefix = self.getPrefix(namespaceURI) | |||
| except KeyError, ex: | |||
| except KeyError as ex: | |||
| prefix = 'ns2' | |||
| self.setNamespaceAttribute(prefix, namespaceURI) | |||
| qualifiedName = localName | |||
| @@ -1074,7 +1114,8 @@ class ElementProxy(Base, MessageInterface): | |||
| if prefix: | |||
| qualifiedName = '%s:%s' % (prefix, localName) | |||
| node = self.createElementNS(namespaceURI, qualifiedName) | |||
| self._insertBefore(newChild=node._getNode(), refChild=refChild._getNode()) | |||
| self._insertBefore(newChild=node._getNode(), | |||
| refChild=refChild._getNode()) | |||
| return node | |||
| def getElement(self, namespaceURI, localName): | |||
| @@ -1083,7 +1124,8 @@ class ElementProxy(Base, MessageInterface): | |||
| namespaceURI -- namespace of element | |||
| localName -- local name of element | |||
| ''' | |||
| node = self._dom.getElement(self.node, localName, namespaceURI, default=None) | |||
| node = self._dom.getElement(self.node, localName, namespaceURI, | |||
| default=None) | |||
| if node: | |||
| return ElementProxy(self.sw, node) | |||
| return None | |||
| @@ -1137,6 +1179,7 @@ class ElementProxy(Base, MessageInterface): | |||
| class Collection(UserDict): | |||
| """Helper class for maintaining ordered named collections.""" | |||
| default = lambda self, k: k.name | |||
| @@ -1147,7 +1190,8 @@ class Collection(UserDict): | |||
| self._func = key or self.default | |||
| def __getitem__(self, key): | |||
| NumberTypes = (types.IntType, types.LongType, types.FloatType, types.ComplexType) | |||
| NumberTypes = (types.IntType, types.LongType, types.FloatType, | |||
| types.ComplexType) | |||
| if isinstance(key, NumberTypes): | |||
| return self.list[key] | |||
| return self.data[key] | |||
| @@ -1168,7 +1212,9 @@ class Collection(UserDict): | |||
| class CollectionNS(UserDict): | |||
| """Helper class for maintaining ordered named collections.""" | |||
| default = lambda self, k: k.name | |||
| def __init__(self, parent, key=None): | |||
| @@ -1190,18 +1236,21 @@ class CollectionNS(UserDict): | |||
| def __setitem__(self, key, item): | |||
| item.parent = weakref.ref(self) | |||
| self.list.append(item) | |||
| targetNamespace = getattr(item, 'targetNamespace', self.parent().targetNamespace) | |||
| targetNamespace = getattr(item, 'targetNamespace', | |||
| self.parent().targetNamespace) | |||
| if not targetNamespace in self.data: | |||
| self.data[targetNamespace] = {} | |||
| self.data[targetNamespace][key] = item | |||
| def __isSequence(self, key): | |||
| return (type(key) in (types.TupleType, types.ListType) and len(key) == 2) | |||
| return (type(key) in (types.TupleType, types.ListType) | |||
| and len(key) == 2) | |||
| def keys(self): | |||
| keys = [] | |||
| for tns in self.data.keys(): | |||
| keys.append(map(lambda i: (tns, self._func(i)), self.data[tns].values())) | |||
| keys.append(map(lambda i: (tns, self._func(i)), | |||
| self.data[tns].values())) | |||
| return keys | |||
| def items(self): | |||
| @@ -1294,8 +1343,10 @@ if 1: | |||
| # prefixed attribute names during cloning. | |||
| # | |||
| # key (attr.namespaceURI, tag) | |||
| # ('http://www.w3.org/2000/xmlns/', u'xsd') <xml.dom.minidom.Attr instance at 0x82227c4> | |||
| # ('http://www.w3.org/2000/xmlns/', 'xmlns') <xml.dom.minidom.Attr instance at 0x8414b3c> | |||
| # ('http://www.w3.org/2000/xmlns/', u'xsd') | |||
| # <xml.dom.minidom.Attr instance at 0x82227c4> | |||
| # ('http://www.w3.org/2000/xmlns/', 'xmlns') | |||
| # <xml.dom.minidom.Attr instance at 0x8414b3c> | |||
| # | |||
| # xml.dom.minidom.Attr.nodeName = xmlns:xsd | |||
| # xml.dom.minidom.Attr.value = = http://www.w3.org/2001/XMLSchema | |||
| @@ -1314,7 +1365,8 @@ if 1: | |||
| clone = newOwnerDocument.createElementNS(node.namespaceURI, | |||
| node.nodeName) | |||
| for attr in node.attributes.values(): | |||
| clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value) | |||
| clone.setAttributeNS(attr.namespaceURI, attr.nodeName, | |||
| attr.value) | |||
| prefix, tag = xml.dom.minidom._nssplit(attr.nodeName) | |||
| if prefix == 'xmlns': | |||
| @@ -1322,18 +1374,21 @@ if 1: | |||
| elif prefix: | |||
| a = clone.getAttributeNodeNS(attr.namespaceURI, tag) | |||
| else: | |||
| a = clone.getAttributeNodeNS(attr.namespaceURI, attr.nodeName) | |||
| a = clone.getAttributeNodeNS(attr.namespaceURI, | |||
| attr.nodeName) | |||
| a.specified = attr.specified | |||
| if deep: | |||
| for child in node.childNodes: | |||
| c = xml.dom.minidom._clone_node(child, deep, newOwnerDocument) | |||
| c = xml.dom.minidom._clone_node(child, deep, | |||
| newOwnerDocument) | |||
| clone.appendChild(c) | |||
| elif node.nodeType == xml.dom.minidom.Node.DOCUMENT_FRAGMENT_NODE: | |||
| clone = newOwnerDocument.createDocumentFragment() | |||
| if deep: | |||
| for child in node.childNodes: | |||
| c = xml.dom.minidom._clone_node(child, deep, newOwnerDocument) | |||
| c = xml.dom.minidom._clone_node(child, deep, | |||
| newOwnerDocument) | |||
| clone.appendChild(c) | |||
| elif node.nodeType == xml.dom.minidom.Node.TEXT_NODE: | |||
| @@ -1360,14 +1415,16 @@ if 1: | |||
| clone.entities._seq = [] | |||
| clone.notations._seq = [] | |||
| for n in node.notations._seq: | |||
| notation = xml.dom.minidom.Notation(n.nodeName, n.publicId, n.systemId) | |||
| notation = xml.dom.minidom.Notation(n.nodeName, n.publicId, | |||
| n.systemId) | |||
| notation.ownerDocument = newOwnerDocument | |||
| clone.notations._seq.append(notation) | |||
| if hasattr(n, '_call_user_data_handler'): | |||
| n._call_user_data_handler(operation, n, notation) | |||
| for e in node.entities._seq: | |||
| entity = xml.dom.minidom.Entity(e.nodeName, e.publicId, e.systemId, | |||
| e.notationName) | |||
| entity = xml.dom.minidom.Entity(e.nodeName, e.publicId, | |||
| e.systemId, | |||
| e.notationName) | |||
| entity.actualEncoding = e.actualEncoding | |||
| entity.encoding = e.encoding | |||
| entity.version = e.version | |||
| @@ -10,10 +10,14 @@ | |||
| ident = "$Id$" | |||
| import weakref | |||
| from cStringIO import StringIO | |||
| from Namespaces import OASIS, XMLNS, WSA, WSA_LIST, WSAW_LIST, WSRF_V1_2, WSRF | |||
| from Utility import Collection, CollectionNS, DOM, ElementProxy, basejoin | |||
| from XMLSchema import XMLSchema, SchemaReader, WSDLToolsAdapter | |||
| try: | |||
| from io import StringIO | |||
| except ImportError: | |||
| from cStringIO import StringIO | |||
| from .Namespaces import OASIS, XMLNS, WSA, WSA_LIST, WSAW_LIST, WSRF_V1_2, WSRF | |||
| from .Utility import Collection, CollectionNS, DOM, ElementProxy, basejoin | |||
| from .XMLSchema import XMLSchema, SchemaReader, WSDLToolsAdapter | |||
| class WSDLReader: | |||
| @@ -1567,6 +1571,7 @@ class HeaderInfo(ParameterInfo): | |||
| def callInfoFromWSDL(port, name): | |||
| logger = logging.getLogger(__name__) | |||
| """Return a SOAPCallInfo given a WSDL port and operation name.""" | |||
| wsdl = port.getService().getWSDL() | |||
| binding = port.getBinding() | |||
| @@ -1643,10 +1648,9 @@ def callInfoFromWSDL(port, name): | |||
| operation.output.message) | |||
| else: | |||
| message = wsdl.addMessage(operation.output.message) | |||
| print "Warning:", \ | |||
| "Recieved message not defined in the WSDL schema.", \ | |||
| "Adding it." | |||
| print "Message:", operation.output.message | |||
| logger.warning("Warning: Received message not defined in the " | |||
| "WSDL schema. Adding it.") | |||
| logger.warning("Message:", operation.output.message) | |||
| msgrole = opbinding.output | |||
| @@ -289,7 +289,7 @@ class DOMAdapter(DOMAdapterInterface): | |||
| else: | |||
| try: | |||
| namespace = DOM.findNamespaceURI(prefix, self.__node) | |||
| except DOMException, ex: | |||
| except DOMException as ex: | |||
| if prefix != 'xml': | |||
| raise SchemaError('%s namespace not declared for %s' % (prefix, self.__node._get_tagName())) | |||
| namespace = XMLNS.XML | |||
| @@ -629,7 +629,7 @@ class XMLSchemaComponent(XMLBase, MarkerInterface): | |||
| if parent.targetNamespace == namespace: | |||
| try: | |||
| obj = getattr(parent, collection)[name] | |||
| except KeyError, ex: | |||
| except KeyError as ex: | |||
| raise KeyError('targetNamespace(%s) collection(%s) has no item(%s)' % (namespace, collection, name)) | |||
| return obj | |||
| @@ -662,7 +662,7 @@ class XMLSchemaComponent(XMLBase, MarkerInterface): | |||
| try: | |||
| obj = getattr(schema, collection)[name] | |||
| except KeyError, ex: | |||
| except KeyError as ex: | |||
| raise KeyError('targetNamespace(%s) collection(%s) has no item(%s)' % (namespace, collection, name)) | |||
| return obj | |||
| @@ -1029,7 +1029,7 @@ class XMLSchema(XMLSchemaComponent): | |||
| empty_namespace = '' | |||
| tag = 'schema' | |||
| def __init__(self, parent=None): | |||
| def __init__(self, parent=None, logger=None): | |||
| """parent -- | |||
| instance variables: | |||
| targetNamespace -- schema's declared targetNamespace, or empty string. | |||
| @@ -1067,7 +1067,7 @@ class XMLSchema(XMLSchemaComponent): | |||
| self._imported_schemas = {} | |||
| self._included_schemas = {} | |||
| self._base_url = None | |||
| self.logger = logging.getLogger('wstools') | |||
| self.logger = logger or logging.getLogger(__name__) | |||
| def getNode(self): | |||
| """ | |||
| @@ -1228,13 +1228,13 @@ class XMLSchema(XMLSchemaComponent): | |||
| slocd[import_ns] = schema | |||
| try: | |||
| tp.loadSchema(schema) | |||
| except NoSchemaLocationWarning, ex: | |||
| except NoSchemaLocationWarning as ex: | |||
| # Dependency declaration, hopefully implementation | |||
| # is aware of this namespace (eg. SOAP,WSDL,?) | |||
| self.logger.debug("IMPORT: %s : %s" % (import_ns, ex)) | |||
| del slocd[import_ns] | |||
| continue | |||
| except SchemaError, ex: | |||
| except SchemaError as ex: | |||
| #warnings.warn(\ | |||
| # '<import namespace="%s" schemaLocation=?>, %s'\ | |||
| # %(import_ns, 'failed to load schema instance') | |||
| @@ -3,6 +3,5 @@ | |||
| ident = "$Id$" | |||
| import WSDLTools | |||
| import XMLname | |||
| import logging | |||
| from . import WSDLTools | |||
| from . import XMLname | |||
| @@ -55,13 +55,13 @@ except: | |||
| class XMLNS: | |||
| BASE = "http://www.w3.org/2000/xmlns/" | |||
| XML = "http://www.w3.org/XML/1998/namespace" | |||
| try: | |||
| import cStringIO | |||
| StringIO = cStringIO | |||
| from io import StringIO | |||
| except ImportError: | |||
| import StringIO | |||
| from cStringIO import StringIO | |||
| _attrs = lambda E: (E.attributes and E.attributes.values()) or [] | |||
| _attrs = lambda E: (E.attributes and list(E.attributes.values())) or [] | |||
| _children = lambda E: E.childNodes or [] | |||
| _IN_XML_NS = lambda n: n.name.startswith("xmlns") | |||
| _inclusive = lambda n: n.unsuppressedPrefixes is None | |||
| @@ -69,7 +69,7 @@ _inclusive = lambda n: n.unsuppressedPrefixes is None | |||
| # Does a document/PI has lesser/greater document order than the | |||
| # first element? | |||
| _LesserElement, _Element, _GreaterElement = range(3) | |||
| _LesserElement, _Element, _GreaterElement = list(range(3)) | |||
| def _sorter(n1, n2): | |||
| @@ -191,7 +191,7 @@ class _implementation: | |||
| canonicalization.''' | |||
| # Collect the initial list of xml:foo attributes. | |||
| xmlattrs = filter(_IN_XML_NS, _attrs(node)) | |||
| xmlattrs = list(filter(_IN_XML_NS, _attrs(node))) | |||
| # Walk up and get all xml:XXX attributes we inherit. | |||
| inherited, parent = [], node.parentNode | |||
| @@ -367,7 +367,7 @@ class _implementation: | |||
| # Create list of NS attributes to render. | |||
| ns_to_render = [] | |||
| for n, v in ns_local.items(): | |||
| for n, v in list(ns_local.items()): | |||
| # If default namespace is XMLNS.BASE or empty, | |||
| # and if an ancestor was the same | |||
| @@ -384,7 +384,7 @@ class _implementation: | |||
| # If not previously rendered | |||
| # and it's inclusive or utilized | |||
| if (n, v) not in ns_rendered.items(): | |||
| if (n, v) not in list(ns_rendered.items()): | |||
| if inclusive or _utilized(n, node, other_attrs, self.unsuppressedPrefixes): | |||
| ns_to_render.append((n, v)) | |||
| elif not inclusive: | |||
| @@ -400,9 +400,9 @@ class _implementation: | |||
| # Else, add all local and ancestor xml attributes | |||
| # Sort and render the attributes. | |||
| if not inclusive or _in_subset(self.subset, node.parentNode): # 0426 | |||
| other_attrs.extend(xml_attrs_local.values()) | |||
| other_attrs.extend(list(xml_attrs_local.values())) | |||
| else: | |||
| other_attrs.extend(xml_attrs.values()) | |||
| other_attrs.extend(list(xml_attrs.values())) | |||
| other_attrs.sort(_sorter) | |||
| for a in other_attrs: | |||
| self._do_attr(a.nodeName, a.value) | |||
| @@ -435,8 +435,8 @@ def Canonicalize(node, output=None, **kw): | |||
| prefixes that should be inherited. | |||
| ''' | |||
| if output: | |||
| apply(_implementation, (node, output.write), kw) | |||
| _implementation(*(node, output.write), **kw) | |||
| else: | |||
| s = StringIO.StringIO() | |||
| apply(_implementation, (node, s.write), kw) | |||
| _implementation(*(node, s.write), **kw) | |||
| return s.getvalue() | |||