diff --git a/.circleci/config.yml b/.circleci/config.yml index 52bbe6932..874488021 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -212,6 +212,8 @@ workflows: vcs: jobs: #- macos_vcs_py2 - - macos_vcs_py3 - linux_vcs_py2 - linux_vcs_py3 + - macos_vcs_py3: + requires: + - linux_vcs_py3 diff --git a/docs/rtd_environment.yml b/docs/rtd_environment.yml new file mode 100644 index 000000000..2bcd64988 --- /dev/null +++ b/docs/rtd_environment.yml @@ -0,0 +1,110 @@ +name: lite +channels: + - conda-forge + - defaults +dependencies: + - alabaster=0.7.12=py_0 + - asn1crypto=0.24.0=py37_1003 + - attrs=19.1.0=py_0 + - babel=2.6.0=py_1 + - blas=1.1=openblas + - bleach=3.1.0=py_0 + - bzip2=1.0.6=h14c3975_1002 + - ca-certificates=2019.3.9=hecc5488_0 + - cdat_info=8.1.1=py_2 + - cdms2=3.1.2=py37h6091dcd_7 + - cdtime=3.1.2=py37h6091dcd_1 + - cdutil=8.1=py_1 + - certifi=2019.3.9=py37_0 + - cffi=1.12.3=py37h8022711_0 + - chardet=3.0.4=py37_1003 + - cryptography=2.6.1=py37h72c5cf5_0 + - curl=7.64.1=hf8cf82a_0 + - decorator=4.4.0=py_0 + - defusedxml=0.5.0=py_1 + - distarray=2.12.2=py_1 + - docutils=0.14=py37_1001 + - entrypoints=0.3=py37_1000 + - esmf=7.1.0=hdfb41a0_1004 + - esmpy=7.1.0=py37h24bf2e0_3 + - expat=2.2.5=hf484d3e_1002 + - future=0.17.1=py37_1000 + - g2clib=1.6.0=hf3f1b0b_9 + - genutil=8.1.1=py37h3010b51_0 + - hdf4=4.2.13=h9a582f1_1002 + - hdf5=1.10.4=nompi_h3c11f04_1106 + - idna=2.8=py37_1000 + - imagesize=1.1.0=py_0 + - ipython_genutils=0.2.0=py_1 + - jasper=1.900.1=h07fcdf6_1006 + - jinja2=2.10.1=py_0 + - jpeg=9c=h14c3975_1001 + - jsonschema=3.0.1=py37_0 + - jupyter_core=4.4.0=py_0 + - krb5=1.16.3=h05b26f9_1001 + - libcdms=3.1.2=hcbdc9ef_1000 + - libcf=1.0.2=py37h6d95edf_1007 + - libcurl=7.64.1=hda55be3_0 + - libdrs=3.1.2=h6e3784b_1 + - libdrs_f=3.1.2=h750f5ca_1 + - libedit=3.1.20170329=hf8c457e_1001 + - libffi=3.2.1=he1b5a44_1006 + - libnetcdf=4.6.2=hbdf4f91_1001 + - libpng=1.6.37=hed695b0_0 + - libssh2=1.8.2=h22169c7_2 + - libtiff=4.0.10=h648cc4a_1001 + - libuuid=2.32.1=h14c3975_1000 + - markupsafe=1.1.1=py37h14c3975_0 + - mistune=0.8.4=py37h14c3975_1000 + - mpi=1.0=mpich + - mpich=3.2.1=h1c2f66e_1008 + - nbconvert=5.5.0=py_0 + - nbformat=4.4.0=py_1 + - nbsphinx=0.4.2=py_0 + - ncurses=6.1=hf484d3e_1002 + - netcdf-fortran=4.4.5=hea25ff8_1000 + - numpy=1.16.2=py37_blas_openblash1522bff_0 + - openblas=0.3.3=h9ac9557_1001 + - openssl=1.1.1b=h14c3975_1 + - packaging=19.0=py_0 + - pandoc=2.7.2=0 + - pandocfilters=1.4.2=py_1 + - pip=19.1=py37_0 + - pycparser=2.19=py37_1 + - pygments=2.3.1=py_0 + - pyopenssl=19.0.0=py37_0 + - pyparsing=2.4.0=py_0 + - pyrsistent=0.15.1=py37h516909a_0 + - pysocks=1.6.8=py37_1002 + - python=3.7.3=h5b0a415_0 + - pytz=2019.1=py_0 + - readline=7.0=hf8c457e_1001 + - requests=2.21.0=py37_1000 + - setuptools=41.0.1=py37_0 + - six=1.12.0=py37_1000 + - snowballstemmer=1.2.1=py_1 + - sphinx=2.0.1=py_0 + - sphinxcontrib-applehelp=1.0.1=py_0 + - sphinxcontrib-devhelp=1.0.1=py_0 + - sphinxcontrib-htmlhelp=1.0.2=py_0 + - sphinxcontrib-jsmath=1.0.1=py_0 + - sphinxcontrib-qthelp=1.0.2=py_0 + - sphinxcontrib-serializinghtml=1.1.1=py_0 + - sqlite=3.26.0=h67949de_1001 + - testpath=0.4.2=py_1001 + - tk=8.6.9=h84994c4_1001 + - traitlets=4.3.2=py37_1000 + - udunits2=2.2.27.6=h4e0c4b3_1001 + - urllib3=1.24.2=py37_0 + - webencodings=0.5.1=py_1 + - wheel=0.33.1=py37_0 + - xz=5.2.4=h14c3975_1001 + - zlib=1.2.11=h14c3975_1004 + - libgcc-ng=8.2.0=hdf63c60_1 + - libgfortran-ng=7.3.0=hdf63c60_0 + - libstdcxx-ng=8.2.0=hdf63c60_1 + - pip: + - mv2==3.0.0 + - regrid2==3.0.0 +prefix: /home/docs/.conda/envs/lite + diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 47012c27e..000000000 --- a/environment.yml +++ /dev/null @@ -1,227 +0,0 @@ -name: rtd -channels: - - cdat/label/v80 - - cdat/label/nightly - - conda-forge - - cdat - - defaults -dependencies: - - vtk-cdat=8.0.1.8.0=py36_mesalib_1 - - cdat=8.0=0 - - cdp=1.2.3=py36h95ac982_0 - - dv3d=8.0=py36_0 - - output_viewer=1.2.3=py36h55fec5a_0 - - thermo=8.0=py36_0 - - vcs=8.0=py36_0 - - vcsaddons=8.0=py36_0 - - wk=8.0=py36_0 - - alabaster=0.7.10=py36_1 - - asn1crypto=0.24.0=py36_0 - - astroid=1.6.3=py36_0 - - autopep8=1.3.4=py_0 - - babel=2.5.3=py36_0 - - backcall=0.1.0=py_0 - - basemap=1.1.0=py36_4 - - bleach=2.1.3=py_0 - - bokeh=0.12.15=py36_0 - - bzip2=1.0.6=1 - - ca-certificates=2018.4.16=0 - - cdat_info=8.0=py36_0 - - cdms2=3.0=py36_5 - - cdtime=3.0=py36_0 - - cdutil=8.0=py36_1 - - certifi=2018.4.16=py36_0 - - cffi=1.11.5=py36_0 - - chardet=3.0.4=py36_0 - - cibots=0.2=py36_0 - - clapack=3.2.1=0 - - click=6.7=py_1 - - cloudpickle=0.5.2=py_0 - - colorama=0.4.0=py_0 - - colorlog=3.1.4=py36_1000 - - cryptography=2.2.1=py36_0 - - curl=7.59.0=1 - - cycler=0.10.0=py36_0 - - cytoolz=0.9.0.1=py36_0 - - dask=0.17.2=py_0 - - dask-core=0.17.2=py_0 - - dbus=1.10.22=0 - - decorator=4.3.0=py_0 - - distarray=2.12.2=py36_0 - - distributed=1.21.6=py36_0 - - docutils=0.14=py36_0 - - easydev=0.9.36=py_1 - - entrypoints=0.2.3=py36_1 - - eofs=1.3.0=py36_0 - - esmf=7.1.0r=0 - - esmpy=7.1.0r=py36_1 - - expat=2.2.5=0 - - ffmpeg=3.4.2=0 - - flake8=3.5.0=py36_0 - - fontconfig=2.12.6=0 - - freetype=2.8.1=0 - - future=0.16.0=py36_0 - - g2clib=1.6.0=5 - - genutil=8.0=py36_1 - - geos=3.6.2=1 - - gettext=0.19.8.1=0 - - glib=2.55.0=0 - - gmp=6.1.2=0 - - gnutls=3.5.17=0 - - gst-plugins-base=1.8.0=0 - - gstreamer=1.8.0=1 - - hdf4=4.2.13=0 - - hdf5=1.10.1=2 - - heapdict=1.0.0=py36_0 - - html5lib=1.0.1=py_0 - - icu=58.2=0 - - idna=2.6=py36_1 - - imagesize=1.0.0=py36_0 - - ipykernel=4.8.2=py36_0 - - ipython=6.3.1=py36_0 - - ipython_genutils=0.2.0=py36_0 - - ipywidgets=7.2.1=py36_1 - - isort=4.3.4=py36_0 - - jasper=1.900.1=4 - - jedi=0.12.0=py36_0 - - jinja2=2.10=py36_0 - - jpeg=9b=2 - - jsonschema=2.6.0=py36_1 - - jupyter=1.0.0=py_1 - - jupyter_client=5.2.3=py36_0 - - jupyter_console=5.2.0=py36_0 - - jupyter_core=4.4.0=py_0 - - kiwisolver=1.0.1=py36_1 - - krb5=1.14.6=0 - - lapack=3.6.1=1 - - lazy-object-proxy=1.3.1=py36_0 - - libcdms=3.0=1 - - libcf=1.0.1=py36_1 - - libdrs=3.0=0 - - libdrs_f=3.0=0 - - libffi=3.2.1=3 - - libgcc=7.2.0=h69d50b8_2 - - libgcc-ng=7.2.0=hdf63c60_3 - - libgfortran=3.0.0=1 - - libgfortran-ng=7.2.0=hdf63c60_3 - - libiconv=1.15=h470a237_3 - - libidn11=1.33=0 - - libnetcdf=4.4.1.1=10 - - libpng=1.6.34=0 - - libsodium=1.0.16=0 - - libssh2=1.8.0=2 - - libstdcxx-ng=7.2.0=hdf63c60_3 - - libtiff=4.0.9 - - libxcb=1.13=0 - - libxml2=2.9.8=h422b904_2 - - llvm-meta=6.0.0=0 - - llvmdev=6.0.0=default_0 - - locket=0.2.0=py36_1 - - markupsafe=1.0=py36_0 - - matplotlib=2.2.2=py36_1 - - mccabe=0.6.1=py36_0 - - mesalib=17.2.0=0 - - mistune=0.8.3=py_0 - - mkl_fft=1.0.1=py36_1 - - mkl_random=1.0.1=py36_0 - - mpi=1.0=mpich - - mpich=3.2.1=h26a2512_5 - - msgpack-python=0.5.6=py36_0 - - nb_conda=2.2.1=py36_0 - - nb_conda_kernels=2.1.0=py36_0 - - nbconvert=5.3.1=py_1 - - nbformat=4.4.0=py36_0 - - nbsphinx=0.3.5=py_0 - - ncurses=5.9=10 - - netcdf-fortran=4.4.4=6 - - nettle=3.3=0 - - notebook=5.4.1=py36_0 - - numpydoc=0.8.0=py36_0 - - openssl=1.0.2o=0 - - ossuuid=1.6.2=0 - - packaging=17.1=py_0 - - pandas=0.22.0=py36_0 - - pandoc=2.1.3=0 - - pandocfilters=1.4.1=py36_0 - - parso=0.2.0=py_0 - - partd=0.3.8=py36_0 - - pcre=8.41=1 - - pexpect=4.5.0=py36_0 - - pickleshare=0.7.4=py36_0 - - pip=9.0.3=py36_0 - - proj4=4.9.3=5 - - prompt_toolkit=1.0.15=py36_0 - - psutil=5.4.5=py36_0 - - pthread-stubs=0.4=0 - - ptyprocess=0.5.2=py36_0 - - pycodestyle=2.3.1=py36_0 - - pycparser=2.18=py36_0 - - pyflakes=1.6.0=py36_0 - - pygments=2.2.0=py36_0 - - pylint=1.8.4=py36_0 - - pyopenssl=17.5.0=py36_1 - - pyparsing=2.2.0=py36_0 - - pyqt=5.6.0=py36_5 - - pyshp=1.2.12=py_0 - - pysocks=1.6.8=py36_1 - - pyspharm=1.0.9=py36_2 - - python=3.6.5=1 - - python-dateutil=2.7.2=py_0 - - pytz=2018.4=py_0 - - pyyaml=3.12=py36_1 - - pyzmq=17.0.0=py36_4 - - qt=5.6.2=7 - - qtawesome=0.4.4=py36_0 - - qtconsole=4.3.1=py36_0 - - qtpy=1.4.0=py36_0 - - readline=7.0=0 - - requests=2.18.4=py36_1 - - rope=0.10.7=py36_0 - - send2trash=1.5.0=py_0 - - setuptools=39.0.1=py36_0 - - simplegeneric=0.8.1=py36_0 - - sip=4.18=py36_1 - - six=1.11.0=py36_1 - - snowballstemmer=1.2.1=py36_0 - - sortedcontainers=1.5.9=py36_0 - - sphinx=1.7.2=py36_0 - - sphinxcontrib-websupport=1.0.1=py36_0 - - spyder=3.2.8=py36_0 - - sqlite=3.20.1=2 - - tblib=1.3.2=py36_0 - - terminado=0.8.1=py36_0 - - testpath=0.3.1=py36_0 - - tk=8.6.7=0 - - toolz=0.9.0=py_0 - - tornado=5.0.2=py36_0 - - traitlets=4.3.2=py36_0 - - typing=3.6.4=py36_0 - - udunits2=2.2.26=0 - - urllib3=1.22=py36_0 - - wcwidth=0.1.7=py36_0 - - webencodings=0.5=py36_0 - - wheel=0.31.0=py36_0 - - widgetsnbextension=3.2.1=py36_0 - - windspharm=1.5.1=py36_0 - - wrapt=1.10.11=py36_0 - - x264=20131217=3 - - xorg-libxau=1.0.8=3 - - xorg-libxdmcp=1.1.2=3 - - xz=5.2.3=0 - - yaml=0.1.7=0 - - zeromq=4.2.5=1 - - zict=0.1.3=py_0 - - zlib=1.2.11=0 - - blas=1.0=mkl - - intel-openmp=2018.0.0=8 - - mkl=2018.0.2=1 - - numpy=1.14.2=py36hdbf6ddf_1 - - pyproj=1.9.5.1=py36_0 - - scipy=1.0.1=py36hfc37229_0 - - system=5.8=2 - - pip: - - cibot==0.2 - - mv2==3.0.0 - - regrid2==3.0.0 -prefix: /home/doutriaux1/miniconda/envs/rtd - diff --git a/readthedocs.yml b/readthedocs.yml index 87a2963b9..f3959ceb8 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -6,5 +6,5 @@ python: setup_py_install: true conda: - file: environment.yml + file: docs/rtd_environment.yml diff --git a/vcs/Canvas.py b/vcs/Canvas.py index 399612636..30af4b391 100644 --- a/vcs/Canvas.py +++ b/vcs/Canvas.py @@ -34,8 +34,12 @@ from . import textcombined from . import template from . import displayplot -import vtk -from .VTKPlots import VTKVCSBackend +try: + import vtk + from .VTKPlots import VTKVCSBackend + HAS_VTK = True +except Exception: + HAS_VTK = False from weakref import WeakSet, WeakKeyDictionary from .error import vcsError @@ -934,9 +938,9 @@ def __init__(self, mode=1, pause_time=0, call_from_gui=0, size=None, bg = True except (AttributeError, NameError): pass - if backend == "vtk": + if HAS_VTK and backend == "vtk": self.backend = VTKVCSBackend(self, bg=bg) - elif isinstance(backend, vtk.vtkRenderWindow): + elif HAS_VTK and isinstance(backend, vtk.vtkRenderWindow): self.backend = VTKVCSBackend(self, renWin=backend, bg=bg) else: warnings.warn( diff --git a/vcs/configurator.py b/vcs/configurator.py index 00ff1f74c..cfb349d34 100644 --- a/vcs/configurator.py +++ b/vcs/configurator.py @@ -1,12 +1,15 @@ import vcs import datetime -from . import editors -from . import vtk_ui import os -import vtk -from .vcs2vtk import vtkIterate import copy - +try: + import vtk + from . import editors + from . import vtk_ui + from .vcs2vtk import vtkIterate + HAS_VTK = True +except Exception: + HAS_VTK = False CREATING_FILL = "fill" CREATING_LINE = "line" CREATING_MARKER = "marker" diff --git a/vcs/dv3d.py b/vcs/dv3d.py index 860dd582b..f9f328098 100644 --- a/vcs/dv3d.py +++ b/vcs/dv3d.py @@ -7,7 +7,13 @@ import multiprocessing import vcs import time -from DV3D.ConfigurationFunctions import ConfigManager +import warnings +try: + from DV3D.ConfigurationFunctions import ConfigManager + HAS_DV3D = True +except Exception: + HAS_DV3D = False + from .xmldocs import toggle_surface, toggle_volume, xslider, yslider, zslider, verticalscaling, scalecolormap # noqa from .xmldocs import scaletransferfunction, toggleclipping, isosurfacevalue, scaleopacity, basemapopacity, camera, scriptdocs # noqa @@ -123,6 +129,9 @@ def script(self, script_filename=None, mode=None): # can we add a scriptdocs[g_name] here and have each derived class pick up the documentation correctly? def __init__(self, Gfdv3d_name, Gfdv3d_name_src='default'): + if not HAS_DV3D: + warnings.warn("Could not find DV3D module, you will not be able to use DV3D's graphic methods") + return if not isinstance(Gfdv3d_name, str): raise ValueError("DV3D name must be a string") if Gfdv3d_name in list(vcs.elements[self.g_name].keys()): diff --git a/vcs/utils.py b/vcs/utils.py index 3a2c73c7d..f94b5ba1f 100644 --- a/vcs/utils.py +++ b/vcs/utils.py @@ -36,7 +36,11 @@ import tempfile import cdms2 import genutil -import vtk +try: + import vtk + HAS_VTK = True +except Exception: + HAS_VTK = False import struct from .clickMap import mapPng, getPngDimensions, meshToPngCoords, vcsToHtml, axisToPngCoords # noqa try: @@ -2530,6 +2534,9 @@ def rgba_color(color, colormap): def png_read_metadata(path): + if not HAS_VTK: + warnings.warn("You need vtk to read metadata from png") + return {} reader = vtk.vtkPNGReader() reader.SetFileName(path) reader.Update()