datashader icon indicating copy to clipboard operation
datashader copied to clipboard

Trouble running tests with provided conda env

Open ivirshup opened this issue 5 years ago • 12 comments

I'm having trouble running the tests locally using the provided conda environment. The environment was created following the instructions in the readme:

conda env create --name datashader --file ./examples/environment.yml
conda activate datashader
pip install -e .
pytest

pytest immediately fails with the following traceback:

INTERNALERROR> Traceback (most recent call last):
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/_pytest/main.py", line 206, in wrap_session
INTERNALERROR>     config._do_configure()
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/_pytest/config/__init__.py", line 639, in _do_configure
INTERNALERROR>     self.hook.pytest_configure.call_historic(kwargs=dict(config=self))
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/pluggy/hooks.py", line 311, in call_historic
INTERNALERROR>     res = self._hookexec(self, self.get_hookimpls(), kwargs)
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/pluggy/manager.py", line 68, in _hookexec
INTERNALERROR>     return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/pluggy/manager.py", line 62, in <lambda>
INTERNALERROR>     firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/pluggy/callers.py", line 208, in _multicall
INTERNALERROR>     return outcome.get_result()
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/pluggy/callers.py", line 80, in get_result
INTERNALERROR>     raise ex[1].with_traceback(ex[2])
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/pluggy/callers.py", line 187, in _multicall
INTERNALERROR>     res = hook_impl.function(*args)
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/pytest_benchmark/plugin.py", line 1092, in pytest_configure
INTERNALERROR>     config._benchmarksession = BenchmarkSession(config)
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/pytest_benchmark/plugin.py", line 568, in __init__
INTERNALERROR>     self.logger = Logger(self.verbose, config)
INTERNALERROR>   File "/Users/isaac/miniconda3/envs/datashader/lib/python3.6/site-packages/pytest_benchmark/plugin.py", line 519, in __init__
INTERNALERROR>     self.pytest_warn = config.warn
INTERNALERROR> AttributeError: 'Config' object has no attribute 'warn'

I was able to get tests partially running under a different environment which doesn't have pytest-benchmark installed.

This is using the latest master (3171d8869f63214cc161da755e88c30abe8b5098) with macOS v10.14.3.

Output of `conda list`
# packages in environment at /Users/isaac/miniconda3/envs/datashader:
#
# Name                    Version                   Build  Channel
affine                    2.2.2                      py_0    conda-forge
antlr-python-runtime      4.7.2                 py36_1000    conda-forge
appnope                   0.1.0                 py36_1000    conda-forge
asn1crypto                0.24.0                py36_1003    conda-forge
atomicwrites              1.3.0                      py_0    conda-forge
attrs                     19.1.0                     py_0    conda-forge
backcall                  0.1.0                      py_0    conda-forge
beautifulsoup4            4.7.1                 py36_1001    conda-forge
blas                      1.1                    openblas    conda-forge
bleach                    3.1.0                      py_0    conda-forge
blosc                     1.16.3               h0a44026_0    conda-forge
bokeh                     1.0.4                 py36_1000    conda-forge
boost-cpp                 1.68.0            h6f8c590_1000    conda-forge
bzip2                     1.0.6             h1de35cc_1002    conda-forge
ca-certificates           2019.3.9             hecc5488_0    conda-forge
cachey                    0.1.1                    pypi_0    pypi
cairo                     1.16.0            h9247486_1000    conda-forge
cartopy                   0.17.0          py36h929c6f0_1004    conda-forge
certifi                   2019.3.9                 py36_0    conda-forge
cf-units                  2.1.1           py36h917ab60_1000    conda-forge
cffi                      1.12.2           py36h2d6ddff_1    conda-forge
cftime                    1.0.3.4         py36h917ab60_1000    conda-forge
chardet                   3.0.4                 py36_1003    conda-forge
click                     7.0                        py_0    conda-forge
click-plugins             1.0.4                      py_0    conda-forge
cligj                     0.5.0                      py_0    conda-forge
cloudpickle               0.8.0                      py_0    conda-forge
colorcet                  1.0.0                      py_0    conda-forge
cryptography              2.5              py36hdbc3d79_1    conda-forge
curl                      7.64.0               heae2a1f_0    conda-forge
cycler                    0.10.0                     py_1    conda-forge
cytoolz                   0.9.0.1         py36h1de35cc_1001    conda-forge
dask                      1.1.4                      py_0    conda-forge
dask-core                 1.1.4                      py_0    conda-forge
datashader                0.7.0a1.post4+g3171d88           dev_0    <develop>
datashape                 0.5.4                      py_1    conda-forge
decorator                 4.3.2                      py_0    conda-forge
defusedxml                0.5.0                      py_1    conda-forge
descartes                 1.1.0                      py_2    conda-forge
dill                      0.2.9                    py36_0    conda-forge
distributed               1.26.0                   py36_1    conda-forge
entrypoints               0.3                   py36_1000    conda-forge
expat                     2.2.5             h0a44026_1002    conda-forge
fastparquet               0.2.1           py36h917ab60_1001    conda-forge
fiona                     1.8.4           py36h0e3174d_1002    conda-forge
flake8                    3.7.7                    py36_0    conda-forge
fontconfig                2.13.1            h1e4e890_1000    conda-forge
freetype                  2.9.1             h597ad8a_1005    conda-forge
freexl                    1.0.5             h1de35cc_1002    conda-forge
gdal                      2.4.0           py36h0e3174d_1002    conda-forge
geopandas                 0.4.1                      py_0    conda-forge
geos                      3.7.1             h0a44026_1000    conda-forge
geotiff                   1.4.3             hce09ea4_1000    conda-forge
geoviews                  1.6.2                      py_0    conda-forge
geoviews-core             1.6.2                      py_0    conda-forge
gettext                   0.19.8.1          hcca000d_1001    conda-forge
giflib                    5.1.4             h1de35cc_1001    conda-forge
glib                      2.58.3            h2836805_1001    conda-forge
graphviz                  2.38.0            hc6cc99f_1011    conda-forge
hdf4                      4.2.13            hf3c6af0_1002    conda-forge
hdf5                      1.10.4          nompi_h646315f_1105    conda-forge
heapdict                  1.0.0                 py36_1000    conda-forge
holoviews                 1.11.3                     py_0    pyviz/label/dev
icu                       58.2              h0a44026_1000    conda-forge
idna                      2.8                   py36_1000    conda-forge
imageio                   2.4.1                 py36_1000    conda-forge
ipykernel                 5.1.0           py36h24bf2e0_1002    conda-forge
ipython                   7.1.1           py36h24bf2e0_1000    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
ipywidgets                7.4.2                      py_0    conda-forge
iris                      2.2.0                 py36_1003    conda-forge
jedi                      0.13.3                   py36_0    conda-forge
jinja2                    2.10                       py_1    conda-forge
jpeg                      9c                h1de35cc_1001    conda-forge
json-c                    0.13.1            h1de35cc_1001    conda-forge
jsonschema                3.0.1                    py36_0    conda-forge
jupyter                   1.0.0                      py_1    conda-forge
jupyter_client            5.2.4                      py_3    conda-forge
jupyter_console           6.0.0                      py_0    conda-forge
jupyter_core              4.4.0                      py_0    conda-forge
jupyter_dashboards        0.7.0                 py36_1000    conda-forge
kealib                    1.4.10            hf5ed860_1002    conda-forge
kiwisolver                1.0.1           py36h04f5b5a_1002    conda-forge
krb5                      1.16.3            h24a3359_1000    conda-forge
libcurl                   7.64.0               h76de61e_0    conda-forge
libcxx                    7.0.0                h2d50403_1    conda-forge
libdap4                   3.19.1            hae55d67_1000    conda-forge
libedit                   3.1.20170329      hcfe32e1_1001    conda-forge
libffi                    3.2.1             h0a44026_1005    conda-forge
libgdal                   2.4.0             h89caebc_1002    conda-forge
libgfortran               3.0.1                         0    conda-forge
libiconv                  1.15              h1de35cc_1004    conda-forge
libkml                    1.3.0             h71ee1b2_1009    conda-forge
libnetcdf                 4.6.2             h6b88ef6_1001    conda-forge
libpng                    1.6.36            ha441bb4_1000    conda-forge
libpq                     10.6              hbe1e24e_1000    conda-forge
libsodium                 1.0.16            h1de35cc_1001    conda-forge
libspatialindex           1.8.5             h0a44026_1003    conda-forge
libspatialite             4.3.0a            h0cd9627_1026    conda-forge
libssh2                   1.8.0             hf30b1f0_1003    conda-forge
libtiff                   4.0.10            h79f4b77_1001    conda-forge
libxml2                   2.9.8             hf14e9c8_1005    conda-forge
libxslt                   1.1.32            h33a18ac_1002    conda-forge
llvm-meta                 7.0.0                         0    conda-forge
llvmlite                  0.26.0          py36h3fea490_1000    conda-forge
locket                    0.2.0                      py_2    conda-forge
lxml                      4.3.2            py36h7166777_0    conda-forge
mapclassify               2.0.1                      py_0    conda-forge
markupsafe                1.1.1            py36h1de35cc_0    conda-forge
marshmallow               2.19.0                   pypi_0    pypi
matplotlib                3.0.3                    py36_0    conda-forge
matplotlib-base           3.0.3            py36hf043ca5_0    conda-forge
mccabe                    0.6.1                      py_1    conda-forge
mistune                   0.8.4           py36h1de35cc_1000    conda-forge
more-itertools            4.3.0                 py36_1000    conda-forge
msgpack-python            0.6.1            py36h04f5b5a_0    conda-forge
multipledispatch          0.6.0                      py_0    conda-forge
munch                     2.3.2                      py_0    conda-forge
nbconvert                 5.4.1                      py_2    conda-forge
nbformat                  4.4.0                      py_1    conda-forge
ncurses                   6.1               h0a44026_1002    conda-forge
netcdf4                   1.4.3.2          py36hf8bc7f3_0    conda-forge
networkx                  2.2                        py_1    conda-forge
notebook                  5.7.5                    py36_0    conda-forge
numba                     0.41.0          py36h1702cab_1000    conda-forge
numexpr                   2.6.9           py36h1702cab_1000    conda-forge
numpy                     1.16.2          py36_blas_openblash486cb9f_0  [blas_openblas]  conda-forge
olefile                   0.46                       py_0    conda-forge
openblas                  0.3.3             hdc02c5d_1001    conda-forge
openjpeg                  2.3.0             h3bf0609_1003    conda-forge
openssl                   1.0.2r               h1de35cc_0    conda-forge
owslib                    0.17.1                     py_0    conda-forge
packaging                 19.0                       py_0    conda-forge
pandas                    0.24.1           py36h0a44026_0    conda-forge
pandoc                    2.6                           1    conda-forge
pandocfilters             1.4.2                      py_1    conda-forge
param                     1.8.2                      py_0    conda-forge
paramnb                   2.0.4                      py_0    conda-forge
parso                     0.3.4                      py_0    conda-forge
partd                     0.3.9                      py_0    conda-forge
patsy                     0.5.1                      py_0    conda-forge
pcre                      8.41              h0a44026_1003    conda-forge
pexpect                   4.6.0                 py36_1000    conda-forge
pickleshare               0.7.5                 py36_1000    conda-forge
pillow                    5.4.1           py36hbddbef0_1000    conda-forge
pip                       19.0.3                   py36_0    conda-forge
pixman                    0.34.0            h1de35cc_1003    conda-forge
pluggy                    0.9.0                      py_0    conda-forge
poppler                   0.67.0               hb974355_6    conda-forge
poppler-data              0.4.9                         1    conda-forge
postgresql                10.6              ha1bbaa7_1000    conda-forge
proj4                     5.2.0             h1de35cc_1001    conda-forge
prometheus_client         0.6.0                      py_0    conda-forge
prompt_toolkit            2.0.9                      py_0    conda-forge
psutil                    5.6.0            py36h1de35cc_0    conda-forge
ptyprocess                0.6.0                 py36_1000    conda-forge
py                        1.8.0                      py_0    conda-forge
pycodestyle               2.5.0                      py_0    conda-forge
pycparser                 2.19                       py_0    conda-forge
pyct                      0.4.6                      py_0    conda-forge
pyct-core                 0.4.6                      py_0    conda-forge
pyepsg                    0.4.0                      py_0    conda-forge
pyflakes                  2.1.1                      py_0    conda-forge
pygments                  2.3.1                      py_0    conda-forge
pykdtree                  1.3.1           py36h917ab60_1002    conda-forge
pyke                      1.1.1                 py36_1000    conda-forge
pyopenssl                 19.0.0                   py36_0    conda-forge
pyparsing                 2.3.1                      py_0    conda-forge
pyproj                    1.9.6           py36h9c430a6_1000    conda-forge
pyqt                      5.6.0           py36hc26a216_1008    conda-forge
pyrsistent                0.14.11          py36h1de35cc_0    conda-forge
pyshp                     2.1.0                      py_0    conda-forge
pysocks                   1.6.8                 py36_1002    conda-forge
pytables                  3.4.4           py36h0af8b44_1004    conda-forge
pytest                    4.3.0                    py36_0    conda-forge
pytest-benchmark          3.0.0                 py36_1001    conda-forge
python                    3.6.7             h4a56312_1002    conda-forge
python-dateutil           2.8.0                      py_0    conda-forge
python-graphviz           0.10.1                     py_0    conda-forge
python-snappy             0.5.3           py36h8522eec_1000    conda-forge
pytz                      2018.9                     py_0    conda-forge
pyviz_comms               0.7.0                      py_0    conda-forge
pywavelets                1.0.2            py36h917ab60_0    conda-forge
pyyaml                    3.13            py36h1de35cc_1001    conda-forge
pyzmq                     18.0.1           py36h4cc6ddd_0    conda-forge
qt                        5.6.2             h822fa55_1013    conda-forge
qtconsole                 4.4.3                      py_0    conda-forge
rasterio                  1.0.21           py36h3683dd5_0    conda-forge
readline                  7.0               hcfe32e1_1001    conda-forge
requests                  2.21.0                py36_1000    conda-forge
rtree                     0.8.3                 py36_1000    conda-forge
scikit-image              0.14.2           py36h0a44026_1    conda-forge
scipy                     1.2.1           py36_blas_openblash486cb9f_0  [blas_openblas]  conda-forge
send2trash                1.5.0                      py_0    conda-forge
setuptools                40.8.0                   py36_0    conda-forge
shapely                   1.6.4           py36h2bcc7ef_1002    conda-forge
sip                       4.18.1          py36h0a44026_1000    conda-forge
six                       1.12.0                py36_1000    conda-forge
snappy                    1.1.7             h0a44026_1002    conda-forge
snuggs                    1.4.3                      py_0    conda-forge
sortedcontainers          2.1.0                      py_0    conda-forge
soupsieve                 1.8                      py36_0    conda-forge
sqlite                    3.26.0            h1765d9f_1001    conda-forge
statsmodels               0.9.0           py36h917ab60_1000    conda-forge
streamz                   0.2.0                    pypi_0    pypi
tblib                     1.3.2                      py_1    conda-forge
terminado                 0.8.1                 py36_1001    conda-forge
testpath                  0.3.1                    pypi_0    pypi
thrift                    0.11.0          py36h0a44026_1001    conda-forge
tk                        8.6.9             ha441bb4_1000    conda-forge
toolz                     0.9.0                      py_1    conda-forge
tornado                   6.0.1            py36h1de35cc_0    conda-forge
traitlets                 4.3.2                 py36_1000    conda-forge
tzcode                    2018g             h1de35cc_1001    conda-forge
udunits2                  2.2.27.6          h776b7f1_1001    conda-forge
urllib3                   1.24.1                py36_1000    conda-forge
wcwidth                   0.1.7                      py_1    conda-forge
webargs                   5.1.2                    pypi_0    pypi
webencodings              0.5.1                      py_1    conda-forge
wheel                     0.33.1                   py36_0    conda-forge
widgetsnbextension        3.4.2                 py36_1000    conda-forge
xarray                    0.11.3                   py36_0    conda-forge
xerces-c                  3.2.2             h44e365a_1001    conda-forge
xz                        5.2.4             h1de35cc_1001    conda-forge
yaml                      0.1.7             h1de35cc_1001    conda-forge
zeromq                    4.2.5             h0a44026_1006    conda-forge
zict                      0.1.4                      py_0    conda-forge
zlib                      1.2.11            h1de35cc_1004    conda-forge

Thanks for any help!

ivirshup avatar Mar 12 '19 01:03 ivirshup

I think examples/environment.yml is probably out of date - the dependencies are quite different from the current ones (see https://github.com/pyviz/datashader/blob/master/setup.py#L32, which is the basis for the conda package).

In the short term, maybe you could conda install -c pyviz datashader and then remove --force it (to leave the dependencies), then do pip install -e . --no-deps in the git repo? I have not tested this, and a current datashader developer might have a better idea. Or maybe you could look to see what pins there are in setup.py (e.g. see the pytest and pytest-benchmark pins...), and apply them to your existing environment?

The plan for datashader was to specify the dependencies in one place, and generate both the conda package recipe and examples/environment.yml from that (by filtering/pinning/combining groups as necessary for each one, since they have different purposes). I think we've managed to start doing that in some other pyviz projects (e.g. pyviz itself), but we're not there yet.

ceball avatar Mar 12 '19 08:03 ceball

Sounds about right. I think @jsignell can fix environment.yml to be generated from the actual dependencies, so that it matches what we use for testing. But I don't think any removing is needed; I just do conda install -c pyviz datashader then pip install -e . inside the datashader repo, which is normally sufficient to ensure that the repo is used rather than the conda package.

jbednar avatar Mar 12 '19 21:03 jbednar

Thanks for the advice!

I'm still having trouble though. Here's what I've run so far:

conda create -n datashader
conda activate datashader
conda install --deps-only -yc pyviz datashader

At this point, pytest isn't in the environment, so I've manually added the test requirements from the setup.py:

conda install -y "pytest==3.9.3" "pytest-benchmark==3.0.0" "flake8" "nbsmoke>=0.2.6" "fastparquet>=0.1.6"
pip install -e .

Running pytest at this point throws a tornado error:

Call & traceback
(datashader) isaac@mimir ~/github/datashader$ pytest                          ✭speedup_connectedges 
Traceback (most recent call last):
  File "/Users/isaac/miniconda3/envs/datashader/bin/pytest", line 11, in <module>
    sys.exit(main())
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/_pytest/config/__init__.py", line 56, in main
    config = _prepareconfig(args, plugins)
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/_pytest/config/__init__.py", line 193, in _prepareconfig
    pluginmanager=pluginmanager, args=args
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/pluggy/hooks.py", line 289, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/pluggy/manager.py", line 68, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/pluggy/manager.py", line 62, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/pluggy/callers.py", line 203, in _multicall
    gen.send(outcome)
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/_pytest/helpconfig.py", line 93, in pytest_cmdline_parse
    config = outcome.get_result()
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/pluggy/callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/_pytest/config/__init__.py", line 663, in pytest_cmdline_parse
    self.parse(args)
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/_pytest/config/__init__.py", line 835, in parse
    self._preparse(args, addopts=addopts)
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/_pytest/config/__init__.py", line 787, in _preparse
    self.pluginmanager.load_setuptools_entrypoints("pytest11")
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/pluggy/manager.py", line 274, in load_setuptools_entrypoints
    plugin = ep.load()
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2411, in load
    return self.resolve()
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2417, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/nbsmoke/__init__.py", line 94, in <module>
    import nbconvert
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/nbconvert/__init__.py", line 7, in <module>
    from . import postprocessors
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/nbconvert/postprocessors/__init__.py", line 5, in <module>
    from .serve import ServePostProcessor
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/nbconvert/postprocessors/serve.py", line 19, in <module>
    class ProxyHandler(web.RequestHandler):
  File "/Users/isaac/miniconda3/envs/datashader/lib/python3.7/site-packages/nbconvert/postprocessors/serve.py", line 21, in ProxyHandler
    @web.asynchronous
AttributeError: module 'tornado.web' has no attribute 'asynchronous'

Output of `conda list`
# packages in environment at /Users/isaac/miniconda3/envs/datashader:
#
# Name                    Version                   Build  Channel
appnope                   0.1.0                    py37_0  
asn1crypto                0.24.0                   py37_0  
atomicwrites              1.3.0                      py_0  
attrs                     19.1.0                     py_0  
backcall                  0.1.0                    py37_0  
beautifulsoup4            4.7.1                    py37_1  
blas                      1.0                         mkl  
bleach                    3.1.0                    py37_0  
bokeh                     1.0.4                    py37_0  
ca-certificates           2019.1.23                     0  
certifi                   2019.3.9                 py37_0  
cffi                      1.12.2           py37hb5b8e2f_1  
chardet                   3.0.4                    py37_1  
click                     7.0                      py37_0  
cloudpickle               0.8.0                    py37_0  
colorcet                  1.0.1                      py_0    pyviz
cryptography              2.6.1            py37ha12b0ac_0  
cycler                    0.10.0                   py37_0  
cytoolz                   0.9.0.1          py37h1de35cc_1  
dask                      1.1.4                      py_0  
dask-core                 1.1.4                      py_0  
datashader                0.7.0a1.post5+g7fa33cb           dev_0    <develop>
datashape                 0.5.4                    py37_1  
decorator                 4.3.2                    py37_0  
distributed               1.26.0                   py37_1  
entrypoints               0.3                      py37_0  
fastparquet               0.2.1            py37h1d22016_1  
flake8                    3.7.7                    py37_0  
freetype                  2.9.1                hb4e5f40_0  
heapdict                  1.0.0                    py37_2  
idna                      2.8                      py37_0  
imageio                   2.5.0                    py37_0  
intel-openmp              2019.1                      144  
ipykernel                 5.1.0            py37h39e3cac_0  
ipython                   7.3.0            py37h39e3cac_0  
ipython_genutils          0.2.0                    py37_0  
jedi                      0.13.3                   py37_0  
jinja2                    2.10                     py37_0  
jpeg                      9b                   he5867d9_2  
jsonschema                3.0.1                    py37_0  
jupyter_client            5.2.4                    py37_0  
jupyter_core              4.4.0                    py37_0  
kiwisolver                1.0.1            py37h0a44026_0  
libcxx                    4.0.1                hcfea43d_1  
libcxxabi                 4.0.1                hcfea43d_1  
libedit                   3.1.20181209         hb402a30_0  
libffi                    3.2.1                h475c297_4  
libgfortran               3.0.1                h93005f0_2  
libpng                    1.6.36               ha441bb4_0  
libsodium                 1.0.16               h3efe00b_0  
libtiff                   4.0.10               hcb84e12_2  
llvmlite                  0.27.0           py37h8c7ce04_0  
locket                    0.2.0                    py37_1  
markupsafe                1.1.1            py37h1de35cc_0  
matplotlib                3.0.2            py37h54f8f79_0  
mccabe                    0.6.1                    py37_1  
mistune                   0.8.4            py37h1de35cc_0  
mkl                       2019.1                      144  
mkl_fft                   1.0.10           py37h5e564d8_0  
mkl_random                1.0.2            py37h27c97d8_0  
more-itertools            5.0.0                    py37_0  
msgpack-python            0.6.1            py37h04f5b5a_1  
multipledispatch          0.6.0                    py37_0  
nbconvert                 5.3.1                    py37_0  
nbformat                  4.4.0                    py37_0  
nbsmoke                   0.2.7                      py_0    conda-forge
ncurses                   6.1                  h0a44026_1  
networkx                  2.2                      py37_1  
numba                     0.42.0           py37h6440ff4_0  
numpy                     1.16.2           py37hacdab7b_0  
numpy-base                1.16.2           py37h6575580_0  
olefile                   0.46                     py37_0  
openssl                   1.1.1b               h1de35cc_1  
packaging                 19.0                     py37_0  
pandas                    0.24.1           py37h0a44026_0  
pandoc                    2.2.3.2                       0  
pandocfilters             1.4.2                    py37_1  
param                     1.8.2                      py_0    pyviz
parso                     0.3.4                    py37_0  
partd                     0.3.9                    py37_0  
pexpect                   4.6.0                    py37_0  
pickleshare               0.7.5                    py37_0  
pillow                    5.4.1            py37hb68e598_0  
pip                       19.0.3                   py37_0  
pluggy                    0.9.0                    py37_0  
prompt_toolkit            2.0.9                    py37_0  
psutil                    5.6.1            py37h1de35cc_0  
ptyprocess                0.6.0                    py37_0  
py                        1.8.0                    py37_0  
pycodestyle               2.5.0                    py37_0  
pycparser                 2.19                     py37_0  
pyct                      0.4.6                      py_0    pyviz
pyct-core                 0.4.6                      py_0    pyviz
pyflakes                  2.1.1                    py37_0  
pygments                  2.3.1                    py37_0  
pyopenssl                 19.0.0                   py37_0  
pyparsing                 2.3.1                    py37_0  
pyrsistent                0.14.11          py37h1de35cc_0  
pysocks                   1.6.8                    py37_0  
pytest                    3.9.3                    py37_0  
pytest-benchmark          3.0.0                 py37_1001    conda-forge
python                    3.7.2                haf84260_0  
python-dateutil           2.8.0                    py37_0  
pytz                      2018.9                   py37_0  
pywavelets                1.0.2            py37h1d22016_0  
pyyaml                    3.13             py37h1de35cc_0  
pyzmq                     18.0.0           py37h0a44026_0  
readline                  7.0                  h1de35cc_5  
requests                  2.21.0                   py37_0  
scikit-image              0.14.1           py37h0a44026_0  
scipy                     1.2.1            py37h1410ff5_0  
setuptools                40.8.0                   py37_0  
six                       1.12.0                   py37_0  
sortedcontainers          2.1.0                    py37_0  
soupsieve                 1.7.1                    py37_0  
sqlite                    3.27.2               ha441bb4_0  
tblib                     1.3.2                    py37_0  
testpath                  0.3.1                    py37_0  
thrift                    0.11.0           py37h0a44026_0  
tk                        8.6.8                ha441bb4_0  
toolz                     0.9.0                    py37_0  
tornado                   6.0.1            py37h1de35cc_0  
traitlets                 4.3.2                    py37_0  
urllib3                   1.24.1                   py37_0  
wcwidth                   0.1.7                    py37_0  
webencodings              0.5.1                    py37_1  
wheel                     0.33.1                   py37_0  
xarray                    0.11.3                   py37_0  
xz                        5.2.4                h1de35cc_4  
yaml                      0.1.7                hc338f04_2  
zeromq                    4.3.1                h0a44026_3  
zict                      0.1.4                    py37_0  
zlib                      1.2.11               h1de35cc_3  
zstd                      1.3.7                h5bba6e5_0  

ivirshup avatar Mar 13 '19 02:03 ivirshup

Progress! I got rid of the tornado error by downgrading tornado. Now pytest runs, but for some reason it's not finding all the tests. Here's the full set of commands to get to my current environment:

conda create -n datashader
conda activate datashader
conda install --deps-only -yc pyviz datashader
conda install -y "pytest==3.9.3" "pytest-benchmark==3.0.0" "flake8" "nbsmoke>=0.2.6" "fastparquet>=0.1.6"
conda install "tornado<=6"
pip install -e .

However, not all the tests are running. I think a similar issue is happening with the travis builds. In the build for my PR (#725) I noticed travis was passing while appveyor wasn't. Neither should pass, since there are two test which are failing, since I think those tests have a bug. Travis just isn't running those tests (travis logs don't show tests from test_bundling.py).

Looking into this a little further, pytest --collect-only . collects 425 tests (skipping 12) from the conda environment, but using a pip installed pytest (v4.3.0) 461 items are collected with 5 skipped.

Running pytest --collect-only --disable-warnings . | pbcopy I find:

conda env collected tests
============================= test session starts ==============================
platform darwin -- Python 3.7.2, pytest-3.9.3, py-1.8.0, pluggy-0.9.0 -- /Users/isaac/miniconda3/envs/datashader/bin/python
cachedir: .pytest_cache
benchmark: 3.0.0 (defaults: timer=time.perf_counter disable_gc=False min_rounds=5 min_time=5.00us max_time=1.00s calibration_precision=10 warmup=False warmup_iterations=100000)
rootdir: /Users/isaac/github/datashader, inifile: tox.ini
plugins: benchmark-3.0.0, nbsmoke-0.2.7
collecting ... collected 425 items / 12 skipped
<Package '/Users/isaac/github/datashader/datashader'>
  <DoctestModule 'colors.py'>
    <DoctestItem 'datashader.colors.colormap_select'>
    <DoctestItem 'datashader.colors.hex_to_rgb'>
    <DoctestItem 'datashader.colors.rgb'>
  <DoctestModule 'core.py'>
    <DoctestItem 'datashader.core.Axis'>
    <DoctestItem 'datashader.core.Canvas.line'>
    <DoctestItem 'datashader.core.Canvas.trimesh'>
  <DoctestModule 'reductions.py'>
    <DoctestItem 'datashader.reductions.summary'>
  <DoctestModule 'utils.py'>
    <DoctestItem 'datashader.utils.isreal'>
  <Package '/Users/isaac/github/datashader/datashader/spatial'>
    <DoctestModule 'points.py'>
      <DoctestItem 'datashader.spatial.points.SpatialPointsFrame'>
  <Package '/Users/isaac/github/datashader/datashader/tests'>
    <Module 'test_bokeh_ext.py'>
      <Function 'test_interactive_image_initialize'>
      <Function 'test_interactive_image_update'>
    <Module 'test_colors.py'>
      <Function 'test_hex_to_rgb'>
      <Function 'test_rgb'>
    <Module 'test_compatibility.py'>
      <Function 'test__exec'>
      <Function 'test_apply'>
    <Module 'test_composite.py'>
      <Function 'test_source'>
      <Function 'test_over'>
      <Function 'test_add'>
      <Function 'test_saturate'>
    <Module 'test_dask.py'>
      <Function 'test_count'>
      <Function 'test_any'>
      <Function 'test_sum'>
      <Function 'test_min'>
      <Function 'test_max'>
      <Function 'test_mean'>
      <Function 'test_var'>
      <Function 'test_std'>
      <Function 'test_count_cat'>
      <Function 'test_multiple_aggregates'>
      <Function 'test_auto_range_points'>
      <Function 'test_uniform_points'>
      <Function 'test_uniform_diagonal_points[0-9]'>
      <Function 'test_uniform_diagonal_points[0-10]'>
      <Function 'test_uniform_diagonal_points[0-99]'>
      <Function 'test_uniform_diagonal_points[0-100]'>
      <Function 'test_log_axis_points'>
      <Function 'test_line'>
      <Function 'test_line_manual_range[df0-x0-y0-1]'>
      <Function 'test_line_manual_range[df1-x1-y1-1]'>
      <Function 'test_line_manual_range[df2-x-y-0]'>
      <Function 'test_line_manual_range[df3-x3-y3-0]'>
      <Function 'test_line_manual_range[df4-x0-y4-0]'>
      <Function 'test_line_manual_range[df5-x-y-1]'>
      <Function 'test_line_autorange[df0-x0-y0-1]'>
      <Function 'test_line_autorange[df1-x1-y1-1]'>
      <Function 'test_line_autorange[df2-x-y-0]'>
      <Function 'test_line_autorange[df3-x3-y3-0]'>
      <Function 'test_line_autorange[df4-x4-y0-0]'>
      <Function 'test_line_autorange[df5-x-y-1]'>
      <Function 'test_line_x_constant_autorange'>
      <Function 'test_log_axis_line'>
      <Function 'test_auto_range_line'>
      <Function 'test_trimesh_no_double_edge'>
      <Function 'test_trimesh_dask_partitions[1]'>
      <Function 'test_trimesh_dask_partitions[2]'>
      <Function 'test_trimesh_dask_partitions[3]'>
      <Function 'test_trimesh_dask_partitions[4]'>
      <Function 'test_trimesh_dask_partitions[5]'>
    <Module 'test_datatypes.py'>
      <Function 'test_construct_ragged_dtype'>
      <Function 'test_construct_ragged_array'>
      <Function 'test_construct_ragged_array_from_ragged_array'>
      <Function 'test_construct_ragged_array_fastpath'>
      <Function 'test_validate_ragged_array_fastpath'>
      <Function 'test_start_indices_dtype'>
      <Function 'test_flat_array_type_inference[arg0-int64]'>
      <Function 'test_flat_array_type_inference[arg1-bool]'>
      <Function 'test_flat_array_type_inference[arg2-int32]'>
      <Function 'test_flat_array_type_inference[arg3-float64]'>
      <Function 'test_flat_array_type_inference[arg4-float32]'>
      <Function 'test_isna'>
      <Function 'test_get_item_scalar'>
      <Function 'test_get_item_scalar_out_of_bounds[-1000]'>
      <Function 'test_get_item_scalar_out_of_bounds[-6]'>
      <Function 'test_get_item_scalar_out_of_bounds[5]'>
      <Function 'test_get_item_scalar_out_of_bounds[1000]'>
      <Function 'test_get_item_slice'>
      <Function 'test_get_item_mask[mask0]'>
      <Function 'test_get_item_mask[mask1]'>
      <Function 'test_get_item_mask[mask2]'>
      <Function 'test_get_item_list[inds0]'>
      <Function 'test_get_item_list[inds1]'>
      <Function 'test_get_item_list[inds2]'>
      <Function 'test_get_item_list[inds3]'>
      <Function 'test_get_item_list[inds4]'>
      <Function 'test_factorization'>
      <Function 'test_from_sequence'>
      <Function 'test_copy'>
      <Function 'test_take'>
      <Function 'test_concat_same_type'>
      <Function 'test_pandas_array_construction'>
      <Function 'test_series_construction'>
      <Function 'test_concat_series'>
      <Function 'test_array_eq_scalar[scalar0]'>
      <Function 'test_array_eq_scalar[scalar1]'>
      <Function 'test_array_eq_numpy1'>
      <Function 'test_array_eq_numpy2d'>
      <Function 'test_array_eq_ragged'>
      <Function 'test_equality_validation[a string]'>
      <Function 'test_equality_validation[32]'>
      <Function 'test_equality_validation[other2]'>
      <Function 'test_equality_validation[other3]'>
      <Function 'test_equality_validation[other4]'>
      <Class 'TestRaggedConstructors'>
        <Instance '()'>
          <Function 'test_from_sequence_from_cls'>
          <Function 'test_array_from_scalars'>
          <Function 'test_series_constructor'>
          <Function 'test_dataframe_constructor_from_dict[True]'>
          <Function 'test_dataframe_constructor_from_dict[False]'>
          <Function 'test_dataframe_from_series'>
          <Function 'test_series_given_mismatched_index_raises'>
          <Function 'test_from_dtype'>
          <Function 'test_pandas_array'>
          <Function 'test_pandas_array_dtype'>
      <Class 'TestRaggedDtype'>
        <Instance '()'>
          <Function 'test_name'>
          <Function 'test_kind'>
          <Function 'test_construct_from_string_own_name'>
          <Function 'test_is_dtype_from_name'>
          <Function 'test_is_dtype_unboxes_dtype'>
          <Function 'test_is_dtype_from_self'>
          <Function 'test_is_not_string_type'>
          <Function 'test_is_not_object_type'>
          <Function 'test_eq_with_str'>
          <Function 'test_eq_with_numpy_object'>
          <Function 'test_eq_with_self'>
          <Function 'test_array_type'>
          <Function 'test_check_dtype'>
          <Function 'test_hashable'>
      <Class 'TestRaggedGetitem'>
        <Instance '()'>
          <Function 'test_get'>
          <Function 'test_take_sequence'>
          <Function 'test_take'>
          <Function 'test_iloc_series'>
          <Function 'test_iloc_frame'>
          <Function 'test_loc_series'>
          <Function 'test_loc_frame'>
          <Function 'test_getitem_scalar'>
          <Function 'test_getitem_scalar_na'>
          <Function 'test_getitem_mask'>
          <Function 'test_getitem_slice'>
          <Function 'test_take_empty'>
          <Function 'test_take_negative'>
          <Function 'test_take_non_na_fill_value'>
          <Function 'test_take_pandas_style_negative_raises'>
          <Function 'test_take_out_of_bounds_raises[True]'>
          <Function 'test_take_out_of_bounds_raises[False]'>
          <Function 'test_take_series'>
          <Function 'test_reindex'>
          <Function 'test_reindex_non_na_fill_value'>
      <Class 'TestRaggedGroupby'>
        <Instance '()'>
          <Function 'test_groupby_extension_apply[scalar]'>
          <Function 'test_groupby_extension_apply[list]'>
          <Function 'test_groupby_extension_apply[object]'>
          <Function 'test_grouping_grouper'>
          <Function 'test_groupby_extension_agg[True]'>
          <Function 'test_groupby_extension_agg[False]'>
          <Function 'test_groupby_extension_no_sort'>
          <Function 'test_groupby_extension_transform'>
          <Function 'test_in_numeric_groupby'>
      <Class 'TestRaggedInterface'>
        <Instance '()'>
          <Function 'test_array_interface'>
          <Function 'test_len'>
          <Function 'test_ndim'>
          <Function 'test_can_hold_na_valid'>
          <Function 'test_memory_usage'>
          <Function 'test_is_extension_array_dtype'>
          <Function 'test_no_values_attribute'>
          <Function 'test_is_numeric_honored'>
          <Function 'test_isna_extension_array'>
      <Class 'TestRaggedMethods'>
        <Instance '()'>
          <Function 'test_value_counts'>
          <Function 'test_unique[<lambda>-Series]'>
          <Function 'test_unique[<lambda>-<lambda>]'>
          <Function 'test_unique[unique-Series]'>
          <Function 'test_unique[unique-<lambda>]'>
          <Function 'test_fillna_copy_frame'>
          <Function 'test_fillna_copy_series'>
          <Function 'test_combine_le'>
          <Function 'test_combine_add'>
          <Function 'test_combine_first'>
          <Function 'test_count'>
          <Function 'test_apply_simple_series'>
          <Function 'test_argsort'>
          <Function 'test_argsort_missing'>
          <Function 'test_sort_values[True]'>
          <Function 'test_sort_values[False]'>
          <Function 'test_sort_values_missing[True]'>
          <Function 'test_sort_values_missing[False]'>
          <Function 'test_sort_values_frame[True]'>
          <Function 'test_sort_values_frame[False]'>
          <Function 'test_factorize[-1]'>
          <Function 'test_factorize[-2]'>
          <Function 'test_factorize_equivalence[-1]'>
          <Function 'test_factorize_equivalence[-2]'>
          <Function 'test_factorize_empty'>
          <Function 'test_fillna_length_mismatch'>
          <Function 'test_container_shift[-2-indices0-True]'>
          <Function 'test_container_shift[-2-indices0-False]'>
          <Function 'test_container_shift[0-indices1-True]'>
          <Function 'test_container_shift[0-indices1-False]'>
          <Function 'test_container_shift[2-indices2-True]'>
          <Function 'test_container_shift[2-indices2-False]'>
          <Function 'test_shift_non_empty_array[-4-indices0]'>
          <Function 'test_shift_non_empty_array[-1-indices1]'>
          <Function 'test_shift_non_empty_array[0-indices2]'>
          <Function 'test_shift_non_empty_array[1-indices3]'>
          <Function 'test_shift_non_empty_array[4-indices4]'>
          <Function 'test_shift_empty_array[-4]'>
          <Function 'test_shift_empty_array[-1]'>
          <Function 'test_shift_empty_array[0]'>
          <Function 'test_shift_empty_array[1]'>
          <Function 'test_shift_empty_array[4]'>
          <Function 'test_shift_fill_value'>
          <Function 'test_hash_pandas_object_works[True]'>
          <Function 'test_hash_pandas_object_works[False]'>
          <Function 'test_searchsorted[True]'>
          <Function 'test_searchsorted[False]'>
          <Function 'test_where_series[True]'>
          <Function 'test_where_series[False]'>
          <Function 'test_repeat[0-True-True]'>
          <Function 'test_repeat[0-True-False]'>
          <Function 'test_repeat[0-False-True]'>
          <Function 'test_repeat[0-False-False]'>
          <Function 'test_repeat[1-True-True]'>
          <Function 'test_repeat[1-True-False]'>
          <Function 'test_repeat[1-False-True]'>
          <Function 'test_repeat[1-False-False]'>
          <Function 'test_repeat[2-True-True]'>
          <Function 'test_repeat[2-True-False]'>
          <Function 'test_repeat[2-False-True]'>
          <Function 'test_repeat[2-False-False]'>
          <Function 'test_repeat[repeats3-True-True]'>
          <Function 'test_repeat[repeats3-True-False]'>
          <Function 'test_repeat[repeats3-False-True]'>
          <Function 'test_repeat[repeats3-False-False]'>
          <Function "test_repeat_raises[2-kwargs0-ValueError-'axis-True]">
          <Function "test_repeat_raises[2-kwargs0-ValueError-'axis-False]">
          <Function 'test_repeat_raises[-1-kwargs1-ValueError-negative-True]'>
          <Function 'test_repeat_raises[-1-kwargs1-ValueError-negative-False]'>
          <Function 'test_repeat_raises[repeats2-kwargs2-ValueError-shape-True]'>
          <Function 'test_repeat_raises[repeats2-kwargs2-ValueError-shape-False]'>
          <Function "test_repeat_raises[2-kwargs3-TypeError-'foo'-True]">
          <Function "test_repeat_raises[2-kwargs3-TypeError-'foo'-False]">
      <Class 'TestRaggedPrinting'>
        <Instance '()'>
          <Function 'test_array_repr[big]'>
          <Function 'test_array_repr[small]'>
          <Function 'test_array_repr_unicode'>
          <Function 'test_series_repr'>
          <Function 'test_dataframe_repr'>
          <Function 'test_dtype_name_in_info'>
      <Class 'TestRaggedMissing'>
        <Instance '()'>
          <Function 'test_fillna_series'>
          <Function 'test_fillna_frame'>
          <Function 'test_isna'>
          <Function 'test_dropna_array'>
          <Function 'test_dropna_series'>
          <Function 'test_dropna_frame'>
          <Function 'test_fillna_scalar'>
          <Function 'test_fillna_limit_pad'>
          <Function 'test_fillna_limit_backfill'>
          <Function 'test_fillna_series_method[ffill]'>
          <Function 'test_fillna_series_method[bfill]'>
          <Function 'test_fillna_fill_other'>
      <Class 'TestRaggedReshaping'>
        <Instance '()'>
          <Function 'test_concat[True]'>
          <Function 'test_concat[False]'>
          <Function 'test_concat_all_na_block[True]'>
          <Function 'test_concat_all_na_block[False]'>
          <Function 'test_concat_mixed_dtypes'>
          <Function 'test_concat_columns'>
          <Function 'test_align'>
          <Function 'test_align_frame'>
          <Function 'test_align_series_frame'>
          <Function 'test_set_frame_expand_regular_with_extension'>
          <Function 'test_set_frame_expand_extension_with_regular'>
          <Function 'test_set_frame_overwrite_object'>
          <Function 'test_merge'>
          <Function 'test_merge_on_extension_array'>
          <Function 'test_merge_on_extension_array_duplicates'>
          <Function 'test_stack[columns0]'>
          <Function 'test_stack[columns1]'>
          <Function 'test_unstack[series-index0]'>
          <Function 'test_unstack[series-index1]'>
          <Function 'test_unstack[series-index2]'>
          <Function 'test_unstack[series-index3]'>
          <Function 'test_unstack[frame-index0]'>
          <Function 'test_unstack[frame-index1]'>
          <Function 'test_unstack[frame-index2]'>
          <Function 'test_unstack[frame-index3]'>
    <Module 'test_geo.py'>
      <Function 'test_mean_transfer_function'>
      <Function 'test_slope_transfer_function'>
      <Function 'test_aspect_transfer_function'>
      <Function 'test_hillshade_simple_transfer_function'>
      <Function 'test_ndvi_transfer_function'>
      <Function 'test_generate_terrain'>
      <Function 'test_bump'>
    <Module 'test_glyphs.py'>
      <Function 'test_point_bounds_check'>
      <Function 'test_point_validate'>
      <Function 'test_draw_line'>
      <Function 'test_draw_line_same_point'>
      <Function 'test_draw_line_vertical_horizontal'>
      <Function 'test_extend_lines'>
      <Function 'test_extend_lines_all_out_of_bounds'>
      <Function 'test_extend_lines_nan'>
      <Function 'test_extend_lines_exact_bounds'>
      <Function 'test_draw_triangle_nointerp'>
      <Function 'test_draw_triangle_interp'>
      <Function 'test_draw_triangle_subpixel'>
      <Function 'test_line_awkward_point_on_upper_bound_maps_to_last_pixel'>
      <Function 'test_lines_xy_validate'>
    <Module 'test_pandas.py'>
      <Function 'test_count'>
      <Function 'test_any'>
      <Function 'test_sum'>
      <Function 'test_min'>
      <Function 'test_max'>
      <Function 'test_mean'>
      <Function 'test_var'>
      <Function 'test_std'>
      <Function 'test_count_cat'>
      <Function 'test_multiple_aggregates'>
      <Function 'test_auto_range_points'>
      <Function 'test_uniform_points'>
      <Function 'test_uniform_diagonal_points[0-9]'>
      <Function 'test_uniform_diagonal_points[0-10]'>
      <Function 'test_uniform_diagonal_points[0-99]'>
      <Function 'test_uniform_diagonal_points[0-100]'>
      <Function 'test_log_axis_points'>
      <Function 'test_line'>
      <Function 'test_points_on_edge'>
      <Function 'test_lines_on_edge'>
      <Function 'test_log_axis_line'>
      <Function 'test_auto_range_line'>
      <Function 'test_trimesh_no_double_edge'>
      <Function 'test_trimesh_interp'>
      <Function 'test_trimesh_simplex_weights'>
      <Function 'test_trimesh_vertex_weights'>
      <Function 'test_trimesh_winding_detect'>
      <Function 'test_trimesh_mesharg'>
      <Function 'test_trimesh_agg_api'>
      <Function 'test_bug_570'>
      <Function 'test_line_manual_range[df0-x0-y0-1]'>
      <Function 'test_line_manual_range[df1-x1-y1-1]'>
      <Function 'test_line_manual_range[df2-x2-y2-1]'>
      <Function 'test_line_manual_range[df3-x-y-0]'>
      <Function 'test_line_manual_range[df4-x4-y4-0]'>
      <Function 'test_line_manual_range[df5-x5-y0-0]'>
      <Function 'test_line_manual_range[df6-x-y-1]'>
      <Function 'test_line_autorange[df0-x0-y0-1]'>
      <Function 'test_line_autorange[df1-x1-y1-1]'>
      <Function 'test_line_autorange[df2-x-y-0]'>
      <Function 'test_line_autorange[df3-x3-y3-0]'>
      <Function 'test_line_autorange[df4-x4-y0-0]'>
      <Function 'test_line_autorange[df5-x-y-1]'>
      <Function 'test_line_autorange_axis1_x_constant'>
      <Function 'test_line_agg_sum_axis1_none_constant'>
      <Function 'test_line_autorange_axis1_ragged'>
    <Module 'test_pipeline.py'>
      <Function 'test_pipeline'>
    <Module 'test_spatial.py'>
      <Function 'test_spatial_points_frame_properties[False]'>
      <Function 'test_spatial_points_frame_properties[True]'>
      <Function 'test_query_partitions[False-x_range0-y_range0]'>
      <Function 'test_query_partitions[False-x_range1-y_range1]'>
      <Function 'test_query_partitions[False-x_range2-y_range2]'>
      <Function 'test_query_partitions[True-x_range0-y_range0]'>
      <Function 'test_query_partitions[True-x_range1-y_range1]'>
      <Function 'test_query_partitions[True-x_range2-y_range2]'>
      <Function 'test_aggregation_partitions[False-x_range0-y_range0]'>
      <Function 'test_aggregation_partitions[False-x_range1-y_range1]'>
      <Function 'test_aggregation_partitions[False-x_range2-y_range2]'>
      <Function 'test_aggregation_partitions[True-x_range0-y_range0]'>
      <Function 'test_aggregation_partitions[True-x_range1-y_range1]'>
      <Function 'test_aggregation_partitions[True-x_range2-y_range2]'>
      <Function 'test_validate_parquet_file'>
    <Module 'test_tiles.py'>
      <Function 'test_render_tiles'>
      <Function 'test_get_super_tile_min_max'>
      <Function 'test_calculate_zoom_level_stats_with_fullscan_ranging_strategy'>
    <Module 'test_transfer_functions.py'>
      <Function 'test_shade[None-a]'>
      <Function 'test_shade[None-b]'>
      <Function 'test_shade[None-c]'>
      <Function 'test_shade[span1-a]'>
      <Function 'test_shade[span1-b]'>
      <Function 'test_shade[span1-c]'>
      <Function 'test_shade[span2-a]'>
      <Function 'test_shade[span2-b]'>
      <Function 'test_shade[span2-c]'>
      <Function 'test_span_cmap_list[linear-a]'>
      <Function 'test_span_cmap_list[linear-b]'>
      <Function 'test_span_cmap_list[linear-c]'>
      <Function 'test_span_cmap_list[log-a]'>
      <Function 'test_span_cmap_list[log-b]'>
      <Function 'test_span_cmap_list[log-c]'>
      <Function 'test_span_cmap_list[cbrt-a]'>
      <Function 'test_span_cmap_list[cbrt-b]'>
      <Function 'test_span_cmap_list[cbrt-c]'>
      <Function 'test_span_cmap_single[black]'>
      <Function 'test_span_cmap_single[cmap1]'>
      <Function 'test_span_cmap_single[#000000]'>
      <Function 'test_span_cmap_mpl'>
      <Function 'test_shade_bool'>
      <Function 'test_shade_cmap'>
      <Function 'test_shade_cmap_non_categorical_alpha[black]'>
      <Function 'test_shade_cmap_non_categorical_alpha[cmap1]'>
      <Function 'test_shade_cmap_non_categorical_alpha[#000000]'>
      <Function 'test_shade_cmap_errors'>
      <Function 'test_shade_mpl_cmap'>
      <Function 'test_shade_category'>
      <Function 'test_set_background'>
      <Function 'test_stack'>
      <Function 'test_masks'>
      <Function 'test_spread'>
      <Function 'test_density'>
      <Function 'test_dynspread'>
      <Function 'test_eq_hist'>
      <Function 'test_Image_to_pil'>
      <Function 'test_Image_to_bytesio'>
      <Function 'test_shade_should_handle_zeros_array'>
    <Module 'test_utils.py'>
      <Function 'test_Dispatcher'>
      <Function 'test_isreal'>
    <Module 'test_xarray.py'>
      <Function 'test_count[source0]'>
      <Function 'test_count[source1]'>
      <Function 'test_count[source2]'>
      <Function 'test_count[source3]'>
    <Module 'test_canvas.py'>
      <Function 'test_line'>
      <Function 'test_points'>
    <Module 'test_draw_line.py'>
      <Function 'test_draw_line_left_border'>
      <Function 'test_draw_line_diagonal'>
      <Function 'test_draw_line_offset'>
    <Module 'test_extend_line.py'>
      <Function 'test_extend_line_uniform[0-0]'>
      <Function 'test_extend_line_uniform[0-100000]'>
      <Function 'test_extend_line_uniform[-100000-0]'>
      <Function 'test_extend_line_uniform[-100000-100000]'>
      <Function 'test_extend_line_normal'>
    <Module 'test_layout.py'>
      <Function 'test_layout[random_layout]'>
      <Function 'test_layout[circular_layout]'>
      <Function 'test_layout[forceatlas2_layout]'>

=================== 12 skipped, 14 warnings in 5.56 seconds ====================
pytest 4.3.0 collected tests
============================= test session starts ==============================
platform darwin -- Python 3.7.2, pytest-4.3.0, py-1.8.0, pluggy-0.8.1 -- /usr/local/opt/python/bin/python3.7
cachedir: .pytest_cache
rootdir: /Users/isaac/github/datashader, inifile: tox.ini
plugins: xdist-1.26.0, parallel-0.0.9, mock-1.10.1, helpers-namespace-2019.1.8, forked-1.0.1, cov-2.6.1, pylama-7.6.6
collecting ... collected 461 items / 5 skipped / 456 selected
<Package /Users/isaac/github/datashader/datashader>
  <DoctestModule colors.py>
    <DoctestItem datashader.colors.colormap_select>
    <DoctestItem datashader.colors.hex_to_rgb>
    <DoctestItem datashader.colors.rgb>
  <DoctestModule core.py>
    <DoctestItem datashader.core.Axis>
    <DoctestItem datashader.core.Canvas.line>
    <DoctestItem datashader.core.Canvas.trimesh>
  <DoctestModule reductions.py>
    <DoctestItem datashader.reductions.summary>
  <DoctestModule utils.py>
    <DoctestItem datashader.utils.isreal>
<Package /Users/isaac/github/datashader/datashader/spatial>
  <DoctestModule points.py>
    <DoctestItem datashader.spatial.points.SpatialPointsFrame>
<Package /Users/isaac/github/datashader/datashader/tests>
  <Module test_bokeh_ext.py>
    <Function test_interactive_image_initialize>
    <Function test_interactive_image_update>
  <Module test_bundling.py>
    <Function test_immutable_nodes>
    <Function test_renamed_columns[connect_edges]>
    <Function test_renamed_columns[hammer_bundle]>
    <Function test_same_path_endpoints[random_layout-connect_edges]>
    <Function test_same_path_endpoints[random_layout-hammer_bundle]>
    <Function test_same_path_endpoints[circular_layout-connect_edges]>
    <Function test_same_path_endpoints[circular_layout-hammer_bundle]>
    <Function test_same_path_endpoints[forceatlas2_layout-connect_edges]>
    <Function test_same_path_endpoints[forceatlas2_layout-hammer_bundle]>
    <Function test_directly_connect_with_weights[True]>
    <Function test_directly_connect_with_weights[False]>
    <Function test_directly_connect_without_weights[True]>
    <Function test_directly_connect_without_weights[False]>
    <Function test_hammer_bundle_with_weights[True]>
    <Function test_hammer_bundle_with_weights[False]>
    <Function test_hammer_bundle_without_weights[True]>
    <Function test_hammer_bundle_without_weights[False]>
  <Module test_colors.py>
    <Function test_hex_to_rgb>
    <Function test_rgb>
  <Module test_compatibility.py>
    <Function test__exec>
    <Function test_apply>
  <Module test_composite.py>
    <Function test_source>
    <Function test_over>
    <Function test_add>
    <Function test_saturate>
  <Module test_dask.py>
    <Function test_count>
    <Function test_any>
    <Function test_sum>
    <Function test_min>
    <Function test_max>
    <Function test_mean>
    <Function test_var>
    <Function test_std>
    <Function test_count_cat>
    <Function test_multiple_aggregates>
    <Function test_auto_range_points>
    <Function test_uniform_points>
    <Function test_uniform_diagonal_points[0-9]>
    <Function test_uniform_diagonal_points[0-10]>
    <Function test_uniform_diagonal_points[0-99]>
    <Function test_uniform_diagonal_points[0-100]>
    <Function test_log_axis_points>
    <Function test_line>
    <Function test_line_manual_range[df0-x0-y0-1]>
    <Function test_line_manual_range[df1-x1-y1-1]>
    <Function test_line_manual_range[df2-x-y-0]>
    <Function test_line_manual_range[df3-x3-y3-0]>
    <Function test_line_manual_range[df4-x0-y4-0]>
    <Function test_line_manual_range[df5-x-y-1]>
    <Function test_line_autorange[df0-x0-y0-1]>
    <Function test_line_autorange[df1-x1-y1-1]>
    <Function test_line_autorange[df2-x-y-0]>
    <Function test_line_autorange[df3-x3-y3-0]>
    <Function test_line_autorange[df4-x4-y0-0]>
    <Function test_line_autorange[df5-x-y-1]>
    <Function test_line_x_constant_autorange>
    <Function test_log_axis_line>
    <Function test_auto_range_line>
    <Function test_trimesh_no_double_edge>
      Assert that when two triangles share an edge that would normally get
      double-drawn, the edge is only drawn for the rightmost (or bottommost)
      triangle.
    <Function test_trimesh_dask_partitions[1]>
      Assert that when two triangles share an edge that would normally get
      double-drawn, the edge is only drawn for the rightmost (or bottommost)
      triangle.
    <Function test_trimesh_dask_partitions[2]>
      Assert that when two triangles share an edge that would normally get
      double-drawn, the edge is only drawn for the rightmost (or bottommost)
      triangle.
    <Function test_trimesh_dask_partitions[3]>
      Assert that when two triangles share an edge that would normally get
      double-drawn, the edge is only drawn for the rightmost (or bottommost)
      triangle.
    <Function test_trimesh_dask_partitions[4]>
      Assert that when two triangles share an edge that would normally get
      double-drawn, the edge is only drawn for the rightmost (or bottommost)
      triangle.
    <Function test_trimesh_dask_partitions[5]>
      Assert that when two triangles share an edge that would normally get
      double-drawn, the edge is only drawn for the rightmost (or bottommost)
      triangle.
  <Module test_datatypes.py>
    <Function test_construct_ragged_dtype>
    <Function test_construct_ragged_array>
    <Function test_construct_ragged_array_from_ragged_array>
    <Function test_construct_ragged_array_fastpath>
    <Function test_validate_ragged_array_fastpath>
    <Function test_start_indices_dtype>
    <Function test_flat_array_type_inference[arg0-int64]>
    <Function test_flat_array_type_inference[arg1-bool]>
    <Function test_flat_array_type_inference[arg2-int32]>
    <Function test_flat_array_type_inference[arg3-float64]>
    <Function test_flat_array_type_inference[arg4-float32]>
    <Function test_isna>
    <Function test_get_item_scalar>
    <Function test_get_item_scalar_out_of_bounds[-1000]>
    <Function test_get_item_scalar_out_of_bounds[-6]>
    <Function test_get_item_scalar_out_of_bounds[5]>
    <Function test_get_item_scalar_out_of_bounds[1000]>
    <Function test_get_item_slice>
    <Function test_get_item_mask[mask0]>
    <Function test_get_item_mask[mask1]>
    <Function test_get_item_mask[mask2]>
    <Function test_get_item_list[inds0]>
    <Function test_get_item_list[inds1]>
    <Function test_get_item_list[inds2]>
    <Function test_get_item_list[inds3]>
    <Function test_get_item_list[inds4]>
    <Function test_factorization>
    <Function test_from_sequence>
    <Function test_copy>
    <Function test_take>
    <Function test_concat_same_type>
    <Function test_pandas_array_construction>
    <Function test_series_construction>
    <Function test_concat_series>
    <Function test_array_eq_scalar[scalar0]>
    <Function test_array_eq_scalar[scalar1]>
    <Function test_array_eq_numpy1>
    <Function test_array_eq_numpy2d>
    <Function test_array_eq_ragged>
    <Function test_equality_validation[a string]>
    <Function test_equality_validation[32]>
    <Function test_equality_validation[other2]>
    <Function test_equality_validation[other3]>
    <Function test_equality_validation[other4]>
    <Class TestRaggedConstructors>
        <Function test_from_sequence_from_cls>
        <Function test_array_from_scalars>
        <Function test_series_constructor>
        <Function test_dataframe_constructor_from_dict[True]>
        <Function test_dataframe_constructor_from_dict[False]>
        <Function test_dataframe_from_series>
        <Function test_series_given_mismatched_index_raises>
        <Function test_from_dtype>
        <Function test_pandas_array>
        <Function test_pandas_array_dtype>
    <Class TestRaggedDtype>
        <Function test_name>
        <Function test_kind>
        <Function test_construct_from_string_own_name>
        <Function test_is_dtype_from_name>
        <Function test_is_dtype_unboxes_dtype>
        <Function test_is_dtype_from_self>
        <Function test_is_not_string_type>
        <Function test_is_not_object_type>
        <Function test_eq_with_str>
        <Function test_eq_with_numpy_object>
        <Function test_eq_with_self>
        <Function test_array_type>
        <Function test_check_dtype>
        <Function test_hashable>
    <Class TestRaggedGetitem>
        <Function test_get>
        <Function test_take_sequence>
        <Function test_take>
        <Function test_iloc_series>
        <Function test_iloc_frame>
        <Function test_loc_series>
        <Function test_loc_frame>
        <Function test_getitem_scalar>
        <Function test_getitem_scalar_na>
        <Function test_getitem_mask>
        <Function test_getitem_slice>
        <Function test_take_empty>
        <Function test_take_negative>
        <Function test_take_non_na_fill_value>
        <Function test_take_pandas_style_negative_raises>
        <Function test_take_out_of_bounds_raises[True]>
        <Function test_take_out_of_bounds_raises[False]>
        <Function test_take_series>
        <Function test_reindex>
        <Function test_reindex_non_na_fill_value>
    <Class TestRaggedGroupby>
        <Function test_groupby_extension_apply[scalar]>
        <Function test_groupby_extension_apply[list]>
        <Function test_groupby_extension_apply[object]>
        <Function test_grouping_grouper>
        <Function test_groupby_extension_agg[True]>
        <Function test_groupby_extension_agg[False]>
        <Function test_groupby_extension_no_sort>
        <Function test_groupby_extension_transform>
        <Function test_in_numeric_groupby>
    <Class TestRaggedInterface>
        <Function test_array_interface>
        <Function test_len>
        <Function test_ndim>
        <Function test_can_hold_na_valid>
        <Function test_memory_usage>
        <Function test_is_extension_array_dtype>
        <Function test_no_values_attribute>
        <Function test_is_numeric_honored>
        <Function test_isna_extension_array>
    <Class TestRaggedMethods>
        <Function test_value_counts>
        <Function test_unique[<lambda>-Series]>
        <Function test_unique[<lambda>-<lambda>]>
        <Function test_unique[unique-Series]>
        <Function test_unique[unique-<lambda>]>
        <Function test_fillna_copy_frame>
        <Function test_fillna_copy_series>
        <Function test_combine_le>
        <Function test_combine_add>
        <Function test_combine_first>
        <Function test_count>
        <Function test_apply_simple_series>
        <Function test_argsort>
        <Function test_argsort_missing>
        <Function test_sort_values[True]>
        <Function test_sort_values[False]>
        <Function test_sort_values_missing[True]>
        <Function test_sort_values_missing[False]>
        <Function test_sort_values_frame[True]>
        <Function test_sort_values_frame[False]>
        <Function test_factorize[-1]>
        <Function test_factorize[-2]>
        <Function test_factorize_equivalence[-1]>
        <Function test_factorize_equivalence[-2]>
        <Function test_factorize_empty>
        <Function test_fillna_length_mismatch>
        <Function test_container_shift[-2-indices0-True]>
        <Function test_container_shift[-2-indices0-False]>
        <Function test_container_shift[0-indices1-True]>
        <Function test_container_shift[0-indices1-False]>
        <Function test_container_shift[2-indices2-True]>
        <Function test_container_shift[2-indices2-False]>
        <Function test_shift_non_empty_array[-4-indices0]>
        <Function test_shift_non_empty_array[-1-indices1]>
        <Function test_shift_non_empty_array[0-indices2]>
        <Function test_shift_non_empty_array[1-indices3]>
        <Function test_shift_non_empty_array[4-indices4]>
        <Function test_shift_empty_array[-4]>
        <Function test_shift_empty_array[-1]>
        <Function test_shift_empty_array[0]>
        <Function test_shift_empty_array[1]>
        <Function test_shift_empty_array[4]>
        <Function test_shift_fill_value>
        <Function test_hash_pandas_object_works[True]>
        <Function test_hash_pandas_object_works[False]>
        <Function test_searchsorted[True]>
        <Function test_searchsorted[False]>
        <Function test_where_series[True]>
        <Function test_where_series[False]>
        <Function test_repeat[0-True-True]>
        <Function test_repeat[0-True-False]>
        <Function test_repeat[0-False-True]>
        <Function test_repeat[0-False-False]>
        <Function test_repeat[1-True-True]>
        <Function test_repeat[1-True-False]>
        <Function test_repeat[1-False-True]>
        <Function test_repeat[1-False-False]>
        <Function test_repeat[2-True-True]>
        <Function test_repeat[2-True-False]>
        <Function test_repeat[2-False-True]>
        <Function test_repeat[2-False-False]>
        <Function test_repeat[repeats3-True-True]>
        <Function test_repeat[repeats3-True-False]>
        <Function test_repeat[repeats3-False-True]>
        <Function test_repeat[repeats3-False-False]>
        <Function test_repeat_raises[2-kwargs0-ValueError-'axis-True]>
        <Function test_repeat_raises[2-kwargs0-ValueError-'axis-False]>
        <Function test_repeat_raises[-1-kwargs1-ValueError-negative-True]>
        <Function test_repeat_raises[-1-kwargs1-ValueError-negative-False]>
        <Function test_repeat_raises[repeats2-kwargs2-ValueError-shape-True]>
        <Function test_repeat_raises[repeats2-kwargs2-ValueError-shape-False]>
        <Function test_repeat_raises[2-kwargs3-TypeError-'foo'-True]>
        <Function test_repeat_raises[2-kwargs3-TypeError-'foo'-False]>
    <Class TestRaggedPrinting>
        <Function test_array_repr[big]>
        <Function test_array_repr[small]>
        <Function test_array_repr_unicode>
        <Function test_series_repr>
        <Function test_dataframe_repr>
        <Function test_dtype_name_in_info>
    <Class TestRaggedMissing>
        <Function test_fillna_series>
        <Function test_fillna_frame>
        <Function test_isna>
        <Function test_dropna_array>
        <Function test_dropna_series>
        <Function test_dropna_frame>
        <Function test_fillna_scalar>
        <Function test_fillna_limit_pad>
        <Function test_fillna_limit_backfill>
        <Function test_fillna_series_method[ffill]>
        <Function test_fillna_series_method[bfill]>
        <Function test_fillna_fill_other>
    <Class TestRaggedReshaping>
        <Function test_concat[True]>
        <Function test_concat[False]>
        <Function test_concat_all_na_block[True]>
        <Function test_concat_all_na_block[False]>
        <Function test_concat_mixed_dtypes>
        <Function test_concat_columns>
        <Function test_align>
        <Function test_align_frame>
        <Function test_align_series_frame>
        <Function test_set_frame_expand_regular_with_extension>
        <Function test_set_frame_expand_extension_with_regular>
        <Function test_set_frame_overwrite_object>
        <Function test_merge>
        <Function test_merge_on_extension_array>
        <Function test_merge_on_extension_array_duplicates>
        <Function test_stack[columns0]>
        <Function test_stack[columns1]>
        <Function test_unstack[series-index0]>
        <Function test_unstack[series-index1]>
        <Function test_unstack[series-index2]>
        <Function test_unstack[series-index3]>
        <Function test_unstack[frame-index0]>
        <Function test_unstack[frame-index1]>
        <Function test_unstack[frame-index2]>
        <Function test_unstack[frame-index3]>
  <Module test_geo.py>
    <Function test_mean_transfer_function>
    <Function test_slope_transfer_function>
      Assert slope transfer function
    <Function test_aspect_transfer_function>
      Assert aspect transfer function
    <Function test_hillshade_simple_transfer_function>
      Assert Simple Hillshade transfer function
    <Function test_ndvi_transfer_function>
      Assert aspect transfer function
    <Function test_generate_terrain>
    <Function test_bump>
  <Module test_glyphs.py>
    <Function test_point_bounds_check>
    <Function test_point_validate>
    <Function test_draw_line>
    <Function test_draw_line_same_point>
    <Function test_draw_line_vertical_horizontal>
    <Function test_extend_lines>
    <Function test_extend_lines_all_out_of_bounds>
    <Function test_extend_lines_nan>
    <Function test_extend_lines_exact_bounds>
    <Function test_draw_triangle_nointerp>
      Assert that we draw triangles properly, without interpolation enabled.
    <Function test_draw_triangle_interp>
      Assert that we draw triangles properly, with interpolation enabled.
    <Function test_draw_triangle_subpixel>
      Assert that we draw subpixel triangles properly, both with and without
      interpolation.
    <Function test_line_awkward_point_on_upper_bound_maps_to_last_pixel>
      Check that point deliberately chosen to be on the upper bound but
      with a similar-magnitudes subtraction error like that which could
      occur in extend line does indeed get mapped to last pixel.
    <Function test_lines_xy_validate>
  <Module test_layout.py>
    <Function test_renamed_columns[random_layout-connect_edges]>
    <Function test_renamed_columns[random_layout-hammer_bundle]>
    <Function test_renamed_columns[circular_layout-connect_edges]>
    <Function test_renamed_columns[circular_layout-hammer_bundle]>
    <Function test_renamed_columns[forceatlas2_layout-connect_edges]>
    <Function test_renamed_columns[forceatlas2_layout-hammer_bundle]>
    <Function test_forceatlas2_positioned_nodes_with_unweighted_edges>
    <Function test_forceatlas2_positioned_nodes_with_weighted_edges>
    <Function test_forceatlas2_unpositioned_nodes_with_unweighted_edges>
    <Function test_forceatlas2_unpositioned_nodes_with_weighted_edges>
    <Function test_random_layout>
    <Function test_uniform_circular_layout>
    <Function test_random_circular_layout>
  <Module test_pandas.py>
    <Function test_count>
    <Function test_any>
    <Function test_sum>
    <Function test_min>
    <Function test_max>
    <Function test_mean>
    <Function test_var>
    <Function test_std>
    <Function test_count_cat>
    <Function test_multiple_aggregates>
    <Function test_auto_range_points>
    <Function test_uniform_points>
    <Function test_uniform_diagonal_points[0-9]>
    <Function test_uniform_diagonal_points[0-10]>
    <Function test_uniform_diagonal_points[0-99]>
    <Function test_uniform_diagonal_points[0-100]>
    <Function test_log_axis_points>
    <Function test_line>
    <Function test_points_on_edge>
    <Function test_lines_on_edge>
    <Function test_log_axis_line>
    <Function test_auto_range_line>
    <Function test_trimesh_no_double_edge>
      Assert that when two triangles share an edge that would normally get
      double-drawn, the edge is only drawn for the rightmost (or bottommost)
      triangle.
    <Function test_trimesh_interp>
      Assert that triangles are interpolated when vertex values are provided.
    <Function test_trimesh_simplex_weights>
      Assert that weighting the simplices works as expected.
    <Function test_trimesh_vertex_weights>
      Assert that weighting the vertices works as expected.
    <Function test_trimesh_winding_detect>
      Assert that CCW windings get converted to CW.
    <Function test_trimesh_mesharg>
      Assert that the ``mesh`` argument results in the same rasterization,
      despite the ``vertices`` and ``simplices`` arguments changing.
    <Function test_trimesh_agg_api>
      Assert that the trimesh aggregation API properly handles weights on the simplices.
    <Function test_bug_570>
    <Function test_line_manual_range[df0-x0-y0-1]>
    <Function test_line_manual_range[df1-x1-y1-1]>
    <Function test_line_manual_range[df2-x2-y2-1]>
    <Function test_line_manual_range[df3-x-y-0]>
    <Function test_line_manual_range[df4-x4-y4-0]>
    <Function test_line_manual_range[df5-x5-y0-0]>
    <Function test_line_manual_range[df6-x-y-1]>
    <Function test_line_autorange[df0-x0-y0-1]>
    <Function test_line_autorange[df1-x1-y1-1]>
    <Function test_line_autorange[df2-x-y-0]>
    <Function test_line_autorange[df3-x3-y3-0]>
    <Function test_line_autorange[df4-x4-y0-0]>
    <Function test_line_autorange[df5-x-y-1]>
    <Function test_line_autorange_axis1_x_constant>
    <Function test_line_agg_sum_axis1_none_constant>
    <Function test_line_autorange_axis1_ragged>
  <Module test_pipeline.py>
    <Function test_pipeline>
  <Module test_spatial.py>
    <Function test_spatial_points_frame_properties[False]>
    <Function test_spatial_points_frame_properties[True]>
    <Function test_query_partitions[False-x_range0-y_range0]>
    <Function test_query_partitions[False-x_range1-y_range1]>
    <Function test_query_partitions[False-x_range2-y_range2]>
    <Function test_query_partitions[True-x_range0-y_range0]>
    <Function test_query_partitions[True-x_range1-y_range1]>
    <Function test_query_partitions[True-x_range2-y_range2]>
    <Function test_aggregation_partitions[False-x_range0-y_range0]>
    <Function test_aggregation_partitions[False-x_range1-y_range1]>
    <Function test_aggregation_partitions[False-x_range2-y_range2]>
    <Function test_aggregation_partitions[True-x_range0-y_range0]>
    <Function test_aggregation_partitions[True-x_range1-y_range1]>
    <Function test_aggregation_partitions[True-x_range2-y_range2]>
    <Function test_validate_parquet_file>
  <Module test_tiles.py>
    <Function test_render_tiles>
    <Function test_get_super_tile_min_max>
    <Function test_calculate_zoom_level_stats_with_fullscan_ranging_strategy>
  <Module test_transfer_functions.py>
    <Function test_shade[None-a]>
    <Function test_shade[None-b]>
    <Function test_shade[None-c]>
    <Function test_shade[span1-a]>
    <Function test_shade[span1-b]>
    <Function test_shade[span1-c]>
    <Function test_shade[span2-a]>
    <Function test_shade[span2-b]>
    <Function test_shade[span2-c]>
    <Function test_span_cmap_list[linear-a]>
    <Function test_span_cmap_list[linear-b]>
    <Function test_span_cmap_list[linear-c]>
    <Function test_span_cmap_list[log-a]>
    <Function test_span_cmap_list[log-b]>
    <Function test_span_cmap_list[log-c]>
    <Function test_span_cmap_list[cbrt-a]>
    <Function test_span_cmap_list[cbrt-b]>
    <Function test_span_cmap_list[cbrt-c]>
    <Function test_span_cmap_single[black]>
    <Function test_span_cmap_single[cmap1]>
    <Function test_span_cmap_single[#000000]>
    <Function test_span_cmap_mpl>
    <Function test_shade_bool>
    <Function test_shade_cmap>
    <Function test_shade_cmap_non_categorical_alpha[black]>
    <Function test_shade_cmap_non_categorical_alpha[cmap1]>
    <Function test_shade_cmap_non_categorical_alpha[#000000]>
    <Function test_shade_cmap_errors>
    <Function test_shade_mpl_cmap>
    <Function test_shade_category>
    <Function test_set_background>
    <Function test_stack>
    <Function test_masks>
    <Function test_spread>
    <Function test_density>
    <Function test_dynspread>
    <Function test_eq_hist>
    <Function test_Image_to_pil>
    <Function test_Image_to_bytesio>
    <Function test_shade_should_handle_zeros_array>
  <Module test_utils.py>
    <Function test_Dispatcher>
    <Function test_isreal>
  <Module test_xarray.py>
    <Function test_count[source0]>
    <Function test_count[source1]>
    <Function test_count[source2]>
    <Function test_count[source3]>
<Module datashader/tests/benchmarks/test_bundling.py>
  <Function test_bundle[random_layout-connect_edges]>
  <Function test_bundle[random_layout-hammer_bundle]>
  <Function test_bundle[circular_layout-connect_edges]>
  <Function test_bundle[circular_layout-hammer_bundle]>
  <Function test_bundle[forceatlas2_layout-connect_edges]>
  <Function test_bundle[forceatlas2_layout-hammer_bundle]>
<Module datashader/tests/benchmarks/test_canvas.py>
  <Function test_line>
  <Function test_points>
<Module datashader/tests/benchmarks/test_draw_line.py>
  <Function test_draw_line_left_border>
  <Function test_draw_line_diagonal>
  <Function test_draw_line_offset>
<Module datashader/tests/benchmarks/test_extend_line.py>
  <Function test_extend_line_uniform[0-0]>
  <Function test_extend_line_uniform[0-100000]>
  <Function test_extend_line_uniform[-100000-0]>
  <Function test_extend_line_uniform[-100000-100000]>
  <Function test_extend_line_normal>
<Module datashader/tests/benchmarks/test_layout.py>
  <Function test_layout[random_layout]>
  <Function test_layout[circular_layout]>
  <Function test_layout[forceatlas2_layout]>

==================== 5 skipped, 16 warnings in 4.73 seconds ====================

ivirshup avatar Mar 13 '19 03:03 ivirshup

I did:

conda create -n datashader -c pyviz/label/dev datashader
conda activate datashader
pip install -e .[tests]

I was getting 12 skips from having a broken version of skimage:

>>> import skimage
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jsignell/conda/envs/ds-14/lib/python3.7/site-packages/skimage/__init__.py", line 167, in <module>
    from .util.dtype import (img_as_float32,
  File "/Users/jsignell/conda/envs/ds-14/lib/python3.7/site-packages/skimage/util/__init__.py", line 8, in <module>
    from .arraycrop import crop
  File "/Users/jsignell/conda/envs/ds-14/lib/python3.7/site-packages/skimage/util/arraycrop.py", line 8, in <module>
    from numpy.lib.arraypad import _validate_lengths
ImportError: cannot import name '_validate_lengths' from 'numpy.lib.arraypad' (/Users/jsignell/conda/envs/ds-14/lib/python3.7/site-packages/numpy/lib/arraypad.py)

I upgraded scikit-image to 0.14.2 from conda-forge (conda install -c conda-forge scikit-image=0.14.2) and got 5 skips. Then I got rasterio and am down to 3 skips in collection - but that's when I saw failures crop up:

datashader/tests/test_raster.py::test_raster_aggregate_default FAILED                                                                                                                                              
datashader/tests/test_raster.py::test_raster_aggregate_nearest FAILED                                                                                                                                               
datashader/tests/test_raster.py::test_partial_extent_returns_correct_size FAILED
datashader/tests/test_raster.py::test_raster_single_pixel_range_with_padding FAILED

jsignell avatar Mar 13 '19 14:03 jsignell

Just an aside: I see above in a few places using pip install -e . in conda environments. Maybe that's ok now with the latest conda, or if you know what you're doing, but I always avoided it because it installs any dependencies not already present using pip, which can be confusing and/or problematic in a conda environment. When I used conda, I always did pip install -e . --no-deps. pip install -e . --no-deps into a conda environment is still not perfect, because e.g. things like entry points will then be done by setuptools rather than by conda.

(python setup.py develop may be worse still depending on what you want, because missing dependencies will be installed with easy_install, you won't be using wheels, and so on...)

ceball avatar Mar 14 '19 08:03 ceball

can be confusing and/or problematic in a conda environment

Right; I always conda-install the released package first, then run pip install --no-deps -e ., which uses conda to install the dependencies then sets up the github master as the actual module in use. Of course, that will go wrong if dependencies are different in master than they are in the latest release, but I don't know of any solution that is any better in that respect.

jbednar avatar Apr 01 '19 19:04 jbednar

The examples/environment.yml file is indeed somewhat out of date. Rather than update it, I am inclined to remove it and change the developer install instructions in the README to use pyctdev as we do in our CI. Then the two setup files remain the single source of dependency information for both pip and conda installs. It will be a little confusing for new developers who are not familiar with pyctdev, but if the instructions are followed precisely we can guarantee that the install will work as we use the same workflow in our CI.

ianthomas23 avatar Aug 03 '22 16:08 ianthomas23

Does pyctdev do better than the conda + pip -e solution?

jbednar avatar Aug 04 '22 05:08 jbednar

Does pyctdev do better than the conda + pip -e solution?

It is not intrinsically any better, but in practice it is better because it uses the setup files to obtain the list of dependencies and they are always up to date. conda install uses the environment.yml file which is not necessary in sync with the setup files because neither developers nor CI use this approach.

ianthomas23 avatar Aug 04 '22 09:08 ianthomas23

Sorry. I didn't mean conda+environment.yml + pip -e, I meant just conda install -c pyviz datashader to get the latest released datashader, followed by pip install --no-deps -e . in the git repo clone. That's what I always do, and it's been reliable so far despite @ceball's fearmongering above. :-) I do think we should delete the outdated environment.yml file, since there's no automatic mechanism to keep it up to date, and I don't want to start a project to make it be auto-generated to be accurate.

It's true that my method won't always install the latest dependencies, if those have been updated in git master but not yet released, but I haven't noticed that to be a problem in practice. We rarely add new dependencies, and when we do they are typically for specific examples, not the core library itself. We can of course tell people to use pyctdev like the CI does to avoid that problem, but my question is whether using pyctdev provides benefits that are worth the extra cognitive load of learning about it. I'm not sure it does, but am open to learning about some benefit it provides for a developer that is worthwhile.

jbednar avatar Aug 04 '22 14:08 jbednar

I understand now!

I think your approach is absolutely fine now. My default approach is even simpler, just a pip install -e .[tests,examples] in a clean virtual environment, which is fine on Linux but may be less so on other platforms.

OK, so plan A is to remove the environment.yml file and not mention pyctdev any more than we already do. I'll write a PR to do this and update the README with the preferred dev installation process, but before that I will check exactly what does work on the 3 major platforms.

ianthomas23 avatar Aug 04 '22 14:08 ianthomas23