From 61a151dc8ec7dfb4d71da548e1607ff6b4152a2d Mon Sep 17 00:00:00 2001 From: MacPingu Date: Wed, 22 Aug 2018 17:27:07 +0200 Subject: [PATCH] added ncmeta process with opendap (#54) --- emu/processes/__init__.py | 2 ++ emu/processes/wps_ncmeta.py | 64 +++++++++++++++++++++++++++++++++++++ environment.yml | 4 ++- tests/test_wps_caps.py | 2 +- tests/test_wps_ncmeta.py | 20 ++++++++++++ 5 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 emu/processes/wps_ncmeta.py create mode 100644 tests/test_wps_ncmeta.py diff --git a/emu/processes/__init__.py b/emu/processes/__init__.py index 5c39da6..d670343 100644 --- a/emu/processes/__init__.py +++ b/emu/processes/__init__.py @@ -13,6 +13,7 @@ from .wps_esgf import ESGFDemo from .wps_output_formats import OutputFormats from .wps_poly_centroid import PolyCentroid +from .wps_ncmeta import NCMeta processes = [ UltimateQuestion(), @@ -30,4 +31,5 @@ ESGFDemo(), OutputFormats(), PolyCentroid(), + NCMeta(), ] diff --git a/emu/processes/wps_ncmeta.py b/emu/processes/wps_ncmeta.py new file mode 100644 index 0000000..19841c4 --- /dev/null +++ b/emu/processes/wps_ncmeta.py @@ -0,0 +1,64 @@ +import os + +from pywps import Process +from pywps import ComplexInput, ComplexOutput, FORMATS, Format +from pywps.validator.mode import MODE +from pywps.app.Common import Metadata + +import logging +LOGGER = logging.getLogger("PYWPS") + +FORMAT_OPENDAP = Format('application/x-ogc-dods') + + +class NCMeta(Process): + """ + Notes + ----- + + Returns metadata of a NetCDF file or OpenDAP resource. + """ + def __init__(self): + inputs = [ + ComplexInput('dataset', 'Dataset', + supported_formats=[FORMATS.NETCDF], + min_occurs=0, + mode=MODE.NONE), + ComplexInput('dataset_opendap', 'Dataset OpenDAP', + supported_formats=[FORMAT_OPENDAP], + min_occurs=0, + mode=MODE.NONE), + ] + outputs = [ + ComplexOutput('output', 'Metadata', + as_reference=True, + supported_formats=[FORMATS.TEXT]), ] + + super(NCMeta, self).__init__( + self._handler, + identifier='ncmeta', + title='Show NetCDF Metadata', + version='4', + metadata=[ + Metadata('User Guide', 'http://emu.readthedocs.io/en/latest/'), + ], + inputs=inputs, + outputs=outputs, + store_supported=True, + status_supported=True) + + def _handler(self, request, response): + from netCDF4 import Dataset + if 'dataset_opendap' in request.inputs: + inpt = request.inputs['dataset_opendap'][0] + ds = Dataset(inpt.url) + else: + inpt = request.inputs['dataset'][0] + ds = Dataset(inpt.file) + with open(os.path.join(self.workdir, 'out.txt'), "w") as fp: + response.outputs['output'].file = fp.name + fp.write("URL: {}\n\n".format(inpt.url)) + fp.write("MIME Type: {}\n\n".format(inpt.data_format.mime_type)) + for attr in ds.ncattrs(): + fp.write("{}: {}\n\n".format(attr, ds.getncattr(attr))) + return response diff --git a/environment.yml b/environment.yml index 691b314..2aa5956 100644 --- a/environment.yml +++ b/environment.yml @@ -4,12 +4,14 @@ channels: - conda-forge - defaults dependencies: -- pywps=4.1.6 +- pywps=4.1.7 - jinja2 - click - psutil - birdhouse-eggshell=0.3 - libiconv - defusedxml +# opendap support +- netcdf4 # tests - pytest-flake8 diff --git a/tests/test_wps_caps.py b/tests/test_wps_caps.py index 2535b6d..e617cf6 100644 --- a/tests/test_wps_caps.py +++ b/tests/test_wps_caps.py @@ -21,11 +21,11 @@ def test_wps_caps(): 'inout', 'multiple_outputs', 'nap', + 'ncmeta', 'output_formats', 'poly_centroid', 'show_error', 'sleep', 'ultimate_question', 'wordcounter', - ] diff --git a/tests/test_wps_ncmeta.py b/tests/test_wps_ncmeta.py new file mode 100644 index 0000000..c764c0a --- /dev/null +++ b/tests/test_wps_ncmeta.py @@ -0,0 +1,20 @@ +import pytest + +from pywps import Service +from pywps.tests import assert_response_success + +from .common import client_for +from emu.processes.wps_ncmeta import NCMeta + +OPENDAP_URL = 'http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.derived/surface/air.mon.ltm.nc' + + +@pytest.mark.online +def test_wps_ncmeta_opendap(): + client = client_for(Service(processes=[NCMeta()])) + datainputs = "dataset_opendap=@xlink:href={0}".format(OPENDAP_URL) + resp = client.get( + service='wps', request='execute', version='1.0.0', + identifier='ncmeta', + datainputs=datainputs) + assert_response_success(resp)