diff --git a/.github/workflows/pages.yaml b/.github/workflows/pages.yaml
index 26523822ae..d24e965e42 100644
--- a/.github/workflows/pages.yaml
+++ b/.github/workflows/pages.yaml
@@ -35,7 +35,7 @@ jobs:
run: |
python -m pip install --upgrade pip
python -m pip install poetry --user
- python -m poetry install --only=docs,main
+ python -m poetry install --all-extras --only=docs,main
- name: "Build documentation with Sphinx"
run: |
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
index 8cc32bd066..37c77e41be 100644
--- a/.readthedocs.yaml
+++ b/.readthedocs.yaml
@@ -21,7 +21,7 @@ build:
commands:
- "mamba env create --file conda-environment-dev.yml --force"
- - "mamba run --name mxcubecore poetry install --only=docs,main"
+ - "mamba run --name mxcubecore poetry install --all-extras --only=docs,main"
- "mamba run --name mxcubecore sphinx-build -T -E -b html -c ./docs/ ./docs/source/ ${READTHEDOCS_OUTPUT}/html/"
diff --git a/poetry.lock b/poetry.lock
index 4fb685d2ab..048bee06aa 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
[[package]]
name = "alabaster"
@@ -27,6 +27,35 @@ lazy-object-proxy = ">=1.4.0"
typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""}
wrapt = {version = ">=1.11,<2", markers = "python_version < \"3.11\""}
+[[package]]
+name = "asttokens"
+version = "2.4.1"
+description = "Annotate AST trees with source code positions"
+optional = true
+python-versions = "*"
+files = [
+ {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"},
+ {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"},
+]
+
+[package.dependencies]
+six = ">=1.12.0"
+
+[package.extras]
+astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
+test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
+
+[[package]]
+name = "async-timeout"
+version = "4.0.3"
+description = "Timeout context manager for asyncio programs"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"},
+ {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"},
+]
+
[[package]]
name = "attrs"
version = "23.1.0"
@@ -259,6 +288,20 @@ files = [
{file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"},
]
+[[package]]
+name = "click"
+version = "8.1.7"
+description = "Composable command line interface toolkit"
+optional = true
+python-versions = ">=3.7"
+files = [
+ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
+ {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -421,6 +464,22 @@ files = [
{file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"},
]
+[[package]]
+name = "devtools"
+version = "0.12.2"
+description = "Python's missing debug print command, and more."
+optional = true
+python-versions = ">=3.7"
+files = [
+ {file = "devtools-0.12.2-py3-none-any.whl", hash = "sha256:c366e3de1df4cdd635f1ad8cbcd3af01a384d7abda71900e68d43b04eb6aaca7"},
+ {file = "devtools-0.12.2.tar.gz", hash = "sha256:efceab184cb35e3a11fa8e602cc4fadacaa2e859e920fc6f87bf130b69885507"},
+]
+
+[package.dependencies]
+asttokens = ">=2.0.0,<3.0.0"
+executing = ">=1.1.1"
+pygments = ">=2.15.0"
+
[[package]]
name = "dill"
version = "0.3.6"
@@ -471,6 +530,20 @@ files = [
[package.extras]
test = ["pytest (>=6)"]
+[[package]]
+name = "executing"
+version = "2.0.1"
+description = "Get the currently executing AST node of a frame, and other information"
+optional = true
+python-versions = ">=3.5"
+files = [
+ {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"},
+ {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"},
+]
+
+[package.extras]
+tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
+
[[package]]
name = "f90nml"
version = "1.4.3"
@@ -1496,6 +1569,27 @@ files = [
docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
+[[package]]
+name = "pint"
+version = "0.21.1"
+description = "Physical quantities module"
+optional = true
+python-versions = ">=3.8"
+files = [
+ {file = "Pint-0.21.1-py3-none-any.whl", hash = "sha256:230ebccc312693117ee925c6492b3631c772ae9f7851a4e86080a15e7be692d8"},
+ {file = "Pint-0.21.1.tar.gz", hash = "sha256:5d5b6b518d0c5a7ab03a776175db500f1ed1523ee75fb7fafe38af8149431c8d"},
+]
+
+[package.extras]
+babel = ["babel (<=2.8)"]
+dask = ["dask"]
+mip = ["mip (>=1.13)"]
+numpy = ["numpy (>=1.19.5)"]
+pandas = ["pint-pandas (>=0.3)"]
+test = ["pytest", "pytest-cov", "pytest-mpl", "pytest-subtests"]
+uncertainties = ["uncertainties (>=3.1.6)"]
+xarray = ["xarray"]
+
[[package]]
name = "pkgutil-resolve-name"
version = "1.3.10"
@@ -1694,6 +1788,27 @@ files = [
[package.extras]
dev = ["tox"]
+[[package]]
+name = "pyepics"
+version = "3.5.2"
+description = "Epics Channel Access for Python"
+optional = true
+python-versions = ">=3.7"
+files = [
+ {file = "pyepics-3.5.2-py3-none-any.whl", hash = "sha256:f1425d31935ad176f6c6db0726f6d7dc3e9632c07a62a803a21a710978ba9f45"},
+ {file = "pyepics-3.5.2.tar.gz", hash = "sha256:9680af5970c3f4714dd97d33fe13a833d79ae370f69f774889df51c0e4790187"},
+]
+
+[package.dependencies]
+numpy = "*"
+pyparsing = "*"
+setuptools = "*"
+
+[package.extras]
+all = ["Sphinx", "coverage", "pytest", "pytest-cov"]
+doc = ["Sphinx"]
+test = ["coverage", "pytest", "pytest-cov"]
+
[[package]]
name = "pygments"
version = "2.16.1"
@@ -1734,6 +1849,20 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""
spelling = ["pyenchant (>=3.2,<4.0)"]
testutils = ["gitpython (>3)"]
+[[package]]
+name = "pymba"
+version = "0.3.7"
+description = "Pymba is a Python wrapper for Allied Vision's Vimba C API."
+optional = true
+python-versions = "*"
+files = [
+ {file = "pymba-0.3.7-py3-none-any.whl", hash = "sha256:347162606cfa0f8c089ca1e50d8fc06264f9236c5e6e36b208d2eb70e490553d"},
+ {file = "pymba-0.3.7.tar.gz", hash = "sha256:cce5265c204988de6e0383724cd49ffa1a9765d0b9cceee382cbf5e5fa94a311"},
+]
+
+[package.dependencies]
+numpy = "*"
+
[[package]]
name = "pyparsing"
version = "3.0.9"
@@ -1984,6 +2113,24 @@ files = [
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
]
+[[package]]
+name = "redis"
+version = "4.6.0"
+description = "Python client for Redis database and key-value store"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"},
+ {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"},
+]
+
+[package.dependencies]
+async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""}
+
+[package.extras]
+hiredis = ["hiredis (>=1.0.0)"]
+ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"]
+
[[package]]
name = "requests"
version = "2.31.0"
@@ -2069,6 +2216,29 @@ files = [
{file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"},
]
+[[package]]
+name = "sardana"
+version = "3.4.3"
+description = "instrument control and data acquisition system"
+optional = true
+python-versions = "*"
+files = [
+ {file = "sardana-3.4.3-py3-none-any.whl", hash = "sha256:f4eb35e029dbd9e9335ad8ce36652486110693ce73dd4fe7a909f235ced7c492"},
+ {file = "sardana-3.4.3.tar.gz", hash = "sha256:3ea6d13ca8c642bafa602c61a018ea52ac1c826a3c4f54e420eeada24d274704"},
+]
+
+[package.dependencies]
+click = "*"
+lxml = ">=2.3"
+PyTango = ">=9.2.5"
+taurus = ">=5.0.0"
+
+[package.extras]
+all = ["PyYAML", "dsconfig (>=1.6.7)", "itango (>=0.1.6)", "jsonpatch", "pydantic (<2.0)", "ruamel.yaml", "taurus[taurus-qt]"]
+config = ["PyYAML", "dsconfig (>=1.6.7)", "jsonpatch", "pydantic (<2.0)", "ruamel.yaml"]
+qt = ["taurus[taurus-qt]"]
+spock = ["itango (>=0.1.6)"]
+
[[package]]
name = "scipy"
version = "1.10.1"
@@ -2156,6 +2326,21 @@ files = [
{file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"},
]
+[[package]]
+name = "SpecClient"
+version = "1.0"
+description = "Python package for communicating with spec"
+optional = true
+python-versions = "*"
+files = []
+develop = false
+
+[package.source]
+type = "git"
+url = "https://github.com/mxcube/specclient.git"
+reference = "HEAD"
+resolved_reference = "767b0d3910a26905c30c413b101fcb886b29ae50"
+
[[package]]
name = "sphinx"
version = "7.1.2"
@@ -2308,6 +2493,30 @@ files = [
{file = "suds_py3-1.4.5.0-py3-none-any.whl", hash = "sha256:0915a7f825c80fa2f0593e040e046bcbc156dd24ba988bb9da6c6604d70155b9"},
]
+[[package]]
+name = "taurus"
+version = "5.1.8"
+description = "A framework for scientific/industrial CLIs and GUIs"
+optional = true
+python-versions = ">=3.5"
+files = [
+ {file = "taurus-5.1.8-py3-none-any.whl", hash = "sha256:26fdaf88a7ada3c3ce26ca8f0685aa1527bc70eab7a7545e71e4b3f727a77735"},
+ {file = "taurus-5.1.8.tar.gz", hash = "sha256:6a9f7bbb785e7d00e0d4d463810a4da1ff9648fafa443c9306f7057c86c95c90"},
+]
+
+[package.dependencies]
+click = "*"
+numpy = ">=1.1"
+packaging = "*"
+pint = ">=0.8"
+
+[package.extras]
+taurus-epics = ["pyepics (>=3.2.4)"]
+taurus-h5file = ["h5file"]
+taurus-qt = ["guiqwt (>=3)", "lxml (>=2.1)", "ply (>=2.3)"]
+taurus-qt-editor = ["spyder (>=3)"]
+taurus-tango = ["PyTango (>=7.1)"]
+
[[package]]
name = "tomli"
version = "2.0.1"
@@ -2357,6 +2566,17 @@ brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+[[package]]
+name = "vapory"
+version = "0.1.2"
+description = "3D rendering with Python and POV-Ray"
+optional = true
+python-versions = "*"
+files = [
+ {file = "Vapory-0.1.2-py3-none-any.whl", hash = "sha256:58e4c09f6ab689e812cdf57e5a46056c8fb466af6d95395e9ffc565ac17806c5"},
+ {file = "Vapory-0.1.2.tar.gz", hash = "sha256:e0213caaac5cbb1d336ef7455a18e7ffcc8b864093040958ef45bddac8204231"},
+]
+
[[package]]
name = "virtualenv"
version = "20.21.1"
@@ -2542,9 +2762,17 @@ test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
[extras]
-tango = ["PyTango"]
+alba = ["sardana"]
+bessy = ["specclient"]
+desy = ["pymba"]
+embl = ["pymba", "vapory"]
+epics = ["pyepics"]
+esrf = ["devtools"]
+maxiv = ["PyTango", "sardana"]
+soleil = ["vapory"]
+tango = ["PyTango", "sardana"]
[metadata]
lock-version = "2.0"
python-versions = ">=3.8,<3.11"
-content-hash = "32153909850af238b4a54263fc6be10c05e73fa25c3129cb264468100bce86f9"
+content-hash = "a34d5641e8e89b5b59c415c1073eb148abdec3df644ec971a20c9dfbc2ffae21"
diff --git a/pyproject.toml b/pyproject.toml
index 90bf8176f4..35eab2c401 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -25,8 +25,18 @@ classifiers = [
[tool.poetry.dependencies]
python = ">=3.8,<3.11"
+
+#bliss = { version = "*", optional = true, python = "<3.10" }
+devtools = { version = "^0.12.2", optional = true }
+pyepics = {version = "^3.5.2", optional = true}
+pymba = {version = "^0.3.7", optional = true}
+redis = "^4.3.5"
+sardana = { version = "^3.4.3", optional = true }
+# This version of specclient does not import correctly, so: pointless to have it here (?)
+specclient = {git = "https://github.com/mxcube/specclient.git", optional = true}
typing-extensions = "^4.3.0"
tomli = { version = "^2.0.1", python = "<=3.10" }
+vapory = { version = "^0.1.2", optional = true }
gevent = "^21.12.0"
greenlet = "^1.1.3"
jsonpickle = "^2.2.0"
@@ -63,7 +73,47 @@ sphinx = "<7.2"
furo = "^2023.9.10"
[tool.poetry.extras]
-tango = ["PyTango"]
+# Still missing:
+# bliss
+# grob
+# qt Which binding?
+# tine
+# v4l2
+
+#bliss = ["bliss"]
+epics = ["pyepics"]
+tango = ["pytango", "sardana"]
+
+alba = [
+ "sardana",
+]
+bessy = [
+ #"grob",
+ "specclient",
+ #"tine",
+]
+desy = [
+ "pymba",
+ #"tine",
+]
+embl = [
+ "pymba",
+ "vapory",
+ #"tine",
+]
+esrf = [
+ #"bliss",
+ "devtools",
+ #"lima2",
+]
+maxiv = [
+ "pytango",
+ "sardana",
+]
+soleil = [
+ "vapory",
+]
+
[tool.autoflake]
#