From f0b5a0d2b22875f7a6dc7980ffe33dd327b11b12 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Tue, 1 Jul 2014 21:41:41 +0200 Subject: [PATCH 01/76] removing test and tox exec --- test | 33 --------------------------------- tox | 46 ---------------------------------------------- 2 files changed, 79 deletions(-) delete mode 100755 test delete mode 100755 tox diff --git a/test b/test deleted file mode 100755 index 947a45e..0000000 --- a/test +++ /dev/null @@ -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) - diff --git a/tox b/tox deleted file mode 100755 index fe64228..0000000 --- a/tox +++ /dev/null @@ -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 From b89f51039a058973ed31e7206a3889e186833b1a Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Tue, 1 Jul 2014 21:41:55 +0200 Subject: [PATCH 02/76] fixing travis --- .travis.yml | 3 +-- setup.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0e72039..a9283f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: python python: - - "2.6" - "2.7" -script: ./tox +script: tox diff --git a/setup.py b/setup.py index 4626367..90a9ea2 100644 --- a/setup.py +++ b/setup.py @@ -30,5 +30,5 @@ setup( package_dir={'': 'src'}, include_package_data=True, install_requires=['docutils'], - tests_require=['virtualenv>=1.8.4', 'pytest'], + tests_require=['virtualenv', 'pytest'], ) From 18550666ffad83af88f73ed46a9cf0363ba021e8 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Tue, 1 Jul 2014 21:53:43 +0200 Subject: [PATCH 03/76] install tox by pip for travis --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a9283f2..454d4c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: python python: - "2.7" -script: tox +install: + - pip install tox +script: + - tox From 349c5fd7c4a1a796da2909389943d6d6077b1599 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 13:42:03 +0200 Subject: [PATCH 04/76] add py.test install in travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 454d4c3..4abdf9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: python python: - "2.7" install: - - pip install tox + - pip install tox pytest script: - tox From db2b420c292114334b83d894bd7051abb7866621 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 13:52:26 +0200 Subject: [PATCH 05/76] add multiple profiles in tox --- .travis.yml | 5 ++++- tox.ini | 51 +++++++++++++++++++++------------------------------ 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4abdf9e..b8f718d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,9 @@ language: python python: - - "2.7" + - TOX_ENV=py26 + - TOX_ENV=py27 + - TOX_ENV=docs + - TOX_ENV=flake8 install: - pip install tox pytest script: diff --git a/tox.ini b/tox.ini index 0b94756..a92be76 100644 --- a/tox.ini +++ b/tox.ini @@ -1,43 +1,34 @@ [tox] -minversion=1.3 +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 + - TOX_ENV=py26 + - TOX_ENV=py27 + - TOX_ENV=docs + - TOX_ENV=flake8 -[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= [testenv] -downloadcache={toxworkdir}/downloadcache -distribute=True -sitepackages=False deps= pytest - commands= - py.test src -#nosetests + nosetests [testenv:py26] + +[testenv:py27] + +[testenv:docs] downloadcache={toxworkdir}/downloadcache -deps= - unittest2 +basepython=python2.7 +changedir=doc +deps=sphinx commands= - py.test src \ No newline at end of file + sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html + +[testenv:flake8] +basepython=python2.7 +deps=flake8 +commands= + flake8 djohno + From af8c896d252a0d447fde9a58c983852c65c5abbd Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 13:55:14 +0200 Subject: [PATCH 06/76] fixing TOX_ENV variable to toxc executable --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b8f718d..a0d1402 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,5 +7,5 @@ python: install: - pip install tox pytest script: - - tox + - tox -e $TOX_ENV From 17154c71157ec22b1d9e0a849f0dade1ddeec2c6 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 13:58:29 +0200 Subject: [PATCH 07/76] fixing build for travis --- tox.ini | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tox.ini b/tox.ini index a92be76..b06ef41 100644 --- a/tox.ini +++ b/tox.ini @@ -1,12 +1,6 @@ [tox] minversion = 1.3 -envlist = py26,py27 - - - TOX_ENV=py26 - - TOX_ENV=py27 - - TOX_ENV=docs - - TOX_ENV=flake8 - +envlist = py26,py27,docs,flake8 [testenv] deps= From 743ccb3772ae42cfdc58fa1a092f366d3b496352 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 14:24:42 +0200 Subject: [PATCH 08/76] setup env in travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a0d1402..7ec4c24 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: python -python: +env: - TOX_ENV=py26 - TOX_ENV=py27 - TOX_ENV=docs From af533c696d7992b353da769897ea884a89a6855b Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 14:59:50 +0200 Subject: [PATCH 09/76] removing useless __init__.py --- src/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/__init__.py diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index e69de29..0000000 From b3b3d33c2cd01ce39d79780ee908228abc7539db Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 15:00:19 +0200 Subject: [PATCH 10/76] activate main test --- src/wstools/tests/test_wsdl.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wstools/tests/test_wsdl.py b/src/wstools/tests/test_wsdl.py index fb7259f..1b7e10e 100644 --- a/src/wstools/tests/test_wsdl.py +++ b/src/wstools/tests/test_wsdl.py @@ -31,7 +31,6 @@ def makeTestSuite(section='services_by_file'): return suite -@unittest.skip("skipping due broken assets") class WSDLToolsTestCase(unittest.TestCase): def __init__(self, methodName='runTest'): From a80e6270f722ebd4a709dad5ae33fb30b8be5a83 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 15:00:47 +0200 Subject: [PATCH 11/76] chmod 644 on py files --- src/wstools/Namespaces.py | 0 src/wstools/TimeoutSocket.py | 0 src/wstools/Utility.py | 0 src/wstools/WSDLTools.py | 0 src/wstools/XMLSchema.py | 0 src/wstools/c14n.py | 0 6 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/wstools/Namespaces.py mode change 100755 => 100644 src/wstools/TimeoutSocket.py mode change 100755 => 100644 src/wstools/Utility.py mode change 100755 => 100644 src/wstools/WSDLTools.py mode change 100755 => 100644 src/wstools/XMLSchema.py mode change 100755 => 100644 src/wstools/c14n.py diff --git a/src/wstools/Namespaces.py b/src/wstools/Namespaces.py old mode 100755 new mode 100644 diff --git a/src/wstools/TimeoutSocket.py b/src/wstools/TimeoutSocket.py old mode 100755 new mode 100644 diff --git a/src/wstools/Utility.py b/src/wstools/Utility.py old mode 100755 new mode 100644 diff --git a/src/wstools/WSDLTools.py b/src/wstools/WSDLTools.py old mode 100755 new mode 100644 diff --git a/src/wstools/XMLSchema.py b/src/wstools/XMLSchema.py old mode 100755 new mode 100644 diff --git a/src/wstools/c14n.py b/src/wstools/c14n.py old mode 100755 new mode 100644 From 40fbcd20619c434fab716c68987b79a97aa831b5 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 15:04:03 +0200 Subject: [PATCH 12/76] fixing setup for handling package version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 90a9ea2..d57a692 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ setup( url=url, long_description=long_description, packages=find_packages('src'), - package_dir={'': 'src'}, + package_dir={'wstools': 'src/wstools'}, include_package_data=True, install_requires=['docutils'], tests_require=['virtualenv', 'pytest'], From 867186b0c1faf6d93f57c4f99437e259ac8825ac Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 15:08:26 +0200 Subject: [PATCH 13/76] fixing setup.py for package name --- setup.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index d57a692..81fa1d8 100644 --- a/setup.py +++ b/setup.py @@ -26,9 +26,8 @@ setup( 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={'wstools': 'src/wstools'}, + packages=['wstools'], + package_dir={'': 'src'}, include_package_data=True, install_requires=['docutils'], - tests_require=['virtualenv', 'pytest'], ) From c25077ab805becdf5fa40adec118ddcc87672f9e Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 15:25:30 +0200 Subject: [PATCH 14/76] add __init__.py to make setup happy --- src/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/__init__.py diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 From 233c3bfc2bb7afed3f5d0b816e280fea2520ed28 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 21:16:48 +0200 Subject: [PATCH 15/76] switching off local tests --- src/wstools/tests/config.txt | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/wstools/tests/config.txt b/src/wstools/tests/config.txt index 6ebbe19..6506613 100644 --- a/src/wstools/tests/config.txt +++ b/src/wstools/tests/config.txt @@ -21,23 +21,23 @@ 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 +#[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 ########################################################################## # SECTION [services_by_http] - From 5194c34c0e81db8a9e2e42c7fb07f809693f623c Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 21:36:04 +0200 Subject: [PATCH 16/76] better test dependencies for travis --- .travis.yml | 2 +- setup.py | 11 ++++++++++- tox.ini | 12 ++++-------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7ec4c24..1c74ffb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ env: - TOX_ENV=docs - TOX_ENV=flake8 install: - - pip install tox pytest + - pip install tox script: - tox -e $TOX_ENV diff --git a/setup.py b/setup.py index 81fa1d8..6ed0914 100644 --- a/setup.py +++ b/setup.py @@ -18,6 +18,14 @@ long_description = """WSDL parsing services package for Web Services for Python. from src.wstools.version import __version__ +install_requires = [ + 'docutils' +] + +test_requires = [ + 'nose' +] + setup( name="wstools", version=__version__, @@ -29,5 +37,6 @@ setup( packages=['wstools'], package_dir={'': 'src'}, include_package_data=True, - install_requires=['docutils'], + install_requires=install_requires, + tests_require=test_requires, ) diff --git a/tox.ini b/tox.ini index b06ef41..f9f9891 100644 --- a/tox.ini +++ b/tox.ini @@ -3,10 +3,8 @@ minversion = 1.3 envlist = py26,py27,docs,flake8 [testenv] -deps= - pytest -commands= - nosetests +deps=nose +commands=nosetests [testenv:py26] @@ -17,12 +15,10 @@ downloadcache={toxworkdir}/downloadcache basepython=python2.7 changedir=doc deps=sphinx -commands= - sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html +commands=sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html [testenv:flake8] basepython=python2.7 deps=flake8 -commands= - flake8 djohno +commands=flake8 djohno From 0a1c3a0a6f1a8867b12a93ee565d1d2e24039022 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 21:40:14 +0200 Subject: [PATCH 17/76] fixing flake8 entry in tox --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index f9f9891..ae71144 100644 --- a/tox.ini +++ b/tox.ini @@ -20,5 +20,5 @@ commands=sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html [testenv:flake8] basepython=python2.7 deps=flake8 -commands=flake8 djohno +commands=flake8 src/wstools/ From d22ce11325db7563bb40e691f0a20527c1503025 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 22:02:10 +0200 Subject: [PATCH 18/76] activating one local test --- src/wstools/tests/config.txt | 4 +- src/wstools/tests/xmethods/zip2geo.wsdl | 99 +++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 src/wstools/tests/xmethods/zip2geo.wsdl diff --git a/src/wstools/tests/config.txt b/src/wstools/tests/config.txt index 6506613..b3bde8f 100644 --- a/src/wstools/tests/config.txt +++ b/src/wstools/tests/config.txt @@ -21,7 +21,7 @@ archives = ('xmethods.tar.gz', 'schema.tar.gz') # SECTION [services_by_file] - all services locally available for # testing. ########################################################################## -#[services_by_file] +[services_by_file] #ogsi = schema/ogsi/ogsi_service.wsdl #airport = xmethods/airport.wsdl #distance = xmethods/Distance.wsdl @@ -36,7 +36,7 @@ archives = ('xmethods.tar.gz', 'schema.tar.gz') #siteInsepct = xmethods/siteInspect.wsdl #TemperatureService = xmethods/TemperatureService.wsdl #usweather = xmethods/usweather.wsdl -#zip2geo = xmethods/zip2geo.wsdl +zip2geo = xmethods/zip2geo.wsdl #SolveSystem = xmethods/SolveSystem.wsdl.xml ########################################################################## diff --git a/src/wstools/tests/xmethods/zip2geo.wsdl b/src/wstools/tests/xmethods/zip2geo.wsdl new file mode 100644 index 0000000..4be1f39 --- /dev/null +++ b/src/wstools/tests/xmethods/zip2geo.wsdl @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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. + + + + + + + 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. + + + + + + + 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. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From d113e606e8f87d9a01d614e2c6cfa873fa92a919 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 22:41:14 +0200 Subject: [PATCH 19/76] add another local xmethods wsdl --- src/wstools/tests/config.txt | 2 +- src/wstools/tests/xmethods/ip2geo.wsdl | 144 +++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 src/wstools/tests/xmethods/ip2geo.wsdl diff --git a/src/wstools/tests/config.txt b/src/wstools/tests/config.txt index b3bde8f..69e08b1 100644 --- a/src/wstools/tests/config.txt +++ b/src/wstools/tests/config.txt @@ -28,7 +28,7 @@ archives = ('xmethods.tar.gz', 'schema.tar.gz') #freedb = xmethods/freedb.wsdl #globalweather = xmethods/globalweather.wsdl #IHaddock = xmethods/IHaddock.wsdl -#ip2geo = xmethods/ip2geo.wsdl +ip2geo = xmethods/ip2geo.wsdl #magic = xmethods/magic.wsdl #query = xmethods/query.wsdl #RateInfo = xmethods/RateInfo.wsdl diff --git a/src/wstools/tests/xmethods/ip2geo.wsdl b/src/wstools/tests/xmethods/ip2geo.wsdl new file mode 100644 index 0000000..b3e1ffb --- /dev/null +++ b/src/wstools/tests/xmethods/ip2geo.wsdl @@ -0,0 +1,144 @@ + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Use a License Key of 0 for Testing + + + + + + + Use a License Key of 0 for Testing + + + + + + + Use a License Key of 0 for Testing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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. + + + + + + + + + + + + + + \ No newline at end of file From 2a8aba547eaabb914c0842407fbc1521354dc6ec Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 22:41:35 +0200 Subject: [PATCH 20/76] print cwd for debug --- src/wstools/tests/test_wsdl.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wstools/tests/test_wsdl.py b/src/wstools/tests/test_wsdl.py index 1b7e10e..b9b2c2f 100644 --- a/src/wstools/tests/test_wsdl.py +++ b/src/wstools/tests/test_wsdl.py @@ -67,6 +67,8 @@ class WSDLToolsTestCase(unittest.TestCase): def test_all(self): try: + print "=>" + self.path + print "=>" + os.getcwd() if self.path[:7] == 'http://': self.wsdl = WSDLReader().loadFromURL(self.path) else: From 7961327fb77025acd45c58cca21804ff134bb6a4 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Wed, 2 Jul 2014 22:47:10 +0200 Subject: [PATCH 21/76] ugly fix path to wsdl local files --- src/wstools/tests/test_wsdl.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/wstools/tests/test_wsdl.py b/src/wstools/tests/test_wsdl.py index b9b2c2f..d4a3a51 100644 --- a/src/wstools/tests/test_wsdl.py +++ b/src/wstools/tests/test_wsdl.py @@ -67,12 +67,10 @@ class WSDLToolsTestCase(unittest.TestCase): def test_all(self): try: - print "=>" + self.path - print "=>" + os.getcwd() if self.path[:7] == 'http://': self.wsdl = WSDLReader().loadFromURL(self.path) else: - self.wsdl = WSDLReader().loadFromFile(self.path) + self.wsdl = WSDLReader().loadFromFile('src/wstools/tests/' + self.path) except TimeoutError: print "connection timed out" From c3cc4815fb40fedc9da614c0f78b30453efcbbff Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 20:20:55 +0200 Subject: [PATCH 22/76] add support for coveralls --- .coveragerc | 5 +++++ .coveralls.yml | 2 ++ .travis.yml | 2 +- tox.ini | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .coveragerc create mode 100644 .coveralls.yml diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..4dbfced --- /dev/null +++ b/.coveragerc @@ -0,0 +1,5 @@ +[report] +omit = + */python?.?/* + */site-packages/nose/* + diff --git a/.coveralls.yml b/.coveralls.yml new file mode 100644 index 0000000..b57fb0a --- /dev/null +++ b/.coveralls.yml @@ -0,0 +1,2 @@ +repo_token: 5AkyFNIcadJWZQU8iA6f9GPtJs2xP8V6C + diff --git a/.travis.yml b/.travis.yml index 1c74ffb..a7f3a83 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ env: - TOX_ENV=docs - TOX_ENV=flake8 install: - - pip install tox + - pip install tox coveralls script: - tox -e $TOX_ENV diff --git a/tox.ini b/tox.ini index ae71144..619a181 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ envlist = py26,py27,docs,flake8 [testenv] deps=nose -commands=nosetests +commands=nosetests --with-coverage --cover-package=wstools [testenv:py26] From e76676e39dffe69326f596750a31f59f763d95fa Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 20:25:12 +0200 Subject: [PATCH 23/76] add coverage package for coveralls support --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a7f3a83..f83ec7a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ env: - TOX_ENV=docs - TOX_ENV=flake8 install: - - pip install tox coveralls + - pip install tox coveralls coverage script: - tox -e $TOX_ENV From 679b8af1511c67ef39756d4f2c7868cee24f6db4 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 20:32:48 +0200 Subject: [PATCH 24/76] moving coverage and coveralls packages to tox --- .travis.yml | 2 +- tox.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f83ec7a..1c74ffb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ env: - TOX_ENV=docs - TOX_ENV=flake8 install: - - pip install tox coveralls coverage + - pip install tox script: - tox -e $TOX_ENV diff --git a/tox.ini b/tox.ini index 619a181..83d963e 100644 --- a/tox.ini +++ b/tox.ini @@ -3,7 +3,7 @@ minversion = 1.3 envlist = py26,py27,docs,flake8 [testenv] -deps=nose +deps=nose coveralls coverage commands=nosetests --with-coverage --cover-package=wstools [testenv:py26] From 3cf3d3a8d8a0c9012fd64a0bc0d3ae8cb52750cb Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 20:37:22 +0200 Subject: [PATCH 25/76] tox deps as multi-line --- tox.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 83d963e..6b4094a 100644 --- a/tox.ini +++ b/tox.ini @@ -3,7 +3,9 @@ minversion = 1.3 envlist = py26,py27,docs,flake8 [testenv] -deps=nose coveralls coverage +deps=nose + coveralls + coverage commands=nosetests --with-coverage --cover-package=wstools [testenv:py26] From cbe77afa38aded431b696891a235a6cd6bfb8a21 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 20:48:59 +0200 Subject: [PATCH 26/76] add explicit call to coveralls binary --- tox.ini | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tox.ini b/tox.ini index 6b4094a..e93e24a 100644 --- a/tox.ini +++ b/tox.ini @@ -3,10 +3,14 @@ minversion = 1.3 envlist = py26,py27,docs,flake8 [testenv] -deps=nose - coveralls - coverage -commands=nosetests --with-coverage --cover-package=wstools +deps= + nose + coveralls + coverage +commands= + nosetests --with-coverage --cover-package=wstools + bash -c "coveralls || true" +whitelist_externals=bash [testenv:py26] From 09fcfca152e14734a49f1934d69279514194b093 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 21:10:00 +0200 Subject: [PATCH 27/76] reordering directories to separate src from tests --- setup.py | 9 +-------- src/__init__.py | 0 src/wstools/tests/__init__.py | 1 - {src/wstools => tests}/.cvsignore | 0 {src/wstools/tests => tests}/README | 0 {src/wstools/tests => tests}/config.txt | 0 {src/wstools/tests => tests}/schema.tar.gz | Bin {src/wstools/tests => tests}/test_t1.py | 0 {src/wstools/tests => tests}/test_wsdl.py | 2 +- {src/wstools/tests => tests}/test_wstools.py | 0 {src/wstools/tests => tests}/test_wstools_net.py | 0 {src/wstools/tests => tests}/xmethods.tar.gz | Bin {src/wstools/tests => tests}/xmethods/ip2geo.wsdl | 0 {src/wstools/tests => tests}/xmethods/zip2geo.wsdl | 0 {src/wstools/tests => wstools}/.cvsignore | 0 {src/wstools => wstools}/MIMEAttachment.py | 0 {src/wstools => wstools}/Namespaces.py | 0 {src/wstools => wstools}/TimeoutSocket.py | 0 {src/wstools => wstools}/UserTuple.py | 0 {src/wstools => wstools}/Utility.py | 0 {src/wstools => wstools}/WSDLTools.py | 0 {src/wstools => wstools}/XMLSchema.py | 0 {src/wstools => wstools}/XMLname.py | 0 {src/wstools => wstools}/__init__.py | 0 {src/wstools => wstools}/c14n.py | 0 {src/wstools => wstools}/logging.py | 0 {src/wstools => wstools}/version.py | 0 27 files changed, 2 insertions(+), 10 deletions(-) delete mode 100644 src/__init__.py delete mode 100644 src/wstools/tests/__init__.py rename {src/wstools => tests}/.cvsignore (100%) rename {src/wstools/tests => tests}/README (100%) rename {src/wstools/tests => tests}/config.txt (100%) rename {src/wstools/tests => tests}/schema.tar.gz (100%) rename {src/wstools/tests => tests}/test_t1.py (100%) rename {src/wstools/tests => tests}/test_wsdl.py (98%) rename {src/wstools/tests => tests}/test_wstools.py (100%) rename {src/wstools/tests => tests}/test_wstools_net.py (100%) rename {src/wstools/tests => tests}/xmethods.tar.gz (100%) rename {src/wstools/tests => tests}/xmethods/ip2geo.wsdl (100%) rename {src/wstools/tests => tests}/xmethods/zip2geo.wsdl (100%) rename {src/wstools/tests => wstools}/.cvsignore (100%) rename {src/wstools => wstools}/MIMEAttachment.py (100%) rename {src/wstools => wstools}/Namespaces.py (100%) rename {src/wstools => wstools}/TimeoutSocket.py (100%) rename {src/wstools => wstools}/UserTuple.py (100%) rename {src/wstools => wstools}/Utility.py (100%) rename {src/wstools => wstools}/WSDLTools.py (100%) rename {src/wstools => wstools}/XMLSchema.py (100%) rename {src/wstools => wstools}/XMLname.py (100%) rename {src/wstools => wstools}/__init__.py (100%) rename {src/wstools => wstools}/c14n.py (100%) rename {src/wstools => wstools}/logging.py (100%) rename {src/wstools => wstools}/version.py (100%) diff --git a/setup.py b/setup.py index 6ed0914..ee5911b 100644 --- a/setup.py +++ b/setup.py @@ -16,16 +16,12 @@ long_description = """WSDL parsing services package for Web Services for Python. + read('README.txt')\ + read('CHANGES.txt')\ -from src.wstools.version import __version__ +from wstools.version import __version__ install_requires = [ 'docutils' ] -test_requires = [ - 'nose' -] - setup( name="wstools", version=__version__, @@ -35,8 +31,5 @@ setup( url=url, long_description=long_description, packages=['wstools'], - package_dir={'': 'src'}, - include_package_data=True, install_requires=install_requires, - tests_require=test_requires, ) diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/wstools/tests/__init__.py b/src/wstools/tests/__init__.py deleted file mode 100644 index ee3ecd2..0000000 --- a/src/wstools/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -#! /usr/bin/env python diff --git a/src/wstools/.cvsignore b/tests/.cvsignore similarity index 100% rename from src/wstools/.cvsignore rename to tests/.cvsignore diff --git a/src/wstools/tests/README b/tests/README similarity index 100% rename from src/wstools/tests/README rename to tests/README diff --git a/src/wstools/tests/config.txt b/tests/config.txt similarity index 100% rename from src/wstools/tests/config.txt rename to tests/config.txt diff --git a/src/wstools/tests/schema.tar.gz b/tests/schema.tar.gz similarity index 100% rename from src/wstools/tests/schema.tar.gz rename to tests/schema.tar.gz diff --git a/src/wstools/tests/test_t1.py b/tests/test_t1.py similarity index 100% rename from src/wstools/tests/test_t1.py rename to tests/test_t1.py diff --git a/src/wstools/tests/test_wsdl.py b/tests/test_wsdl.py similarity index 98% rename from src/wstools/tests/test_wsdl.py rename to tests/test_wsdl.py index d4a3a51..c15578a 100644 --- a/src/wstools/tests/test_wsdl.py +++ b/tests/test_wsdl.py @@ -70,7 +70,7 @@ class WSDLToolsTestCase(unittest.TestCase): if self.path[:7] == 'http://': self.wsdl = WSDLReader().loadFromURL(self.path) else: - self.wsdl = WSDLReader().loadFromFile('src/wstools/tests/' + self.path) + self.wsdl = WSDLReader().loadFromFile('tests/' + self.path) except TimeoutError: print "connection timed out" diff --git a/src/wstools/tests/test_wstools.py b/tests/test_wstools.py similarity index 100% rename from src/wstools/tests/test_wstools.py rename to tests/test_wstools.py diff --git a/src/wstools/tests/test_wstools_net.py b/tests/test_wstools_net.py similarity index 100% rename from src/wstools/tests/test_wstools_net.py rename to tests/test_wstools_net.py diff --git a/src/wstools/tests/xmethods.tar.gz b/tests/xmethods.tar.gz similarity index 100% rename from src/wstools/tests/xmethods.tar.gz rename to tests/xmethods.tar.gz diff --git a/src/wstools/tests/xmethods/ip2geo.wsdl b/tests/xmethods/ip2geo.wsdl similarity index 100% rename from src/wstools/tests/xmethods/ip2geo.wsdl rename to tests/xmethods/ip2geo.wsdl diff --git a/src/wstools/tests/xmethods/zip2geo.wsdl b/tests/xmethods/zip2geo.wsdl similarity index 100% rename from src/wstools/tests/xmethods/zip2geo.wsdl rename to tests/xmethods/zip2geo.wsdl diff --git a/src/wstools/tests/.cvsignore b/wstools/.cvsignore similarity index 100% rename from src/wstools/tests/.cvsignore rename to wstools/.cvsignore diff --git a/src/wstools/MIMEAttachment.py b/wstools/MIMEAttachment.py similarity index 100% rename from src/wstools/MIMEAttachment.py rename to wstools/MIMEAttachment.py diff --git a/src/wstools/Namespaces.py b/wstools/Namespaces.py similarity index 100% rename from src/wstools/Namespaces.py rename to wstools/Namespaces.py diff --git a/src/wstools/TimeoutSocket.py b/wstools/TimeoutSocket.py similarity index 100% rename from src/wstools/TimeoutSocket.py rename to wstools/TimeoutSocket.py diff --git a/src/wstools/UserTuple.py b/wstools/UserTuple.py similarity index 100% rename from src/wstools/UserTuple.py rename to wstools/UserTuple.py diff --git a/src/wstools/Utility.py b/wstools/Utility.py similarity index 100% rename from src/wstools/Utility.py rename to wstools/Utility.py diff --git a/src/wstools/WSDLTools.py b/wstools/WSDLTools.py similarity index 100% rename from src/wstools/WSDLTools.py rename to wstools/WSDLTools.py diff --git a/src/wstools/XMLSchema.py b/wstools/XMLSchema.py similarity index 100% rename from src/wstools/XMLSchema.py rename to wstools/XMLSchema.py diff --git a/src/wstools/XMLname.py b/wstools/XMLname.py similarity index 100% rename from src/wstools/XMLname.py rename to wstools/XMLname.py diff --git a/src/wstools/__init__.py b/wstools/__init__.py similarity index 100% rename from src/wstools/__init__.py rename to wstools/__init__.py diff --git a/src/wstools/c14n.py b/wstools/c14n.py similarity index 100% rename from src/wstools/c14n.py rename to wstools/c14n.py diff --git a/src/wstools/logging.py b/wstools/logging.py similarity index 100% rename from src/wstools/logging.py rename to wstools/logging.py diff --git a/src/wstools/version.py b/wstools/version.py similarity index 100% rename from src/wstools/version.py rename to wstools/version.py From 0ab38009756766d809a83db16d8c305019329863 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 21:15:58 +0200 Subject: [PATCH 28/76] fixing import in test_wsdl --- tests/test_wsdl.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_wsdl.py b/tests/test_wsdl.py index c15578a..8c37393 100644 --- a/tests/test_wsdl.py +++ b/tests/test_wsdl.py @@ -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 From 1605cc3265667d6b9c03493cd3e95392ab9227db Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 21:33:34 +0200 Subject: [PATCH 29/76] increase nose verbosity --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index e93e24a..c1c166e 100644 --- a/tox.ini +++ b/tox.ini @@ -8,7 +8,7 @@ deps= coveralls coverage commands= - nosetests --with-coverage --cover-package=wstools + nosetests --with-coverage --cover-package=wstools --verbosity=5 bash -c "coveralls || true" whitelist_externals=bash From 6f00c6e5cd964a60a9ed9e98b02f5eaf8ded83fa Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 21:40:44 +0200 Subject: [PATCH 30/76] trying to activate test_t1 --- tests/test_t1.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tests/test_t1.py b/tests/test_t1.py index 980d8cc..730b6f5 100644 --- a/tests/test_t1.py +++ b/tests/test_t1.py @@ -4,11 +4,6 @@ ########################################################################### 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(): @@ -20,6 +15,6 @@ def makeTestSuite(): def main(): loader = utils.MatchTestLoader(True, None, "makeTestSuite") unittest.main(defaultTest="makeTestSuite", testLoader=loader) -""" + if __name__ == "__main__": main() From f494db6ac9f898f89623dea6ca40c05fc140383d Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 21:49:35 +0200 Subject: [PATCH 31/76] reverting test_t1 to switch off --- tests/test_t1.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_t1.py b/tests/test_t1.py index 730b6f5..56cca0b 100644 --- a/tests/test_t1.py +++ b/tests/test_t1.py @@ -6,6 +6,7 @@ import unittest import test_wsdl import utils +""" def makeTestSuite(): suite = unittest.TestSuite() suite.addTest(test_wsdl.makeTestSuite("services_by_file")) @@ -18,3 +19,4 @@ def main(): if __name__ == "__main__": main() +""" From 3e920e86a42e6ddad728b40554d46b7239416b2c Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 21:58:50 +0200 Subject: [PATCH 32/76] travis now test with python3 --- .travis.yml | 2 ++ tox.ini | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1c74ffb..4b7b640 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,8 @@ language: python env: - TOX_ENV=py26 - TOX_ENV=py27 + - TOX_ENV=py33 + - TOX_ENV=py34 - TOX_ENV=docs - TOX_ENV=flake8 install: diff --git a/tox.ini b/tox.ini index c1c166e..cd75c4c 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] minversion = 1.3 -envlist = py26,py27,docs,flake8 +envlist = py26,py27,py33,py34,docs,flake8 [testenv] deps= @@ -8,7 +8,7 @@ deps= coveralls coverage commands= - nosetests --with-coverage --cover-package=wstools --verbosity=5 + nosetests --with-coverage --cover-package=wstools bash -c "coveralls || true" whitelist_externals=bash @@ -16,6 +16,11 @@ whitelist_externals=bash [testenv:py27] +[testenv:py33] + +[testenv:py34] + + [testenv:docs] downloadcache={toxworkdir}/downloadcache basepython=python2.7 From 17a610664398b339d2b08f74dcc018b405008e0d Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Thu, 3 Jul 2014 22:01:45 +0200 Subject: [PATCH 33/76] forgot to exclude an import in test_t1 --- tests/test_t1.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_t1.py b/tests/test_t1.py index 56cca0b..c5b468d 100644 --- a/tests/test_t1.py +++ b/tests/test_t1.py @@ -4,9 +4,10 @@ ########################################################################### import unittest import test_wsdl -import utils """ +import utils + def makeTestSuite(): suite = unittest.TestSuite() suite.addTest(test_wsdl.makeTestSuite("services_by_file")) From b004fbf2f5ac3c4f0dafa3cbc9abd3e69ac1f045 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Fri, 4 Jul 2014 15:43:00 +0200 Subject: [PATCH 34/76] removing sphynx build: no real docs --- .travis.yml | 1 - tox.ini | 9 +-------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1c74ffb..00e00f3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ language: python env: - TOX_ENV=py26 - TOX_ENV=py27 - - TOX_ENV=docs - TOX_ENV=flake8 install: - pip install tox diff --git a/tox.ini b/tox.ini index c1c166e..cd15f94 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] minversion = 1.3 -envlist = py26,py27,docs,flake8 +envlist = py26,py27,flake8 [testenv] deps= @@ -16,13 +16,6 @@ whitelist_externals=bash [testenv:py27] -[testenv:docs] -downloadcache={toxworkdir}/downloadcache -basepython=python2.7 -changedir=doc -deps=sphinx -commands=sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html - [testenv:flake8] basepython=python2.7 deps=flake8 From 4467421cb5104f63201ae5d5d4f82413b2d5ec61 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Fri, 4 Jul 2014 15:51:09 +0200 Subject: [PATCH 35/76] fixing failed merge in .travis.yml --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0e756e6..ac10de9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,12 +2,8 @@ language: python env: - TOX_ENV=py26 - TOX_ENV=py27 -<<<<<<< HEAD - TOX_ENV=py33 - TOX_ENV=py34 - - TOX_ENV=docs -======= ->>>>>>> b004fbf - TOX_ENV=flake8 install: - pip install tox From 03e07ca5e79404e696207134e231786068264f9c Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Fri, 4 Jul 2014 15:55:34 +0200 Subject: [PATCH 36/76] fixing target directory for flake8 --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index cd15f94..f38bd53 100644 --- a/tox.ini +++ b/tox.ini @@ -19,5 +19,5 @@ whitelist_externals=bash [testenv:flake8] basepython=python2.7 deps=flake8 -commands=flake8 src/wstools/ +commands=flake8 wstools/ From 395340c78000577651abc72e584e2b7b067ebb60 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Fri, 4 Jul 2014 20:53:12 +0200 Subject: [PATCH 37/76] add coveralls and travis badges in README --- README.txt => README.mdown | 2 ++ 1 file changed, 2 insertions(+) rename README.txt => README.mdown (72%) diff --git a/README.txt b/README.mdown similarity index 72% rename from README.txt rename to README.mdown index 31360f5..a89a559 100644 --- a/README.txt +++ b/README.mdown @@ -1,3 +1,5 @@ +[![Build Status](https://travis-ci.org/kartoch/wstools.svg?branch=master)](https://travis-ci.org/kartoch/wstools)[![Coverage Status](https://img.shields.io/coveralls/kartoch/wstools.svg)](https://coveralls.io/r/kartoch/wstools?branch=master) + General ======== - Homepage: https://github.com/pycontribs/wstools From 5738c941709c77a182234adb895317db0a12b4a3 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Fri, 4 Jul 2014 20:59:10 +0200 Subject: [PATCH 38/76] add standard python logging --- wstools/Utility.py | 4 +- wstools/XMLSchema.py | 4 +- wstools/logging.py | 298 ------------------------------------------- 3 files changed, 4 insertions(+), 302 deletions(-) delete mode 100644 wstools/logging.py diff --git a/wstools/Utility.py b/wstools/Utility.py index 4deff3c..43e4572 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -108,8 +108,8 @@ class DOMException(Exception): 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: diff --git a/wstools/XMLSchema.py b/wstools/XMLSchema.py index 1f23ea4..7da3712 100644 --- a/wstools/XMLSchema.py +++ b/wstools/XMLSchema.py @@ -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): """ diff --git a/wstools/logging.py b/wstools/logging.py deleted file mode 100644 index 0991162..0000000 --- a/wstools/logging.py +++ /dev/null @@ -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 = {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) From 6db09021edac3cc4572a214a7318403a5e63d2be Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Fri, 4 Jul 2014 21:06:44 +0200 Subject: [PATCH 39/76] fixing setup.py --- setup.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index ee5911b..2d5d723 100644 --- a/setup.py +++ b/setup.py @@ -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,9 +11,9 @@ 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 + read('README.mdown') + read('CHANGES.txt') from wstools.version import __version__ @@ -27,7 +26,8 @@ setup( 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=['wstools'], From b84b3eab9073bb67f5c7c74210b56929d1ef561b Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Fri, 4 Jul 2014 21:18:44 +0200 Subject: [PATCH 40/76] reducing long description in setup.py because of read error --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 2d5d723..709a423 100644 --- a/setup.py +++ b/setup.py @@ -12,8 +12,7 @@ def read(*rnames): ).read() long_description = \ - "WSDL parsing services package for Web Services for Python. see" \ - + url + read('README.mdown') + read('CHANGES.txt') + "WSDL parsing services package for Web Services for Python. see" + url from wstools.version import __version__ From aef93695ae61f50be957eef2187a26765cb821d9 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sat, 5 Jul 2014 10:22:27 +0200 Subject: [PATCH 41/76] starting PEP8 --- wstools/MIMEAttachment.py | 33 +++++++++++++++++---------------- wstools/Namespaces.py | 27 ++++++++++++++++++--------- wstools/TimeoutSocket.py | 11 ++++++----- wstools/UserTuple.py | 2 +- 4 files changed, 42 insertions(+), 31 deletions(-) diff --git a/wstools/MIMEAttachment.py b/wstools/MIMEAttachment.py index f4727c7..251a687 100644 --- a/wstools/MIMEAttachment.py +++ b/wstools/MIMEAttachment.py @@ -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) diff --git a/wstools/Namespaces.py b/wstools/Namespaces.py index 1bdb0c3..a3563bb 100644 --- a/wstools/Namespaces.py +++ b/wstools/Namespaces.py @@ -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,8 +80,11 @@ 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" @@ -112,8 +116,8 @@ class WSRF_V1_2: 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) + # LATEST = DRAFT3 + # WSDL_LIST = (WSDL_DRAFT1, WSDL_DRAFT3) XSD_LIST = (XSD_DRAFT1, XSD_DRAFT3) WSRF = WSRF_V1_2 @@ -141,8 +145,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 +168,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 +203,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") diff --git a/wstools/TimeoutSocket.py b/wstools/TimeoutSocket.py index 3e324a5..4ec0f88 100644 --- a/wstools/TimeoutSocket.py +++ b/wstools/TimeoutSocket.py @@ -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: diff --git a/wstools/UserTuple.py b/wstools/UserTuple.py index 98960fc..02981d0 100644 --- a/wstools/UserTuple.py +++ b/wstools/UserTuple.py @@ -43,7 +43,7 @@ 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? From f9d37ebad6eb1c368d7876b49e37b89d79c22829 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sat, 5 Jul 2014 22:09:32 +0200 Subject: [PATCH 42/76] pep8 and 2to3 for UserType.py and __init__.py --- wstools/UserTuple.py | 1 + wstools/__init__.py | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wstools/UserTuple.py b/wstools/UserTuple.py index 02981d0..5851d7a 100644 --- a/wstools/UserTuple.py +++ b/wstools/UserTuple.py @@ -48,6 +48,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # __reduce__, __setattr__, __str__ # What about these? class UserTuple: + def __init__(self, inittuple=None): self.data = () if inittuple is not None: diff --git a/wstools/__init__.py b/wstools/__init__.py index 43417af..6e53c28 100644 --- a/wstools/__init__.py +++ b/wstools/__init__.py @@ -3,6 +3,5 @@ ident = "$Id$" -import WSDLTools -import XMLname -import logging +from . import WSDLTools +from . import XMLname From c235f2aa1cf924ccecc4aa09fc52eb330981163c Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sat, 5 Jul 2014 22:14:05 +0200 Subject: [PATCH 43/76] pep8 Namespace.py --- wstools/Namespaces.py | 65 ++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/wstools/Namespaces.py b/wstools/Namespaces.py index a3563bb..0e0e613 100644 --- a/wstools/Namespaces.py +++ b/wstools/Namespaces.py @@ -86,36 +86,47 @@ class WSRF_V1_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" + 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" + 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) @@ -127,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 From a70f07d6fe19566939325cb64bdfeedf180161c5 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sat, 5 Jul 2014 22:38:12 +0200 Subject: [PATCH 44/76] 2to3 c14n --- wstools/c14n.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/wstools/c14n.py b/wstools/c14n.py index de13914..f88160d 100644 --- a/wstools/c14n.py +++ b/wstools/c14n.py @@ -55,13 +55,10 @@ except: class XMLNS: BASE = "http://www.w3.org/2000/xmlns/" XML = "http://www.w3.org/XML/1998/namespace" -try: - import cStringIO - StringIO = cStringIO -except ImportError: - import StringIO -_attrs = lambda E: (E.attributes and E.attributes.values()) or [] +import io + +_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 +66,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 +188,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 +364,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 +381,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 +397,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 +432,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() From bc8598c2e6ea72787d435056a1855aee55e97af8 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sat, 5 Jul 2014 22:42:06 +0200 Subject: [PATCH 45/76] removing print --- wstools/UserTuple.py | 3 +- wstools/Utility.py | 121 +++++++++++++++++++++++++++++-------------- wstools/WSDLTools.py | 8 +-- 3 files changed, 87 insertions(+), 45 deletions(-) diff --git a/wstools/UserTuple.py b/wstools/UserTuple.py index 5851d7a..5cda055 100644 --- a/wstools/UserTuple.py +++ b/wstools/UserTuple.py @@ -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 -, and used under this license: +, +and used under this license: diff --git a/wstools/Utility.py b/wstools/Utility.py index 43e4572..c589875 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -91,28 +91,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, logger = None): + + 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 +131,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 +144,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 +235,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 +431,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 +441,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 +566,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.""" @@ -664,9 +676,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 +739,7 @@ class MessageInterface: class ElementProxy(Base, MessageInterface): - ''' - ''' + _soap_env_prefix = 'SOAP-ENV' _soap_enc_prefix = 'SOAP-ENC' _zsi_prefix = 'ZSI' @@ -743,11 +756,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 +796,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 +819,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 +829,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() @@ -857,7 +875,7 @@ 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: pass @@ -942,7 +960,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 +971,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 @@ -1074,7 +1098,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 +1108,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 +1163,7 @@ class ElementProxy(Base, MessageInterface): class Collection(UserDict): + """Helper class for maintaining ordered named collections.""" default = lambda self, k: k.name @@ -1147,7 +1174,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 +1196,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 +1220,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 +1327,10 @@ if 1: # prefixed attribute names during cloning. # # key (attr.namespaceURI, tag) -# ('http://www.w3.org/2000/xmlns/', u'xsd') -# ('http://www.w3.org/2000/xmlns/', 'xmlns') +# ('http://www.w3.org/2000/xmlns/', u'xsd') +# +# ('http://www.w3.org/2000/xmlns/', 'xmlns') +# # # xml.dom.minidom.Attr.nodeName = xmlns:xsd # xml.dom.minidom.Attr.value = = http://www.w3.org/2001/XMLSchema @@ -1314,7 +1349,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 +1358,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 +1399,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 diff --git a/wstools/WSDLTools.py b/wstools/WSDLTools.py index 2dc7fe2..61136c5 100644 --- a/wstools/WSDLTools.py +++ b/wstools/WSDLTools.py @@ -1567,6 +1567,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 +1644,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 From f354b1509fd9db5a1758fe238e0bd50cd4499def Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sat, 5 Jul 2014 22:54:24 +0200 Subject: [PATCH 46/76] handling StringIO import for python 2 and 3 --- wstools/WSDLTools.py | 6 +++++- wstools/c14n.py | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/wstools/WSDLTools.py b/wstools/WSDLTools.py index 61136c5..c341178 100644 --- a/wstools/WSDLTools.py +++ b/wstools/WSDLTools.py @@ -10,7 +10,11 @@ ident = "$Id$" import weakref -from cStringIO import StringIO +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 diff --git a/wstools/c14n.py b/wstools/c14n.py index f88160d..462fc4c 100644 --- a/wstools/c14n.py +++ b/wstools/c14n.py @@ -56,7 +56,10 @@ except: BASE = "http://www.w3.org/2000/xmlns/" XML = "http://www.w3.org/XML/1998/namespace" -import io +try: + from io import StringIO +except ImportError: + from cStringIO import StringIO _attrs = lambda E: (E.attributes and list(E.attributes.values())) or [] _children = lambda E: E.childNodes or [] From 244988991e01f2309701e5902edc0e5c31a1d360 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 11:32:55 +0200 Subject: [PATCH 47/76] fixing import for python3 in WSDLTools --- wstools/WSDLTools.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wstools/WSDLTools.py b/wstools/WSDLTools.py index c341178..4a8a4b2 100644 --- a/wstools/WSDLTools.py +++ b/wstools/WSDLTools.py @@ -15,9 +15,9 @@ try: 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 +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: From 68d9199a19da53c6ea9677a0503a7fc196977be6 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 12:23:39 +0200 Subject: [PATCH 48/76] fixing bad formed exception in Utility --- wstools/Utility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index c589875..251be2d 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -665,7 +665,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: From a645ba64d291e9b3bf04a94e5fa6d29bf0a988a4 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 12:30:00 +0200 Subject: [PATCH 49/76] fixing other malformed exceptions --- wstools/Utility.py | 8 ++++---- wstools/XMLSchema.py | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 251be2d..5037d21 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -863,7 +863,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 @@ -877,7 +877,7 @@ class ElementProxy(Base, MessageInterface): if node and (node.nodeType == node.ELEMENT_NODE) and \ (nsuri == self._dom.findDefaultNS(node)): return None - except DOMException, ex: + except DOMException as ex: pass if nsuri == XMLNS.XML: return self._xml_prefix @@ -928,7 +928,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 @@ -1025,7 +1025,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 diff --git a/wstools/XMLSchema.py b/wstools/XMLSchema.py index 7da3712..bd4f39f 100644 --- a/wstools/XMLSchema.py +++ b/wstools/XMLSchema.py @@ -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 @@ -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(\ # ', %s'\ # %(import_ns, 'failed to load schema instance') From b92a45ea498bb9a18766c3a650b3e8cf0d628b1d Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 13:42:21 +0200 Subject: [PATCH 50/76] urllib and urlparse imports for python3 compatibility --- wstools/Utility.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 5037d21..46831f7 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -26,8 +26,17 @@ 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 + +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 From 214fb59eba7a25283fbad50944da184d4c8bb808 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 13:49:54 +0200 Subject: [PATCH 51/76] more special imports for python3 compatibility --- wstools/Utility.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 46831f7..31becbc 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -17,15 +17,20 @@ 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 +import urllib + +from .TimeoutSocket import TimeoutSocket, TimeoutError + +try: + from io import StringIO +except ImportError: + from cStringIO import StringIO try: from urlparse import urlparse @@ -37,6 +42,8 @@ try: except ImportError: from http.client import HTTPConnection, HTTPSConnection + + from exceptions import Exception try: from ZSI import _get_idstr From 8b9e5903e62870fed638709a4ad17d7e5f6cddce Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 16:37:40 +0200 Subject: [PATCH 52/76] remove import string --- wstools/Utility.py | 21 ++++++++++----------- wstools/XMLSchema.py | 6 +++++- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 31becbc..89fd825 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -21,7 +21,6 @@ import types import socket import weakref from os.path import isfile -from string import join, strip, split from UserDict import UserDict import urllib @@ -294,7 +293,7 @@ class DOM: def GetSOAPEnvUri(self, version): """Return the appropriate SOAP envelope uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENV_%s' % join(split(version, '.'), '_') + attrname = 'NS_SOAP_ENV_%s' % version.split('.').join('_') value = getattr(self, attrname, None) if value is not None: return value @@ -305,7 +304,7 @@ class DOM: def GetSOAPEncUri(self, version): """Return the appropriate SOAP encoding uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENC_%s' % join(split(version, '.'), '_') + attrname = 'NS_SOAP_ENC_%s' % version.split('.').join('_') value = getattr(self, attrname, None) if value is not None: return value @@ -316,7 +315,7 @@ class DOM: def GetSOAPActorNextUri(self, version): """Return the right special next-actor uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'SOAP_ACTOR_NEXT_%s' % join(split(version, '.'), '_') + attrname = 'SOAP_ACTOR_NEXT_%s' % version.split('.').join('_') value = getattr(self, attrname, None) if value is not None: return value @@ -394,7 +393,7 @@ class DOM: ) def GetWSDLUri(self, version): - attr = 'NS_WSDL_%s' % join(split(version, '.'), '_') + attr = 'NS_WSDL_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value @@ -403,7 +402,7 @@ class DOM: ) def GetWSDLSoapBindingUri(self, version): - attr = 'NS_SOAP_BINDING_%s' % join(split(version, '.'), '_') + attr = 'NS_SOAP_BINDING_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value @@ -412,7 +411,7 @@ class DOM: ) def GetWSDLHttpBindingUri(self, version): - attr = 'NS_HTTP_BINDING_%s' % join(split(version, '.'), '_') + attr = 'NS_HTTP_BINDING_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value @@ -421,7 +420,7 @@ class DOM: ) def GetWSDLMimeBindingUri(self, version): - attr = 'NS_MIME_BINDING_%s' % join(split(version, '.'), '_') + attr = 'NS_MIME_BINDING_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value @@ -430,7 +429,7 @@ class DOM: ) def GetWSDLHttpTransportUri(self, version): - attr = 'NS_SOAP_HTTP_%s' % join(split(version, '.'), '_') + attr = 'NS_SOAP_HTTP_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value @@ -555,9 +554,9 @@ class DOM: if nodetype == child.TEXT_NODE or \ nodetype == child.CDATA_SECTION_NODE: result.append(child.nodeValue) - value = join(result, '') + value = result.join('') if preserve_ws is None: - value = strip(value) + value = value.strip() return value def findNamespaceURI(self, prefix, node): diff --git a/wstools/XMLSchema.py b/wstools/XMLSchema.py index bd4f39f..30fdf77 100644 --- a/wstools/XMLSchema.py +++ b/wstools/XMLSchema.py @@ -22,7 +22,11 @@ import warnings import logging from Namespaces import SCHEMA, XMLNS, SOAP, APACHE from Utility import DOM, DOMException, Collection, SplitQName, basejoin -from StringIO import StringIO + +try: + from io import StringIO +except ImportError: + from cStringIO import StringIO # If we have no threading, this should be a no-op try: From ae5a5044fb1b2c92c99bfa7cba9221d376a83a4d Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 16:40:33 +0200 Subject: [PATCH 53/76] fixing join as function parameter --- wstools/Utility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 89fd825..a31b56a 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -448,7 +448,7 @@ class DOM: return node.localName == name and \ (nsuri is None or self.nsUriMatch(node.namespaceURI, nsuri)) - def getElement(self, node, name, nsuri=None, default=join): + def getElement(self, node, name, nsuri=None, default=''.join): """Return the first child of node with a matching name and namespace uri, or the default if one is provided.""" nsmatch = self.nsUriMatch From 71629d8712dd0b7fdc5637a3b039def65479e23e Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 16:43:56 +0200 Subject: [PATCH 54/76] fixing others join(s) as function parameter --- wstools/Utility.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index a31b56a..784d68a 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -462,7 +462,7 @@ class DOM: return default raise KeyError(name) - def getElementById(self, node, id, default=join): + def getElementById(self, node, id, default=''.join): """Return the first child of node matching an id reference.""" attrget = self.getAttr ELEMENT_NODE = node.ELEMENT_NODE @@ -516,7 +516,7 @@ class DOM: return False return node.hasAttributeNS(nsuri, name) - def getAttr(self, node, name, nsuri=None, default=join): + def getAttr(self, node, name, nsuri=None, default=''.join): """Return the value of the attribute named 'name' with the optional nsuri, or the default if one is specified. If nsuri is not specified, an attribute that matches the From 39c4f7d42f380454d88497238b1d972bcbe8e556 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 16:50:53 +0200 Subject: [PATCH 55/76] replace split/join by replace in string operations --- wstools/Utility.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 784d68a..4cb1635 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -293,7 +293,7 @@ class DOM: def GetSOAPEnvUri(self, version): """Return the appropriate SOAP envelope uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENV_%s' % version.split('.').join('_') + attrname = 'NS_SOAP_ENV_%s' % version.replace('.', '_') value = getattr(self, attrname, None) if value is not None: return value @@ -304,7 +304,7 @@ class DOM: def GetSOAPEncUri(self, version): """Return the appropriate SOAP encoding uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENC_%s' % version.split('.').join('_') + attrname = 'NS_SOAP_ENC_%s' % version.replace('.', '_') value = getattr(self, attrname, None) if value is not None: return value @@ -315,7 +315,7 @@ class DOM: def GetSOAPActorNextUri(self, version): """Return the right special next-actor uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'SOAP_ACTOR_NEXT_%s' % version.split('.').join('_') + attrname = 'SOAP_ACTOR_NEXT_%s' % version.replace('.', '_') value = getattr(self, attrname, None) if value is not None: return value @@ -393,7 +393,7 @@ class DOM: ) def GetWSDLUri(self, version): - attr = 'NS_WSDL_%s' % version.split('.').join('_') + attr = 'NS_WSDL_%s' % version.replace('.', '_') value = getattr(self, attr, None) if value is not None: return value @@ -402,7 +402,7 @@ class DOM: ) def GetWSDLSoapBindingUri(self, version): - attr = 'NS_SOAP_BINDING_%s' % version.split('.').join('_') + attr = 'NS_SOAP_BINDING_%s' % version.replace('.', '_') value = getattr(self, attr, None) if value is not None: return value @@ -411,7 +411,7 @@ class DOM: ) def GetWSDLHttpBindingUri(self, version): - attr = 'NS_HTTP_BINDING_%s' % version.split('.').join('_') + attr = 'NS_HTTP_BINDING_%s' % version.replace('.', '_') value = getattr(self, attr, None) if value is not None: return value @@ -420,7 +420,7 @@ class DOM: ) def GetWSDLMimeBindingUri(self, version): - attr = 'NS_MIME_BINDING_%s' % version.split('.').join('_') + attr = 'NS_MIME_BINDING_%s' % version.replace('.', '_') value = getattr(self, attr, None) if value is not None: return value @@ -429,7 +429,7 @@ class DOM: ) def GetWSDLHttpTransportUri(self, version): - attr = 'NS_SOAP_HTTP_%s' % version.split('.').join('_') + attr = 'NS_SOAP_HTTP_%s' % version.replace('.', '_') value = getattr(self, attr, None) if value is not None: return value From 8255518963e82c5e1049e6f3143ca674c72ee180 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 16:52:57 +0200 Subject: [PATCH 56/76] forgot join conversion --- wstools/Utility.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 4cb1635..8df67d5 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -458,7 +458,7 @@ class DOM: if ((child.localName == name or name is None) and (nsuri is None or nsmatch(child.namespaceURI, nsuri))): return child - if default is not join: + if default is not ''.join: return default raise KeyError(name) @@ -470,7 +470,7 @@ class DOM: if child.nodeType == ELEMENT_NODE: if attrget(child, 'id') == id: return child - if default is not join: + if default is not ''.join: return default raise KeyError(name) @@ -532,7 +532,7 @@ class DOM: result = node._attrsNS.get((nsuri, name), None) if result is not None: return result.value - if default is not join: + if default is not ''.join: return default return '' From 6c37a6fef3eb83fd7c7e1baabd702f7e06f9219d Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 17:01:31 +0200 Subject: [PATCH 57/76] forgot again join conversion --- wstools/Utility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 8df67d5..cfc6557 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -554,7 +554,7 @@ class DOM: if nodetype == child.TEXT_NODE or \ nodetype == child.CDATA_SECTION_NODE: result.append(child.nodeValue) - value = result.join('') + value = ''.join(result) if preserve_ws is None: value = value.strip() return value From ff0b258f226cf19913766f120218b6005e6f0764 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 17:29:00 +0200 Subject: [PATCH 58/76] Revert "forgot again join conversion" This reverts commit 6c37a6fef3eb83fd7c7e1baabd702f7e06f9219d. --- wstools/Utility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index cfc6557..8df67d5 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -554,7 +554,7 @@ class DOM: if nodetype == child.TEXT_NODE or \ nodetype == child.CDATA_SECTION_NODE: result.append(child.nodeValue) - value = ''.join(result) + value = result.join('') if preserve_ws is None: value = value.strip() return value From fd617e07545184c2b5f1ed14dca1c592ab6eddce Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 17:29:20 +0200 Subject: [PATCH 59/76] Revert "forgot join conversion" This reverts commit 8255518963e82c5e1049e6f3143ca674c72ee180. --- wstools/Utility.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 8df67d5..4cb1635 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -458,7 +458,7 @@ class DOM: if ((child.localName == name or name is None) and (nsuri is None or nsmatch(child.namespaceURI, nsuri))): return child - if default is not ''.join: + if default is not join: return default raise KeyError(name) @@ -470,7 +470,7 @@ class DOM: if child.nodeType == ELEMENT_NODE: if attrget(child, 'id') == id: return child - if default is not ''.join: + if default is not join: return default raise KeyError(name) @@ -532,7 +532,7 @@ class DOM: result = node._attrsNS.get((nsuri, name), None) if result is not None: return result.value - if default is not ''.join: + if default is not join: return default return '' From d1380a54ea37cd462074487894286911dfd7ce8b Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 17:29:21 +0200 Subject: [PATCH 60/76] Revert " replace split/join by replace in string operations" This reverts commit 39c4f7d42f380454d88497238b1d972bcbe8e556. --- wstools/Utility.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 4cb1635..784d68a 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -293,7 +293,7 @@ class DOM: def GetSOAPEnvUri(self, version): """Return the appropriate SOAP envelope uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENV_%s' % version.replace('.', '_') + attrname = 'NS_SOAP_ENV_%s' % version.split('.').join('_') value = getattr(self, attrname, None) if value is not None: return value @@ -304,7 +304,7 @@ class DOM: def GetSOAPEncUri(self, version): """Return the appropriate SOAP encoding uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENC_%s' % version.replace('.', '_') + attrname = 'NS_SOAP_ENC_%s' % version.split('.').join('_') value = getattr(self, attrname, None) if value is not None: return value @@ -315,7 +315,7 @@ class DOM: def GetSOAPActorNextUri(self, version): """Return the right special next-actor uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'SOAP_ACTOR_NEXT_%s' % version.replace('.', '_') + attrname = 'SOAP_ACTOR_NEXT_%s' % version.split('.').join('_') value = getattr(self, attrname, None) if value is not None: return value @@ -393,7 +393,7 @@ class DOM: ) def GetWSDLUri(self, version): - attr = 'NS_WSDL_%s' % version.replace('.', '_') + attr = 'NS_WSDL_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value @@ -402,7 +402,7 @@ class DOM: ) def GetWSDLSoapBindingUri(self, version): - attr = 'NS_SOAP_BINDING_%s' % version.replace('.', '_') + attr = 'NS_SOAP_BINDING_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value @@ -411,7 +411,7 @@ class DOM: ) def GetWSDLHttpBindingUri(self, version): - attr = 'NS_HTTP_BINDING_%s' % version.replace('.', '_') + attr = 'NS_HTTP_BINDING_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value @@ -420,7 +420,7 @@ class DOM: ) def GetWSDLMimeBindingUri(self, version): - attr = 'NS_MIME_BINDING_%s' % version.replace('.', '_') + attr = 'NS_MIME_BINDING_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value @@ -429,7 +429,7 @@ class DOM: ) def GetWSDLHttpTransportUri(self, version): - attr = 'NS_SOAP_HTTP_%s' % version.replace('.', '_') + attr = 'NS_SOAP_HTTP_%s' % version.split('.').join('_') value = getattr(self, attr, None) if value is not None: return value From e74d0ed963c5dc38e054022bca2f837ad475b40b Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 17:29:22 +0200 Subject: [PATCH 61/76] Revert "fixing others join(s) as function parameter" This reverts commit 71629d8712dd0b7fdc5637a3b039def65479e23e. --- wstools/Utility.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 784d68a..a31b56a 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -462,7 +462,7 @@ class DOM: return default raise KeyError(name) - def getElementById(self, node, id, default=''.join): + def getElementById(self, node, id, default=join): """Return the first child of node matching an id reference.""" attrget = self.getAttr ELEMENT_NODE = node.ELEMENT_NODE @@ -516,7 +516,7 @@ class DOM: return False return node.hasAttributeNS(nsuri, name) - def getAttr(self, node, name, nsuri=None, default=''.join): + def getAttr(self, node, name, nsuri=None, default=join): """Return the value of the attribute named 'name' with the optional nsuri, or the default if one is specified. If nsuri is not specified, an attribute that matches the From d2ba942c40ca3f801a86662fdb39423fb6616b25 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 17:29:23 +0200 Subject: [PATCH 62/76] Revert "fixing join as function parameter" This reverts commit ae5a5044fb1b2c92c99bfa7cba9221d376a83a4d. --- wstools/Utility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index a31b56a..89fd825 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -448,7 +448,7 @@ class DOM: return node.localName == name and \ (nsuri is None or self.nsUriMatch(node.namespaceURI, nsuri)) - def getElement(self, node, name, nsuri=None, default=''.join): + def getElement(self, node, name, nsuri=None, default=join): """Return the first child of node with a matching name and namespace uri, or the default if one is provided.""" nsmatch = self.nsUriMatch From 9469ecc41829683b17946359cdf7435d1f69709e Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 17:29:55 +0200 Subject: [PATCH 63/76] Revert "remove import string" This reverts commit 8b9e5903e62870fed638709a4ad17d7e5f6cddce. --- wstools/Utility.py | 21 +++++++++++---------- wstools/XMLSchema.py | 6 +----- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/wstools/Utility.py b/wstools/Utility.py index 89fd825..31becbc 100644 --- a/wstools/Utility.py +++ b/wstools/Utility.py @@ -21,6 +21,7 @@ import types import socket import weakref from os.path import isfile +from string import join, strip, split from UserDict import UserDict import urllib @@ -293,7 +294,7 @@ class DOM: def GetSOAPEnvUri(self, version): """Return the appropriate SOAP envelope uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENV_%s' % version.split('.').join('_') + attrname = 'NS_SOAP_ENV_%s' % join(split(version, '.'), '_') value = getattr(self, attrname, None) if value is not None: return value @@ -304,7 +305,7 @@ class DOM: def GetSOAPEncUri(self, version): """Return the appropriate SOAP encoding uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'NS_SOAP_ENC_%s' % version.split('.').join('_') + attrname = 'NS_SOAP_ENC_%s' % join(split(version, '.'), '_') value = getattr(self, attrname, None) if value is not None: return value @@ -315,7 +316,7 @@ class DOM: def GetSOAPActorNextUri(self, version): """Return the right special next-actor uri for a given human-friendly SOAP version string (e.g. '1.1').""" - attrname = 'SOAP_ACTOR_NEXT_%s' % version.split('.').join('_') + attrname = 'SOAP_ACTOR_NEXT_%s' % join(split(version, '.'), '_') value = getattr(self, attrname, None) if value is not None: return value @@ -393,7 +394,7 @@ class DOM: ) def GetWSDLUri(self, version): - attr = 'NS_WSDL_%s' % version.split('.').join('_') + attr = 'NS_WSDL_%s' % join(split(version, '.'), '_') value = getattr(self, attr, None) if value is not None: return value @@ -402,7 +403,7 @@ class DOM: ) def GetWSDLSoapBindingUri(self, version): - attr = 'NS_SOAP_BINDING_%s' % version.split('.').join('_') + attr = 'NS_SOAP_BINDING_%s' % join(split(version, '.'), '_') value = getattr(self, attr, None) if value is not None: return value @@ -411,7 +412,7 @@ class DOM: ) def GetWSDLHttpBindingUri(self, version): - attr = 'NS_HTTP_BINDING_%s' % version.split('.').join('_') + attr = 'NS_HTTP_BINDING_%s' % join(split(version, '.'), '_') value = getattr(self, attr, None) if value is not None: return value @@ -420,7 +421,7 @@ class DOM: ) def GetWSDLMimeBindingUri(self, version): - attr = 'NS_MIME_BINDING_%s' % version.split('.').join('_') + attr = 'NS_MIME_BINDING_%s' % join(split(version, '.'), '_') value = getattr(self, attr, None) if value is not None: return value @@ -429,7 +430,7 @@ class DOM: ) def GetWSDLHttpTransportUri(self, version): - attr = 'NS_SOAP_HTTP_%s' % version.split('.').join('_') + attr = 'NS_SOAP_HTTP_%s' % join(split(version, '.'), '_') value = getattr(self, attr, None) if value is not None: return value @@ -554,9 +555,9 @@ class DOM: if nodetype == child.TEXT_NODE or \ nodetype == child.CDATA_SECTION_NODE: result.append(child.nodeValue) - value = result.join('') + value = join(result, '') if preserve_ws is None: - value = value.strip() + value = strip(value) return value def findNamespaceURI(self, prefix, node): diff --git a/wstools/XMLSchema.py b/wstools/XMLSchema.py index 30fdf77..bd4f39f 100644 --- a/wstools/XMLSchema.py +++ b/wstools/XMLSchema.py @@ -22,11 +22,7 @@ import warnings import logging from Namespaces import SCHEMA, XMLNS, SOAP, APACHE from Utility import DOM, DOMException, Collection, SplitQName, basejoin - -try: - from io import StringIO -except ImportError: - from cStringIO import StringIO +from StringIO import StringIO # If we have no threading, this should be a no-op try: From 475c16c97048013fd65e6cd415dc81eb2749a84f Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 19:44:30 +0200 Subject: [PATCH 64/76] removing useless tar.gz, adding two new schemas from OVH API for testing --- tests/config.txt | 34 +- tests/{xmethods => data}/ip2geo.wsdl | 0 tests/data/soapi-1.63.0-dlw.wsdl | 31731 ++++++++++++++++++++++++ tests/data/soapi-1.63.0-re.wsdl | 23939 ++++++++++++++++++ tests/{xmethods => data}/zip2geo.wsdl | 0 tests/schema.tar.gz | Bin 68874 -> 0 bytes tests/test_wstools.py | 16 - tests/xmethods.tar.gz | Bin 15209 -> 0 bytes 8 files changed, 55674 insertions(+), 46 deletions(-) rename tests/{xmethods => data}/ip2geo.wsdl (100%) create mode 100644 tests/data/soapi-1.63.0-dlw.wsdl create mode 100644 tests/data/soapi-1.63.0-re.wsdl rename tests/{xmethods => data}/zip2geo.wsdl (100%) delete mode 100644 tests/schema.tar.gz delete mode 100644 tests/xmethods.tar.gz diff --git a/tests/config.txt b/tests/config.txt index 69e08b1..195c088 100644 --- a/tests/config.txt +++ b/tests/config.txt @@ -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] - diff --git a/tests/xmethods/ip2geo.wsdl b/tests/data/ip2geo.wsdl similarity index 100% rename from tests/xmethods/ip2geo.wsdl rename to tests/data/ip2geo.wsdl diff --git a/tests/data/soapi-1.63.0-dlw.wsdl b/tests/data/soapi-1.63.0-dlw.wsdl new file mode 100644 index 0000000..496ed44 --- /dev/null +++ b/tests/data/soapi-1.63.0-dlw.wsdl @@ -0,0 +1,31731 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/soapi-1.63.0-re.wsdl b/tests/data/soapi-1.63.0-re.wsdl new file mode 100644 index 0000000..8811f6a --- /dev/null +++ b/tests/data/soapi-1.63.0-re.wsdl @@ -0,0 +1,23939 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/xmethods/zip2geo.wsdl b/tests/data/zip2geo.wsdl similarity index 100% rename from tests/xmethods/zip2geo.wsdl rename to tests/data/zip2geo.wsdl diff --git a/tests/schema.tar.gz b/tests/schema.tar.gz deleted file mode 100644 index d6fe7db53491d6a69b2f7bd0d971c104c2aee698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68874 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 diff --git a/tests/test_wstools.py b/tests/test_wstools.py index a242a44..e98a61f 100644 --- a/tests/test_wstools.py +++ b/tests/test_wstools.py @@ -6,9 +6,6 @@ ########################################################################### import unittest -import tarfile -import os -import ConfigParser import test_wsdl @@ -16,18 +13,6 @@ 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")) @@ -35,7 +20,6 @@ def makeTestSuite(): def main(): - extractFiles(SECTION, 'archives') unittest.main(defaultTest="makeTestSuite") if __name__ == "__main__": diff --git a/tests/xmethods.tar.gz b/tests/xmethods.tar.gz deleted file mode 100644 index 4521a9ac9794a2d76c08453a62bf5af5cd359254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15209 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 Date: Sun, 6 Jul 2014 19:47:27 +0200 Subject: [PATCH 65/76] removing test_t1, redundant with test_wstools --- tests/test_t1.py | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 tests/test_t1.py diff --git a/tests/test_t1.py b/tests/test_t1.py deleted file mode 100644 index c5b468d..0000000 --- a/tests/test_t1.py +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################ -# Joshua R. Boverhof, David W. Robertson, LBNL -# See LBNLCopyright for copyright notice! -########################################################################### -import unittest -import test_wsdl - -""" -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() -""" From 902667e9a75f044a9f329331b89e4fe88f6340ab Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 19:50:38 +0200 Subject: [PATCH 66/76] test_wsdl is now the abstract test class --- tests/test_wsdl.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/test_wsdl.py b/tests/test_wsdl.py index 8c37393..cd1f8f0 100644 --- a/tests/test_wsdl.py +++ b/tests/test_wsdl.py @@ -164,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() From cf048dd8e93a56ef663d242a717990ea26c350c1 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 20:11:16 +0200 Subject: [PATCH 67/76] make test_wstools detected by nose --- tests/test_wstools.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/tests/test_wstools.py b/tests/test_wstools.py index e98a61f..7eb58fa 100644 --- a/tests/test_wstools.py +++ b/tests/test_wstools.py @@ -8,19 +8,11 @@ import unittest import test_wsdl - -SECTION = 'files' -CONFIG_FILE = 'config.txt' - - def makeTestSuite(): suite = unittest.TestSuite() suite.addTest(test_wsdl.makeTestSuite("services_by_file")) return suite - -def main(): - unittest.main(defaultTest="makeTestSuite") - if __name__ == "__main__": - main() + runner = unittest.TextTestRunner() + runner.run(makeTestSuite()) From ea0af5b6575b66c4d8ec72de0c982a1355a9b606 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 20:47:24 +0200 Subject: [PATCH 68/76] trying new time to tests detected by nose --- tests/test_wstools.py | 5 ++++- tests/test_wstools_net.py | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_wstools.py b/tests/test_wstools.py index 7eb58fa..caf7248 100644 --- a/tests/test_wstools.py +++ b/tests/test_wstools.py @@ -13,6 +13,9 @@ def makeTestSuite(): suite.addTest(test_wsdl.makeTestSuite("services_by_file")) return suite -if __name__ == "__main__": +def test_runner(): runner = unittest.TextTestRunner() runner.run(makeTestSuite()) + +if __name__ == '__main__': + test_runner() diff --git a/tests/test_wstools_net.py b/tests/test_wstools_net.py index 9c487fe..f1d7666 100644 --- a/tests/test_wstools_net.py +++ b/tests/test_wstools_net.py @@ -14,8 +14,8 @@ def makeTestSuite(): return suite -def main(): +def test_runner(): unittest.main(defaultTest="makeTestSuite") if __name__ == "__main__": - main() + test_runner() From 9c43764ea52ad49d9e168d286c1bb97bd16ba883 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 21:10:35 +0200 Subject: [PATCH 69/76] trying with abtsratc to tests detected by nose --- tests/test_wsdl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_wsdl.py b/tests/test_wsdl.py index cd1f8f0..2dc409b 100644 --- a/tests/test_wsdl.py +++ b/tests/test_wsdl.py @@ -26,11 +26,11 @@ def makeTestSuite(section='services_by_file'): nameGenerator = getOption(cp, section) suite = unittest.TestSuite() for i in range(0, numTests): - suite.addTest(unittest.makeSuite(WSDLToolsTestCase, 'test_')) + suite.addTest(unittest.makeSuite(WSDLToolsAbstractCase, 'test_')) return suite -class WSDLToolsTestCase(unittest.TestCase): +class WSDLToolsAbstractCase(): def __init__(self, methodName='runTest'): unittest.TestCase.__init__(self, methodName) From 3c365071d6598e9cc4d5858514f34b68815ed4e7 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 21:18:10 +0200 Subject: [PATCH 70/76] trying with __test__ to remove tests detected by nose --- tests/test_wsdl.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_wsdl.py b/tests/test_wsdl.py index 2dc409b..a8adbe9 100644 --- a/tests/test_wsdl.py +++ b/tests/test_wsdl.py @@ -26,11 +26,15 @@ def makeTestSuite(section='services_by_file'): nameGenerator = getOption(cp, section) suite = unittest.TestSuite() for i in range(0, numTests): - suite.addTest(unittest.makeSuite(WSDLToolsAbstractCase, 'test_')) + case = WSDLToolsAbstractCase() + case.__test__ = true + suite.addTest(unittest.makeSuite(case, 'test_')) return suite -class WSDLToolsAbstractCase(): +class WSDLToolsAbstractCase(unittest.TestCase): + + __test__ = false def __init__(self, methodName='runTest'): unittest.TestCase.__init__(self, methodName) From 6527f64e5d54a4963f5826dff02a3e0fb67275f1 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 21:22:46 +0200 Subject: [PATCH 71/76] trying with __test__ to remove tests detected by nose --- tests/test_wsdl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_wsdl.py b/tests/test_wsdl.py index a8adbe9..9c8e2b8 100644 --- a/tests/test_wsdl.py +++ b/tests/test_wsdl.py @@ -27,14 +27,14 @@ def makeTestSuite(section='services_by_file'): suite = unittest.TestSuite() for i in range(0, numTests): case = WSDLToolsAbstractCase() - case.__test__ = true + case.__test__ = True suite.addTest(unittest.makeSuite(case, 'test_')) return suite class WSDLToolsAbstractCase(unittest.TestCase): - __test__ = false + __test__ = False def __init__(self, methodName='runTest'): unittest.TestCase.__init__(self, methodName) From e9c7a51252e49e0f82b7a01286ff0e4c77ba2a41 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 21:28:14 +0200 Subject: [PATCH 72/76] Revert "trying with __test__ to remove tests detected by nose" This reverts commit 6527f64e5d54a4963f5826dff02a3e0fb67275f1. --- tests/test_wsdl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_wsdl.py b/tests/test_wsdl.py index 9c8e2b8..a8adbe9 100644 --- a/tests/test_wsdl.py +++ b/tests/test_wsdl.py @@ -27,14 +27,14 @@ def makeTestSuite(section='services_by_file'): suite = unittest.TestSuite() for i in range(0, numTests): case = WSDLToolsAbstractCase() - case.__test__ = True + case.__test__ = true suite.addTest(unittest.makeSuite(case, 'test_')) return suite class WSDLToolsAbstractCase(unittest.TestCase): - __test__ = False + __test__ = false def __init__(self, methodName='runTest'): unittest.TestCase.__init__(self, methodName) From 915f92fcc4d28fbab72bd36a2e302c7e5f6d4190 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 21:28:17 +0200 Subject: [PATCH 73/76] Revert "trying with __test__ to remove tests detected by nose" This reverts commit 3c365071d6598e9cc4d5858514f34b68815ed4e7. --- tests/test_wsdl.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/test_wsdl.py b/tests/test_wsdl.py index a8adbe9..2dc409b 100644 --- a/tests/test_wsdl.py +++ b/tests/test_wsdl.py @@ -26,15 +26,11 @@ def makeTestSuite(section='services_by_file'): nameGenerator = getOption(cp, section) suite = unittest.TestSuite() for i in range(0, numTests): - case = WSDLToolsAbstractCase() - case.__test__ = true - suite.addTest(unittest.makeSuite(case, 'test_')) + suite.addTest(unittest.makeSuite(WSDLToolsAbstractCase, 'test_')) return suite -class WSDLToolsAbstractCase(unittest.TestCase): - - __test__ = false +class WSDLToolsAbstractCase(): def __init__(self, methodName='runTest'): unittest.TestCase.__init__(self, methodName) From 9a6be93fb7bea0a88e5b51f313f7c0b71980c50b Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 21:28:18 +0200 Subject: [PATCH 74/76] Revert "trying with abtsratc to tests detected by nose" This reverts commit 9c43764ea52ad49d9e168d286c1bb97bd16ba883. --- tests/test_wsdl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_wsdl.py b/tests/test_wsdl.py index 2dc409b..cd1f8f0 100644 --- a/tests/test_wsdl.py +++ b/tests/test_wsdl.py @@ -26,11 +26,11 @@ def makeTestSuite(section='services_by_file'): nameGenerator = getOption(cp, section) suite = unittest.TestSuite() for i in range(0, numTests): - suite.addTest(unittest.makeSuite(WSDLToolsAbstractCase, 'test_')) + suite.addTest(unittest.makeSuite(WSDLToolsTestCase, 'test_')) return suite -class WSDLToolsAbstractCase(): +class WSDLToolsTestCase(unittest.TestCase): def __init__(self, methodName='runTest'): unittest.TestCase.__init__(self, methodName) From 0d1c666f5ee8b8ec596536bc2dfd7fce8eef68db Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 21:29:04 +0200 Subject: [PATCH 75/76] removing test_wstools, redundant with test_wdsl --- tests/test_wstools.py | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 tests/test_wstools.py diff --git a/tests/test_wstools.py b/tests/test_wstools.py deleted file mode 100644 index caf7248..0000000 --- a/tests/test_wstools.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python - -############################################################################ -# Joshua R. Boverhof, David W. Robertson, LBNL -# See LBNLCopyright for copyright notice! -########################################################################### - -import unittest -import test_wsdl - -def makeTestSuite(): - suite = unittest.TestSuite() - suite.addTest(test_wsdl.makeTestSuite("services_by_file")) - return suite - -def test_runner(): - runner = unittest.TextTestRunner() - runner.run(makeTestSuite()) - -if __name__ == '__main__': - test_runner() From e7a035c6a5e97832ffa21f8f0a1dcb8a97776455 Mon Sep 17 00:00:00 2001 From: Julien Iguchi-Cartigny Date: Sun, 6 Jul 2014 21:32:59 +0200 Subject: [PATCH 76/76] fixing test_wstools_net.py --- tests/test_wstools_net.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_wstools_net.py b/tests/test_wstools_net.py index f1d7666..76ab7ba 100644 --- a/tests/test_wstools_net.py +++ b/tests/test_wstools_net.py @@ -15,7 +15,8 @@ def makeTestSuite(): def test_runner(): - unittest.main(defaultTest="makeTestSuite") + runner = unittest.TextTestRunner() + runner.run(makeTestSuite()) if __name__ == "__main__": test_runner()