Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WPS: support multiple languages #654

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 29 additions & 13 deletions owslib/wps.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ class WebProcessingService(object):
"""

def __init__(self, url, version=WPS_DEFAULT_VERSION, username=None, password=None, verbose=False, skip_caps=False,
headers=None, verify=None, cert=None, timeout=None, auth=None):
headers=None, verify=None, cert=None, timeout=None, auth=None, language=None):
"""
Initialization method resets the object status.
By default it will execute a GetCapabilities invocation to the remote service,
Expand All @@ -241,6 +241,7 @@ def __init__(self, url, version=WPS_DEFAULT_VERSION, username=None, password=Non
self.verbose = verbose
self.headers = headers
self.timeout = timeout
self.language = language

# fields populated by method invocations
self._capabilities = None
Expand All @@ -260,7 +261,11 @@ def getcapabilities(self, xml=None):

# read capabilities document
reader = WPSCapabilitiesReader(
version=self.version, verbose=self.verbose, auth=self.auth)
version=self.version,
verbose=self.verbose,
auth=self.auth,
language=self.language,
)
if xml:
# read from stored XML file
self._capabilities = reader.readFromString(xml)
Expand All @@ -283,7 +288,11 @@ def describeprocess(self, identifier, xml=None):

# read capabilities document
reader = WPSDescribeProcessReader(
version=self.version, verbose=self.verbose, auth=self.auth)
version=self.version,
verbose=self.verbose,
auth=self.auth,
language=self.language,
)
if xml:
# read from stored XML file
rootElement = reader.readFromString(xml)
Expand Down Expand Up @@ -333,7 +342,8 @@ def execute(self, identifier, inputs, output=None, mode=ASYNC, lineage=False, re
verbose=self.verbose,
headers=self.headers,
timeout=self.timeout,
auth=self.auth
auth=self.auth,
language=self.language,
)

# build XML request from parameters
Expand Down Expand Up @@ -454,11 +464,12 @@ class WPSReader(object):
Superclass for reading a WPS document into a lxml.etree infoset.
"""

def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False, timeout=30, auth=None):
def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False, timeout=30, auth=None, language=None):
self.version = version
self.verbose = verbose
self.timeout = timeout
self.auth = auth or Authentication()
self.language = language

def _readFromUrl(self, url, data, timeout, method='Get', username=None, password=None,
headers=None, verify=True, cert=None):
Expand All @@ -470,6 +481,8 @@ def _readFromUrl(self, url, data, timeout, method='Get', username=None, password
_fix_auth(self.auth, username, password, verify, cert)
if method == 'Get':
# full HTTP request url
if self.language:
data["language"] = self.language
request_url = build_get_url(url, data, overwrite=True)
log.debug(request_url)

Expand Down Expand Up @@ -506,10 +519,10 @@ class WPSCapabilitiesReader(WPSReader):
Utility class that reads and parses a WPS GetCapabilities document into a lxml.etree infoset.
"""

def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False, timeout=None, auth=None):
def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False, timeout=None, auth=None, language=None):
# superclass initializer
super(WPSCapabilitiesReader, self).__init__(
version=version, verbose=verbose, timeout=timeout, auth=auth)
version=version, verbose=verbose, timeout=timeout, auth=auth, language=language)

def readFromUrl(self, url, username=None, password=None,
headers=None, verify=None, cert=None):
Expand All @@ -532,10 +545,10 @@ class WPSDescribeProcessReader(WPSReader):
Class that reads and parses a WPS DescribeProcess document into a etree infoset
"""

def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False, timeout=None, auth=None):
def __init__(self, version=WPS_DEFAULT_VERSION, verbose=False, timeout=None, auth=None, language=None):
# superclass initializer
super(WPSDescribeProcessReader, self).__init__(
version=version, verbose=verbose, timeout=timeout, auth=auth)
version=version, verbose=verbose, timeout=timeout, auth=auth, language=language)

def readFromUrl(self, url, identifier, username=None, password=None,
headers=None, verify=None, cert=None):
Expand All @@ -559,9 +572,9 @@ class WPSExecuteReader(WPSReader):
Class that reads and parses a WPS Execute response document into a etree infoset
"""

def __init__(self, verbose=False, timeout=None, auth=None):
def __init__(self, verbose=False, timeout=None, auth=None, language=None):
# superclass initializer
super(WPSExecuteReader, self).__init__(verbose=verbose, timeout=timeout, auth=auth)
super(WPSExecuteReader, self).__init__(verbose=verbose, timeout=timeout, auth=auth, language=language)

def readFromUrl(self, url, data={}, method='Get', username=None, password=None,
headers=None, verify=None, cert=None):
Expand All @@ -581,7 +594,7 @@ class WPSExecution(object):
"""

def __init__(self, version=WPS_DEFAULT_VERSION, url=None, username=None, password=None, verbose=False,
headers=None, verify=None, cert=None, timeout=None, auth=None):
headers=None, verify=None, cert=None, timeout=None, auth=None, language=None):

# initialize fields
self.url = url
Expand All @@ -591,6 +604,7 @@ def __init__(self, version=WPS_DEFAULT_VERSION, url=None, username=None, passwor
self.auth = auth or Authentication()
_fix_auth(self.auth, username, password, verify, cert)
self.timeout = timeout
self.language = language

# request document
self.request = None
Expand Down Expand Up @@ -648,6 +662,8 @@ def buildRequest(self, identifier, inputs=[], output=None, mode=ASYNC, lineage=F
root = etree.Element(nspath_eval('wps:Execute', namespaces))
root.set('service', 'WPS')
root.set('version', WPS_DEFAULT_VERSION)
if self.language:
root.set('language', self.language)
root.set(nspath_eval('xsi:schemaLocation', namespaces), '%s %s' %
(namespaces['wps'], WPS_DEFAULT_SCHEMA_LOCATION))

Expand Down Expand Up @@ -765,7 +781,7 @@ def checkStatus(self, url=None, response=None, sleepSecs=60):
:param int sleepSecs: number of seconds to sleep before returning control to the caller.
"""

reader = WPSExecuteReader(verbose=self.verbose, auth=self.auth)
reader = WPSExecuteReader(verbose=self.verbose, auth=self.auth, language=self.language)
if response is None:
# override status location
if url is not None:
Expand Down
18 changes: 18 additions & 0 deletions tests/test_wps_describeprocess_language.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from owslib.wps import WebProcessingService
import owslib.wps


def test_wps_describeprocess_language(monkeypatch):

def mock_open_url(*args, **kwargs):
assert 'language=fr-CA' in args[1]

class FakeResponse:
def read(self):
return b'<xml></xml>'

return FakeResponse()

monkeypatch.setattr(owslib.wps, "openURL", mock_open_url)
wps = WebProcessingService('http://www.example.com', language='fr-CA', skip_caps=True)
wps.describeprocess('all')
31 changes: 31 additions & 0 deletions tests/test_wps_execute_language.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from owslib.wps import WebProcessingService
import owslib.wps


def test_wps_execute_language(monkeypatch):

def raise_on_log_error(*a):
"""Make sure the errors are raised, not only caught and logged"""
raise AssertionError

monkeypatch.setattr(owslib.wps.log, "error", raise_on_log_error)

monkeypatch.setattr(owslib.wps.WPSExecution, "parseResponse", lambda *a: None)
wps = WebProcessingService('http://www.example.com', language='fr-CA', skip_caps=True)
execution = wps.execute('test', [], response=b'<xml></xml>')

assert b'language="fr-CA"' in execution.request

def mock_open_url(*args, **kwargs):
assert 'language=fr-CA' in args[1]

class FakeResponse:
def read(self):
return b'<xml></xml>'

return FakeResponse()

monkeypatch.setattr(owslib.wps, "openURL", mock_open_url)

execution.status = 'ProcessSucceeded'
execution.checkStatus(url='http://www.example.com', response=None, sleepSecs=0)
17 changes: 17 additions & 0 deletions tests/test_wps_getcapabilities_language.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from owslib.wps import WebProcessingService
import owslib.wps


def test_wps_getcapabilities_language(monkeypatch):

def mock_open_url(*args, **kwargs):
assert 'language=fr-CA' in args[1]

class FakeResponse:
def read(self):
return b'<xml></xml>'

return FakeResponse()

monkeypatch.setattr(owslib.wps, "openURL", mock_open_url)
WebProcessingService('http://www.example.com', language='fr-CA')