Open tcassar opened 1 month ago
Sounds good, @tcassar . I guess most of the tests don't need graphviz, though?
Can you point me at the tests that need it?
Another viable option might be to create a decorator which checks if a particular package is installed. There are some versions of this available online, my personal favourite is source :
def has_package(package: str) -> bool:
r"""Returns :obj:`True` in case :obj:`package` is installed."""
if '|' in package:
return any(has_package(p) for p in package.split('|'))
req = Requirement(package)
if find_spec(req.name) is None:
return False
module = import_module(req.name)
if not hasattr(module, '__version__'):
return True
version = module.__version__
# `req.specifier` does not support `.dev` suffixes, e.g., for
# `pyg_lib==0.1.0.dev*`, so we manually drop them:
if '.dev' in version:
version = '.'.join(version.split('.dev')[:-1])
return version in req.specifier
def withPackage(*args: str) -> Callable:
r"""A decorator to skip tests if certain packages are not installed.
Also supports version specification.
"""
na_packages = set(package for package in args if not has_package(package))
if len(na_packages) == 1:
reason = f"Package {list(na_packages)[0]} not found"
else:
reason = f"Packages {na_packages} not found"
def decorator(func: Callable) -> Callable:
import pytest
return pytest.mark.skipif(len(na_packages) > 0, reason=reason)(func)
return decorator
Thanks @SauravMaheshkar - this is an interesting approach that we can keep in mind for the future, once we have dealt with some of the bigger problems.
In checking over the PR ( #13 ) I realised we had some of our commit visualisation code packaged along with robota-core, and that was why graphviz was needed. We should look at whether this is the best place for this code at some point, but in terms of this issue, I now at least understand why it needs to be installed.
Running tests causes three skips if
graphviz
is not installed. To circumvent these problems, containerising the application with Docker would be useful and so I shall do it.