<div dir="ltr"><div>Hmm, <br></div><div><br></div><div>I actaully like the idea, that Format [1] would "serve" the file/data/memory_object methods to the input (and output). This btw could be used for future implementation of WFS/WCS services as output option.</div><div><br></div><div>Registry of mimetypes should be in pywps/inout/formats/__init__.py [2] and we have GSoC student Jan Pišl, working on it's extension too [3], so this would fit IMHO</div><div><br></div><div>J<br></div><div><br></div><div>[1] <a href="https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py#L26">https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py#L26</a></div><div>[2] <a href="https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py#L161">https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py#L161</a></div><div>[3] <a href="https://github.com/janpisl/pywps/blob/master/pywps/inout/formats/__init__.py#L213">https://github.com/janpisl/pywps/blob/master/pywps/inout/formats/__init__.py#L213</a><br></div></div><br><div class="gmail_quote"><div dir="ltr">pá 29. 6. 2018 v 17:03 odesílatel David Huard <<a href="mailto:huard.david@ouranos.ca">huard.david@ouranos.ca</a>> napsal:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">The URL idea sounds good. Will try it. <div><br></div><div>How do you feel about the dependency issue though ? </div><div><br></div><div>One option I've been playing around is to dynamically add methods to ComplexInput when the mimetype is discovered. That is, the various handlers (href, file, data) could be methods of a MimeInput class that can be specialized for different mimetypes. After create_complex_input determines the input's mimetype, instead of doing a source.clone(), would instead instantiate a mixin class combining ComplexInput and MimeInput. By creating a registry of mimetypes and their associated class, users could special case the handlers (and the validators) for mimetypes not supported out of the box by pywps. </div><div><br></div><div>These functionalities could be provided as plugins, so that users would pip install pywps.netcdf to get the netcdf support. </div><div><br></div><div><br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Jun 29, 2018 at 10:42 AM Jachym Cepicky <<a href="mailto:jachym.cepicky@gmail.com" target="_blank">jachym.cepicky@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi David,</div><div>I do not have much insight view to netCDF format and opendap. I can imagine, that beside current validators, which do validate on-drive-available files, we could add some pre_fetch validators too.</div><div><br></div><div><br></div><div>If I understand correctly, PyWPS first parses the request and makes WPSRequest object, then, based on this structure, Process instance along with in- and outputs is contstructed. We need to rewrite pywps, so it does not download data [2] and then the file object is set to the complex input</div><div><br></div><div>We could add set_url and get_url setter and getter methods to IOHandler, which could behave like set_file and get_file or set_data and get_data (and memory_object), which could implement the special behaviour ?</div><div><br></div><div>J<br></div><br><div>[2] <a href="https://github.com/geopython/pywps/blob/master/pywps/app/Service.py#L219" target="_blank">https://github.com/geopython/pywps/blob/master/pywps/app/Service.py#L219</a><br></div><br></div><br><div class="gmail_quote"><div dir="ltr">st 27. 6. 2018 v 14:48 odesílatel David Huard <<a href="mailto:huard.david@ouranos.ca" target="_blank">huard.david@ouranos.ca</a>> napsal:<br></div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I've got something working, but it's not pretty... If the input mime type is application/x-ogc-dods, the href handler skips the downloads and assigns the link to the `data` attribute. If I ask for the file attribute, pywps will download the file locally. <div><br></div><div>Now if I want my process to support both netCDF files and opendap link, for file input it's the file_handler that'll set the file attribute, but then the data attribute will hold the actual file's content, not the path to the file. I guess I could special case the netcdf mime type in the file_handler to set data to the file path, but it feels clunky. </div><div><br></div><div>I'm wondering if anyone has a better design idea in mind, that could extend gracefully to other mime types? Should ComplexInput be subclassed by mimetype, so that the file, stream and data handling as well as validation is encapsulated in a class ? </div><div><br></div><div>One problem I can see cropping up is that as pywps extends support for other "special" mimetypes, the dependencies will become harder to maintain. Indeed, the netcdfvalidator requires netCDF4 to be installed, which is not a light dependency. My guess is that pywps should support out of the box the "light" mime types, and have a plugin mechanism for more complicated ones.  </div><div><br></div><div>David</div><div><div> </div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jun 26, 2018 at 9:23 AM David Huard <<a href="mailto:huard.david@ouranos.ca" target="_blank">huard.david@ouranos.ca</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Thanks !<div><br></div><div>I'll look at it and come back with a PR. </div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jun 26, 2018 at 9:16 AM Jachym Cepicky <<a href="mailto:jachym.cepicky@gmail.com" target="_blank">jachym.cepicky@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>I belive, <br></div><div><br></div><div>here is the place, where data get downloaded <a href="https://github.com/geopython/pywps/blob/master/pywps/app/Service.py#L191" target="_blank">https://github.com/geopython/pywps/blob/master/pywps/app/Service.py#L191</a><br></div><br><div class="gmail_quote"><div dir="ltr">út 26. 6. 2018 v 14:57 odesílatel David Huard <<a href="mailto:huard.david@ouranos.ca" target="_blank">huard.david@ouranos.ca</a>> napsal:<br></div></div></div><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi Jachym, </div><div><br></div>Thanks for the pointers, I've started writing validators for netCDF. I'm still wondering where the decision to download a file is made? Can I shortcut that decision and avoid a file download if the href is a valid opendap link, ie it passes the validatenetcdf checks?<div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Jun 22, 2018 at 4:53 AM Jachym Cepicky <<a href="mailto:jachym.cepicky@gmail.com" target="_blank">jachym.cepicky@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi,</div><div><br></div><div>yes ComplexInput should work for you - you can pass the url with the data using "<Reference ... />" element.. see [1] for example<br></div><div><br></div><div>Any Format can have (and has by default) `validator` function, which return's, whether the input data are valid or no [3]. You can also use `get_format` function [4] and set the validator there.</div><div><br></div><div>Example, how validating function can look can be shapefile or gml validators [5]<br></div><div><br></div><div>You should probably extend foramts [2] with NetCDF mimetype</div><div><br></div><div>But, this will check the file only after it was downloaded to PyWPS - not the URL. Still. is that sufficient? <br></div><div><br></div><div>Jachym<br></div><div><br></div><div>[1] <a href="https://github.com/geopython/pywps/blob/master/tests/requests/wps_execute_request-responsedocument-1.xml#L24" target="_blank">https://github.com/geopython/pywps/blob/master/tests/requests/wps_execute_request-responsedocument-1.xml#L24</a></div><div>[2] <a href="https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py" target="_blank">https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py</a></div><div>[3] <a href="https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py#L42" target="_blank">https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py#L42</a></div><div>[4] <a href="https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py#L215" target="_blank">https://github.com/geopython/pywps/blob/master/pywps/inout/formats/__init__.py#L215</a></div><div>[5] <a href="https://github.com/geopython/pywps/blob/master/pywps/validator/complexvalidator.py" target="_blank">https://github.com/geopython/pywps/blob/master/pywps/validator/complexvalidator.py</a></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">čt 21. 6. 2018 v 17:15 odesílatel David Huard <<a href="mailto:huard.david@ouranos.ca" target="_blank">huard.david@ouranos.ca</a>> napsal:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"></blockquote></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi all, <div><br></div><div>I'd like to contribute a pull request to better handle netCDF files in pywps but I don't know where to start. </div><div><br></div><div>We have a number of processes taking <a href="https://www.unidata.ucar.edu/software/netcdf/" target="_blank">netCDF</a> files as inputs. For those less familiar with the format, netCDF is based on HDF5 and a set of <a href="http://cfconventions.org/" target="_blank">conventions</a>. It is the standard data format in oceanography and climatology. netCDF files are usually stored on servers with support for <a href="https://www.opendap.org/" target="_blank">opendap</a>. This means that users can either download the netCDF file and then open it locally, or use the opendap protocol to open it remotely. What that means is that you can do </div><div><br></div><div><font face="monospace">from netCDF4 import nc</font></div><div><font face="monospace">ds1 = nc.Dataset("<path to local file>")</font></div><div><font face="monospace">ds2 = nc.Dataset("<link to opendap address>")</font></div><div><br></div><div>and both ds1 and ds2 will behave identically. However ds2 is not downloaded locally, but rather read remotely on demand. If a file contains a 3D matrix (time, lat, lon), you can read one slice of the matrix without downloading it all. </div><div><br></div><div>Some of our pywps.Process support both netCDF file and opendap access. We define a ComplexInput for the address to an actual netCDF file, and a LiteralInput for the opendap address.</div><div><br></div><div>My question is whether there would be a clean way for pywps to support both modes with one ComplexInput? Internally, pywps would check if the address supports opendap (just check if nc.Dataset(url) works), and if not, would download the file locally to the server. </div><div><br></div><div>In both cases, we could do </div><div><br></div><div><font face="monospace">ds = nc.Dataset(requests.inputs['resource'][0].file)</font></div><div><font face="monospace"><br></font></div><div>I'm willing to put the time to do it, I just don't know where to start. </div><div><br></div><div>Thanks,</div><div><br></div><div>David</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div></blockquote></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
_______________________________________________<br>
pywps-dev mailing list<br>
<a href="mailto:pywps-dev@lists.osgeo.org" target="_blank">pywps-dev@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/pywps-dev" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/pywps-dev</a></blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="m_-9185350069486325914m_6918447336290548602m_1706310615361826975m_6040471080146753725m_4175494998522332003m_7745675016026833515m_2420091779708325864m_5169858571654734668gmail_signature" data-smartmail="gmail_signature">Jachym Cepicky<br>e-mail: jachym.cepicky gmail com<br>URL: <a href="http://les-ejk.cz" target="_blank">http://les-ejk.cz</a><br>GPG: <a href="http://les-ejk.cz/pgp/JachymCepicky.pgp" target="_blank">http://les-ejk.cz/pgp/JachymCepicky.pgp</a><br></div>
_______________________________________________<br>
pywps-dev mailing list<br>
<a href="mailto:pywps-dev@lists.osgeo.org" target="_blank">pywps-dev@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/pywps-dev" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/pywps-dev</a></blockquote></div>
</blockquote></div></div><div dir="ltr"><br clear="all"><br>-- <br><div dir="ltr" class="m_-9185350069486325914m_6918447336290548602m_1706310615361826975m_6040471080146753725m_4175494998522332003m_7745675016026833515gmail_signature" data-smartmail="gmail_signature">Jachym Cepicky<br>e-mail: jachym.cepicky gmail com<br>URL: <a href="http://les-ejk.cz" target="_blank">http://les-ejk.cz</a><br>GPG: <a href="http://les-ejk.cz/pgp/JachymCepicky.pgp" target="_blank">http://les-ejk.cz/pgp/JachymCepicky.pgp</a><br></div></div>
_______________________________________________<br>
pywps-dev mailing list<br>
<a href="mailto:pywps-dev@lists.osgeo.org" target="_blank">pywps-dev@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/pywps-dev" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/pywps-dev</a></blockquote></div>
</blockquote></div></div></div>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="m_-9185350069486325914m_6918447336290548602gmail_signature" data-smartmail="gmail_signature">Jachym Cepicky<br>e-mail: jachym.cepicky gmail com<br>URL: <a href="http://les-ejk.cz" target="_blank">http://les-ejk.cz</a><br>GPG: <a href="http://les-ejk.cz/pgp/JachymCepicky.pgp" target="_blank">http://les-ejk.cz/pgp/JachymCepicky.pgp</a><br></div>
_______________________________________________<br>
pywps-dev mailing list<br>
<a href="mailto:pywps-dev@lists.osgeo.org" target="_blank">pywps-dev@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/pywps-dev" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/pywps-dev</a></blockquote></div>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">Jachym Cepicky<br>e-mail: jachym.cepicky gmail com<br>URL: <a href="http://les-ejk.cz" target="_blank">http://les-ejk.cz</a><br>GPG: <a href="http://les-ejk.cz/pgp/JachymCepicky.pgp" target="_blank">http://les-ejk.cz/pgp/JachymCepicky.pgp</a><br></div>