bec-server 2.4.2__tar.gz → 2.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bec_server-2.5.0/.gitignore +180 -0
- bec_server-2.5.0/PKG-INFO +33 -0
- bec_server-2.5.0/pyproject.toml +63 -0
- bec_server-2.5.0/tests/tests_bec_server_utils/test_main.py +68 -0
- bec_server-2.5.0/tests/tests_bec_server_utils/test_service_handler.py +64 -0
- bec_server-2.5.0/tests/tests_bec_server_utils/test_tmux_launch.py +47 -0
- bec_server-2.5.0/tests/tests_data_processing/conftest.py +12 -0
- bec_server-2.5.0/tests/tests_data_processing/test_dap_cli_launch.py +40 -0
- bec_server-2.5.0/tests/tests_data_processing/test_dap_server.py +13 -0
- bec_server-2.5.0/tests/tests_data_processing/test_dap_service_manager.py +115 -0
- bec_server-2.5.0/tests/tests_data_processing/test_lmfit1d_service.py +164 -0
- bec_server-2.5.0/tests/tests_device_server/conftest.py +24 -0
- bec_server-2.5.0/tests/tests_device_server/test_config_handler.py +109 -0
- bec_server-2.5.0/tests/tests_device_server/test_device_manager_ds.py +174 -0
- bec_server-2.5.0/tests/tests_device_server/test_device_serializer.py +45 -0
- bec_server-2.5.0/tests/tests_device_server/test_device_server.py +814 -0
- bec_server-2.5.0/tests/tests_device_server/test_device_server_cli_launch.py +32 -0
- bec_server-2.5.0/tests/tests_device_server/test_rpc_mixin.py +255 -0
- bec_server-2.5.0/tests/tests_file_writer/conftest.py +12 -0
- bec_server-2.5.0/tests/tests_file_writer/test_file_writer.py +165 -0
- bec_server-2.5.0/tests/tests_file_writer/test_file_writer_cli_launch.py +32 -0
- bec_server-2.5.0/tests/tests_file_writer/test_file_writer_manager.py +284 -0
- bec_server-2.5.0/tests/tests_scan_bundler/conftest.py +51 -0
- bec_server-2.5.0/tests/tests_scan_bundler/test_bec_emitter.py +65 -0
- bec_server-2.5.0/tests/tests_scan_bundler/test_bluesky_emitter.py +78 -0
- bec_server-2.5.0/tests/tests_scan_bundler/test_emitter.py +104 -0
- bec_server-2.5.0/tests/tests_scan_bundler/test_scan_bundler.py +664 -0
- bec_server-2.5.0/tests/tests_scan_bundler/test_scan_bundler_cli_launch.py +32 -0
- bec_server-2.5.0/tests/tests_scan_server/conftest.py +12 -0
- bec_server-2.5.0/tests/tests_scan_server/test_flomni_fermat_scan.py +61 -0
- bec_server-2.5.0/tests/tests_scan_server/test_path_optimization.py +230 -0
- bec_server-2.5.0/tests/tests_scan_server/test_scan_guard.py +307 -0
- bec_server-2.5.0/tests/tests_scan_server/test_scan_server_cli_launch.py +32 -0
- bec_server-2.5.0/tests/tests_scan_server/test_scan_server_queue.py +696 -0
- bec_server-2.5.0/tests/tests_scan_server/test_scan_stubs.py +123 -0
- bec_server-2.5.0/tests/tests_scan_server/test_scan_worker.py +1520 -0
- bec_server-2.5.0/tests/tests_scan_server/test_scans.py +2703 -0
- bec_server-2.5.0/tests/tests_scan_server/utils.py +118 -0
- bec_server-2.5.0/tests/tests_scihub/conftest.py +12 -0
- bec_server-2.5.0/tests/tests_scihub/test_repeated_timer.py +32 -0
- bec_server-2.5.0/tests/tests_scihub/test_scibec_config_handler.py +352 -0
- bec_server-2.5.0/tests/tests_scihub/test_scibec_connector.py +151 -0
- bec_server-2.5.0/tests/tests_scihub/test_scibec_metadata_handler.py +213 -0
- bec_server-2.5.0/tests/tests_scihub/test_scihub_cli_launch.py +32 -0
- bec_server-2.5.0/tests/tests_scihub/test_scilog_connector.py +40 -0
- bec-server-2.4.2/PKG-INFO +0 -12
- bec-server-2.4.2/bec_server.egg-info/PKG-INFO +0 -12
- bec-server-2.4.2/bec_server.egg-info/SOURCES.txt +0 -78
- bec-server-2.4.2/bec_server.egg-info/dependency_links.txt +0 -1
- bec-server-2.4.2/bec_server.egg-info/entry_points.txt +0 -8
- bec-server-2.4.2/bec_server.egg-info/requires.txt +0 -24
- bec-server-2.4.2/bec_server.egg-info/top_level.txt +0 -1
- bec-server-2.4.2/setup.cfg +0 -26
- bec-server-2.4.2/setup.py +0 -52
- {bec-server-2.4.2 → bec_server-2.5.0}/README.md +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/launch.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/service_handler.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/subprocess_launch.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/tmux_launch.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/cli/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/cli/launch.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/dap_server.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/dap_service.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/dap_service_manager.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/lmfit1d_service.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/cli/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/cli/launch.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/device_server.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/devices/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/devices/config_update_handler.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/devices/device_serializer.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/devices/devicemanager.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/rpc_mixin.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/cli/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/cli/launch.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/file_writer.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/file_writer_manager.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/merged_dicts.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer_plugins/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer_plugins/cSAXS.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer_plugins/default_writer.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/bec_emitter.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/bluesky_emitter.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/cli/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/cli/launch.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/emitter.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/scan_bundler.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/cli/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/cli/launch.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/device_validation.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/errors.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/path_optimization.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_assembler.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_guard.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_manager.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/LamNIFermatScan.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/flomni_fermat_scan.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/otf_scan.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/owis_grid.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/sgalil_grid.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_queue.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_server.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_stubs.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_worker.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scans.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/cli/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/cli/launch.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/repeated_timer.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scibec/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scibec/config_handler.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scibec/scibec_connector.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scibec/scibec_metadata_handler.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scihub.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scilog/__init__.py +0 -0
- {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scilog/scilog.py +0 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
**/*_venv
|
|
2
|
+
**/.idea
|
|
3
|
+
*.log
|
|
4
|
+
**/__pycache__
|
|
5
|
+
**/.DS_Store
|
|
6
|
+
**/out
|
|
7
|
+
**/.vscode
|
|
8
|
+
**/.pytest_cache
|
|
9
|
+
**/*.egg*
|
|
10
|
+
|
|
11
|
+
# recovery_config files
|
|
12
|
+
recovery_config_*
|
|
13
|
+
|
|
14
|
+
# file writer data
|
|
15
|
+
**.h5
|
|
16
|
+
|
|
17
|
+
# Byte-compiled / optimized / DLL files
|
|
18
|
+
__pycache__/
|
|
19
|
+
*.py[cod]
|
|
20
|
+
*$py.class
|
|
21
|
+
|
|
22
|
+
# C extensions
|
|
23
|
+
*.so
|
|
24
|
+
|
|
25
|
+
# Distribution / packaging
|
|
26
|
+
.Python
|
|
27
|
+
build/
|
|
28
|
+
develop-eggs/
|
|
29
|
+
dist/
|
|
30
|
+
downloads/
|
|
31
|
+
eggs/
|
|
32
|
+
.eggs/
|
|
33
|
+
lib/
|
|
34
|
+
lib64/
|
|
35
|
+
parts/
|
|
36
|
+
sdist/
|
|
37
|
+
var/
|
|
38
|
+
wheels/
|
|
39
|
+
share/python-wheels/
|
|
40
|
+
*.egg-info/
|
|
41
|
+
.installed.cfg
|
|
42
|
+
*.egg
|
|
43
|
+
MANIFEST
|
|
44
|
+
|
|
45
|
+
# PyInstaller
|
|
46
|
+
# Usually these files are written by a python script from a template
|
|
47
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
48
|
+
*.manifest
|
|
49
|
+
*.spec
|
|
50
|
+
|
|
51
|
+
# Installer logs
|
|
52
|
+
pip-log.txt
|
|
53
|
+
pip-delete-this-directory.txt
|
|
54
|
+
|
|
55
|
+
# Unit test / coverage reports
|
|
56
|
+
htmlcov/
|
|
57
|
+
.tox/
|
|
58
|
+
.nox/
|
|
59
|
+
.coverage
|
|
60
|
+
.coverage.*
|
|
61
|
+
.cache
|
|
62
|
+
nosetests.xml
|
|
63
|
+
coverage.xml
|
|
64
|
+
*.cover
|
|
65
|
+
*.py,cover
|
|
66
|
+
.hypothesis/
|
|
67
|
+
.pytest_cache/
|
|
68
|
+
cover/
|
|
69
|
+
|
|
70
|
+
# Translations
|
|
71
|
+
*.mo
|
|
72
|
+
*.pot
|
|
73
|
+
|
|
74
|
+
# Django stuff:
|
|
75
|
+
*.log
|
|
76
|
+
local_settings.py
|
|
77
|
+
db.sqlite3
|
|
78
|
+
db.sqlite3-journal
|
|
79
|
+
|
|
80
|
+
# Flask stuff:
|
|
81
|
+
instance/
|
|
82
|
+
.webassets-cache
|
|
83
|
+
|
|
84
|
+
# Scrapy stuff:
|
|
85
|
+
.scrapy
|
|
86
|
+
|
|
87
|
+
# Sphinx documentation
|
|
88
|
+
docs/**/_build/
|
|
89
|
+
docs/**/autodoc/
|
|
90
|
+
docs/**/_autosummary/
|
|
91
|
+
|
|
92
|
+
# PyBuilder
|
|
93
|
+
.pybuilder/
|
|
94
|
+
target/
|
|
95
|
+
|
|
96
|
+
# Jupyter Notebook
|
|
97
|
+
.ipynb_checkpoints
|
|
98
|
+
|
|
99
|
+
# IPython
|
|
100
|
+
profile_default/
|
|
101
|
+
ipython_config.py
|
|
102
|
+
|
|
103
|
+
**.prof
|
|
104
|
+
|
|
105
|
+
# pyenv
|
|
106
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
107
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
108
|
+
# .python-version
|
|
109
|
+
|
|
110
|
+
# pipenv
|
|
111
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
112
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
113
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
114
|
+
# install all needed dependencies.
|
|
115
|
+
#Pipfile.lock
|
|
116
|
+
|
|
117
|
+
# poetry
|
|
118
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
119
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
120
|
+
# commonly ignored for libraries.
|
|
121
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
122
|
+
#poetry.lock
|
|
123
|
+
|
|
124
|
+
# pdm
|
|
125
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
126
|
+
#pdm.lock
|
|
127
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
128
|
+
# in version control.
|
|
129
|
+
# https://pdm.fming.dev/#use-with-ide
|
|
130
|
+
.pdm.toml
|
|
131
|
+
|
|
132
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
133
|
+
__pypackages__/
|
|
134
|
+
|
|
135
|
+
# Celery stuff
|
|
136
|
+
celerybeat-schedule
|
|
137
|
+
celerybeat.pid
|
|
138
|
+
|
|
139
|
+
# SageMath parsed files
|
|
140
|
+
*.sage.py
|
|
141
|
+
|
|
142
|
+
# Environments
|
|
143
|
+
.env
|
|
144
|
+
.venv
|
|
145
|
+
env/
|
|
146
|
+
venv/
|
|
147
|
+
ENV/
|
|
148
|
+
env.bak/
|
|
149
|
+
venv.bak/
|
|
150
|
+
|
|
151
|
+
# Spyder project settings
|
|
152
|
+
.spyderproject
|
|
153
|
+
.spyproject
|
|
154
|
+
|
|
155
|
+
# Rope project settings
|
|
156
|
+
.ropeproject
|
|
157
|
+
|
|
158
|
+
# mkdocs documentation
|
|
159
|
+
/site
|
|
160
|
+
|
|
161
|
+
# mypy
|
|
162
|
+
.mypy_cache/
|
|
163
|
+
.dmypy.json
|
|
164
|
+
dmypy.json
|
|
165
|
+
|
|
166
|
+
# Pyre type checker
|
|
167
|
+
.pyre/
|
|
168
|
+
|
|
169
|
+
# pytype static type analyzer
|
|
170
|
+
.pytype/
|
|
171
|
+
|
|
172
|
+
# Cython debug symbols
|
|
173
|
+
cython_debug/
|
|
174
|
+
|
|
175
|
+
# PyCharm
|
|
176
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
177
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
178
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
179
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
180
|
+
#.idea/
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: bec-server
|
|
3
|
+
Version: 2.5.0
|
|
4
|
+
Summary: BEC server
|
|
5
|
+
Project-URL: Bug Tracker, https://gitlab.psi.ch/bec/bec/issues
|
|
6
|
+
Project-URL: Homepage, https://gitlab.psi.ch/bec/bec
|
|
7
|
+
Classifier: Development Status :: 3 - Alpha
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Topic :: Scientific/Engineering
|
|
10
|
+
Requires-Python: >=3.10
|
|
11
|
+
Requires-Dist: bec-lib
|
|
12
|
+
Requires-Dist: cytoolz
|
|
13
|
+
Requires-Dist: h5py
|
|
14
|
+
Requires-Dist: libtmux
|
|
15
|
+
Requires-Dist: lmfit
|
|
16
|
+
Requires-Dist: msgpack
|
|
17
|
+
Requires-Dist: numpy
|
|
18
|
+
Requires-Dist: ophyd
|
|
19
|
+
Requires-Dist: ophyd-devices
|
|
20
|
+
Requires-Dist: py-scibec
|
|
21
|
+
Requires-Dist: pydantic
|
|
22
|
+
Requires-Dist: python-dotenv
|
|
23
|
+
Requires-Dist: pyyaml
|
|
24
|
+
Requires-Dist: rich
|
|
25
|
+
Requires-Dist: xmltodict
|
|
26
|
+
Provides-Extra: dev
|
|
27
|
+
Requires-Dist: black; extra == 'dev'
|
|
28
|
+
Requires-Dist: coverage; extra == 'dev'
|
|
29
|
+
Requires-Dist: isort; extra == 'dev'
|
|
30
|
+
Requires-Dist: pylint; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-random-order; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-timeout; extra == 'dev'
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "bec-server"
|
|
7
|
+
version = "2.5.0"
|
|
8
|
+
description = "BEC server"
|
|
9
|
+
requires-python = ">=3.10"
|
|
10
|
+
classifiers = [
|
|
11
|
+
"Development Status :: 3 - Alpha",
|
|
12
|
+
"Programming Language :: Python :: 3",
|
|
13
|
+
"Topic :: Scientific/Engineering",
|
|
14
|
+
]
|
|
15
|
+
dependencies = [
|
|
16
|
+
"bec-lib",
|
|
17
|
+
"cytoolz",
|
|
18
|
+
"h5py",
|
|
19
|
+
"libtmux",
|
|
20
|
+
"lmfit",
|
|
21
|
+
"msgpack",
|
|
22
|
+
"numpy",
|
|
23
|
+
"ophyd",
|
|
24
|
+
"ophyd_devices",
|
|
25
|
+
"pydantic",
|
|
26
|
+
"py-scibec",
|
|
27
|
+
"pyyaml",
|
|
28
|
+
"python-dotenv",
|
|
29
|
+
"rich",
|
|
30
|
+
"xmltodict",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[project.optional-dependencies]
|
|
34
|
+
dev = [
|
|
35
|
+
"black",
|
|
36
|
+
"isort",
|
|
37
|
+
"coverage",
|
|
38
|
+
"pylint",
|
|
39
|
+
"pytest",
|
|
40
|
+
"pytest-random-order",
|
|
41
|
+
"pytest-timeout",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
[project.scripts]
|
|
45
|
+
bec-dap = "bec_server.data_processing:main"
|
|
46
|
+
bec-device-server = "bec_server.device_server:main"
|
|
47
|
+
bec-file-writer = "bec_server.file_writer:main"
|
|
48
|
+
bec-scan-server = "bec_server.scan_server:main"
|
|
49
|
+
bec-scan-bundler = "bec_server.scan_bundler:main"
|
|
50
|
+
bec-scihub = "bec_server.scihub:main"
|
|
51
|
+
bec-server = "bec_server:main"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
[project.urls]
|
|
55
|
+
"Bug Tracker" = "https://gitlab.psi.ch/bec/bec/issues"
|
|
56
|
+
Homepage = "https://gitlab.psi.ch/bec/bec"
|
|
57
|
+
|
|
58
|
+
[tool.hatch.build.targets.wheel]
|
|
59
|
+
include = ["*"]
|
|
60
|
+
|
|
61
|
+
[tool.black]
|
|
62
|
+
line-length = 100
|
|
63
|
+
skip-magic-trailing-comma = true
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
from unittest import mock
|
|
2
|
+
|
|
3
|
+
from bec_server.bec_server_utils.launch import main
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_main_start():
|
|
7
|
+
with mock.patch("bec_server.bec_server_utils.launch.ServiceHandler") as mock_service_handler:
|
|
8
|
+
with mock.patch("bec_server.bec_server_utils.launch.argparse") as mock_argparse:
|
|
9
|
+
mock_argparse.ArgumentParser().parse_args.return_value = mock.MagicMock(
|
|
10
|
+
command="start", config=None
|
|
11
|
+
)
|
|
12
|
+
main()
|
|
13
|
+
mock_service_handler.assert_called_once_with(
|
|
14
|
+
bec_path=mock.ANY, config_path=None, no_tmux=False
|
|
15
|
+
)
|
|
16
|
+
mock_service_handler().start.assert_called_once()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_main_stop():
|
|
20
|
+
with mock.patch("bec_server.bec_server_utils.launch.ServiceHandler") as mock_service_handler:
|
|
21
|
+
with mock.patch("bec_server.bec_server_utils.launch.argparse") as mock_argparse:
|
|
22
|
+
mock_argparse.ArgumentParser().parse_args.return_value = mock.MagicMock(
|
|
23
|
+
command="stop", config=None
|
|
24
|
+
)
|
|
25
|
+
main()
|
|
26
|
+
mock_service_handler.assert_called_once_with(
|
|
27
|
+
bec_path=mock.ANY, config_path=None, no_tmux=False
|
|
28
|
+
)
|
|
29
|
+
mock_service_handler().stop.assert_called_once()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_main_restart():
|
|
33
|
+
with mock.patch("bec_server.bec_server_utils.launch.ServiceHandler") as mock_service_handler:
|
|
34
|
+
with mock.patch("bec_server.bec_server_utils.launch.argparse") as mock_argparse:
|
|
35
|
+
mock_argparse.ArgumentParser().parse_args.return_value = mock.MagicMock(
|
|
36
|
+
command="restart", config=None
|
|
37
|
+
)
|
|
38
|
+
main()
|
|
39
|
+
mock_service_handler.assert_called_once_with(
|
|
40
|
+
bec_path=mock.ANY, config_path=None, no_tmux=False
|
|
41
|
+
)
|
|
42
|
+
mock_service_handler().restart.assert_called_once()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_main_start_with_config():
|
|
46
|
+
with mock.patch("bec_server.bec_server_utils.launch.ServiceHandler") as mock_service_handler:
|
|
47
|
+
with mock.patch("bec_server.bec_server_utils.launch.argparse") as mock_argparse:
|
|
48
|
+
mock_argparse.ArgumentParser().parse_args.return_value = mock.MagicMock(
|
|
49
|
+
command="start", config="/path/to/config"
|
|
50
|
+
)
|
|
51
|
+
main()
|
|
52
|
+
mock_service_handler.assert_called_once_with(
|
|
53
|
+
bec_path=mock.ANY, config_path="/path/to/config", no_tmux=False
|
|
54
|
+
)
|
|
55
|
+
mock_service_handler().start.assert_called_once()
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_main_restart_with_config():
|
|
59
|
+
with mock.patch("bec_server.bec_server_utils.launch.ServiceHandler") as mock_service_handler:
|
|
60
|
+
with mock.patch("bec_server.bec_server_utils.launch.argparse") as mock_argparse:
|
|
61
|
+
mock_argparse.ArgumentParser().parse_args.return_value = mock.MagicMock(
|
|
62
|
+
command="restart", config="/path/to/config"
|
|
63
|
+
)
|
|
64
|
+
main()
|
|
65
|
+
mock_service_handler.assert_called_once_with(
|
|
66
|
+
bec_path=mock.ANY, config_path="/path/to/config", no_tmux=False
|
|
67
|
+
)
|
|
68
|
+
mock_service_handler().restart.assert_called_once()
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from unittest import mock
|
|
2
|
+
|
|
3
|
+
from bec_server.bec_server_utils.service_handler import ServiceHandler
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_service_handler():
|
|
7
|
+
bec_path = "/path/to/bec"
|
|
8
|
+
config_path = "/path/to/config"
|
|
9
|
+
|
|
10
|
+
with mock.patch("bec_server.bec_server_utils.service_handler.sys") as mock_sys:
|
|
11
|
+
mock_sys.platform = "linux"
|
|
12
|
+
service_handler = ServiceHandler(bec_path, config_path)
|
|
13
|
+
assert service_handler.interface == "tmux"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_service_handler_start():
|
|
17
|
+
bec_path = "/path/to/bec"
|
|
18
|
+
config_path = "/path/to/config"
|
|
19
|
+
|
|
20
|
+
with mock.patch("bec_server.bec_server_utils.service_handler.sys") as mock_sys:
|
|
21
|
+
mock_sys.platform = "linux"
|
|
22
|
+
service_handler = ServiceHandler(bec_path, config_path)
|
|
23
|
+
|
|
24
|
+
with mock.patch(
|
|
25
|
+
"bec_server.bec_server_utils.service_handler.tmux_start"
|
|
26
|
+
) as mock_tmux_start:
|
|
27
|
+
service_handler.start()
|
|
28
|
+
mock_tmux_start.assert_called_once_with(bec_path, config_path, service_handler.SERVICES)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_service_handler_stop():
|
|
32
|
+
with mock.patch("bec_server.bec_server_utils.service_handler.tmux_stop") as mock_tmux_stop:
|
|
33
|
+
service_handler = ServiceHandler("/path/to/bec", "/path/to/config")
|
|
34
|
+
service_handler.stop()
|
|
35
|
+
mock_tmux_stop.assert_called_once()
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_service_handler_restart():
|
|
39
|
+
bec_path = "/path/to/bec"
|
|
40
|
+
config_path = "/path/to/config"
|
|
41
|
+
|
|
42
|
+
with mock.patch("bec_server.bec_server_utils.service_handler.sys") as mock_sys:
|
|
43
|
+
mock_sys.platform = "linux"
|
|
44
|
+
service_handler = ServiceHandler(bec_path, config_path)
|
|
45
|
+
|
|
46
|
+
with mock.patch("bec_server.bec_server_utils.service_handler.tmux_stop") as mock_tmux_stop:
|
|
47
|
+
with mock.patch(
|
|
48
|
+
"bec_server.bec_server_utils.service_handler.tmux_start"
|
|
49
|
+
) as mock_tmux_start:
|
|
50
|
+
service_handler.restart()
|
|
51
|
+
mock_tmux_stop.assert_called_once()
|
|
52
|
+
mock_tmux_start.assert_called_once_with(
|
|
53
|
+
bec_path, config_path, service_handler.SERVICES
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_service_handler_services():
|
|
58
|
+
service_handler = ServiceHandler("/path/to/bec", "/path/to/config")
|
|
59
|
+
assert (
|
|
60
|
+
service_handler.SERVICES["scan_server"]["path"].substitute(base_path="/path/to/bec")
|
|
61
|
+
== "/path/to/bec/scan_server"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
assert service_handler.SERVICES["scan_server"]["command"] == "bec-scan-server"
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from string import Template
|
|
2
|
+
from unittest import mock
|
|
3
|
+
|
|
4
|
+
from bec_server.bec_server_utils.tmux_launch import tmux_start, tmux_stop
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_tmux_start():
|
|
8
|
+
with mock.patch("bec_server.bec_server_utils.tmux_launch.libtmux") as mock_libtmux_server:
|
|
9
|
+
tmux_start(
|
|
10
|
+
"/path/to/bec",
|
|
11
|
+
"/path/to/config",
|
|
12
|
+
{
|
|
13
|
+
"scan_server": {
|
|
14
|
+
"path": Template("$base_path/scan_server"),
|
|
15
|
+
"command": "bec-scan-server",
|
|
16
|
+
},
|
|
17
|
+
"scan_bundler": {
|
|
18
|
+
"path": Template("$base_path/scan_bundler"),
|
|
19
|
+
"command": "bec-scan-bundler",
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
)
|
|
23
|
+
mock_libtmux_server.Server().new_session.assert_called_once_with(
|
|
24
|
+
"bec", window_name="BEC server. Use `ctrl+b d` to detach.", kill_session=True
|
|
25
|
+
)
|
|
26
|
+
assert (
|
|
27
|
+
mock_libtmux_server.Server().new_session().attached_window.select_layout.call_count == 2
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
assert mock_libtmux_server.Server().new_session().set_option.call_count == 1
|
|
31
|
+
assert mock_libtmux_server.Server().new_session().set_option.call_args[0][0] == "mouse"
|
|
32
|
+
assert mock_libtmux_server.Server().new_session().set_option.call_args[0][1] == "on"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_tmux_stop_without_sessions():
|
|
36
|
+
with mock.patch("bec_server.bec_server_utils.tmux_launch.libtmux") as mock_libtmux_server:
|
|
37
|
+
mock_libtmux_server.Server().sessions.filter.return_value = []
|
|
38
|
+
tmux_stop()
|
|
39
|
+
mock_libtmux_server.Server().kill_server.assert_not_called()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_tmux_stop_with_sessions():
|
|
43
|
+
session = mock.MagicMock()
|
|
44
|
+
with mock.patch("bec_server.bec_server_utils.tmux_launch.libtmux") as mock_libtmux_server:
|
|
45
|
+
mock_libtmux_server.Server().sessions.filter.return_value = [session]
|
|
46
|
+
tmux_stop()
|
|
47
|
+
session.kill_session.assert_called_once()
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from unittest import mock
|
|
2
|
+
|
|
3
|
+
from bec_server.data_processing.cli.launch import main
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_main():
|
|
7
|
+
with mock.patch("bec_server.data_processing.cli.launch.argparse.ArgumentParser") as mock_parser:
|
|
8
|
+
with mock.patch("bec_server.data_processing.cli.launch.ServiceConfig") as mock_config:
|
|
9
|
+
with mock.patch(
|
|
10
|
+
"bec_server.data_processing.dap_server.DAPServer"
|
|
11
|
+
) as mock_data_processing:
|
|
12
|
+
with mock.patch(
|
|
13
|
+
"bec_server.data_processing.cli.launch.threading.Event"
|
|
14
|
+
) as mock_event:
|
|
15
|
+
main()
|
|
16
|
+
mock_parser.assert_called_once()
|
|
17
|
+
mock_config.assert_called_once()
|
|
18
|
+
mock_data_processing.assert_called_once()
|
|
19
|
+
mock_event.assert_called_once()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_main_shutdown():
|
|
23
|
+
with mock.patch("bec_server.data_processing.cli.launch.argparse.ArgumentParser") as mock_parser:
|
|
24
|
+
with mock.patch("bec_server.data_processing.cli.launch.ServiceConfig") as mock_config:
|
|
25
|
+
with mock.patch(
|
|
26
|
+
"bec_server.data_processing.dap_server.DAPServer"
|
|
27
|
+
) as mock_data_processing:
|
|
28
|
+
with mock.patch(
|
|
29
|
+
"bec_server.data_processing.cli.launch.threading.Event"
|
|
30
|
+
) as mock_event:
|
|
31
|
+
mock_event.return_value.wait.side_effect = KeyboardInterrupt()
|
|
32
|
+
try:
|
|
33
|
+
main()
|
|
34
|
+
except KeyboardInterrupt:
|
|
35
|
+
pass
|
|
36
|
+
mock_parser.assert_called_once()
|
|
37
|
+
mock_config.assert_called_once()
|
|
38
|
+
mock_data_processing.assert_called_once()
|
|
39
|
+
mock_event.assert_called_once()
|
|
40
|
+
mock_data_processing.return_value.shutdown.assert_called_once()
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from unittest import mock
|
|
2
|
+
|
|
3
|
+
from bec_lib import ServiceConfig
|
|
4
|
+
from bec_server.data_processing.dap_server import DAPServer
|
|
5
|
+
from bec_server.data_processing.dap_service import DAPServiceBase
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_dap_server():
|
|
9
|
+
config = ServiceConfig()
|
|
10
|
+
server = DAPServer(
|
|
11
|
+
config=config, connector_cls=mock.MagicMock(), provided_services=DAPServiceBase, forced=True
|
|
12
|
+
)
|
|
13
|
+
assert server._service_id == "DAPServiceBase"
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from unittest import mock
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from bec_lib import messages
|
|
6
|
+
from bec_lib.redis_connector import MessageObject
|
|
7
|
+
from bec_server.data_processing.dap_service import DAPServiceBase
|
|
8
|
+
from bec_server.data_processing.dap_service_manager import DAPServiceManager
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ServiceMock(DAPServiceBase):
|
|
12
|
+
def configure(self, *args, **kwargs):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
def process(self, *args, **kwargs):
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
def on_scan_status_update(self, *args, **kwargs):
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
@classmethod
|
|
22
|
+
def get_class_doc_string(cls, *args, **kwargs):
|
|
23
|
+
return "class_doc"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@pytest.fixture
|
|
27
|
+
def service_manager():
|
|
28
|
+
dap_service_manager = DAPServiceManager(services=ServiceMock)
|
|
29
|
+
dap_service_manager.start(client=mock.MagicMock())
|
|
30
|
+
yield dap_service_manager
|
|
31
|
+
dap_service_manager.shutdown()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_DAPServiceManager_init(service_manager):
|
|
35
|
+
assert service_manager.services == [ServiceMock]
|
|
36
|
+
assert service_manager.available_dap_services == {
|
|
37
|
+
"ServiceMock": {
|
|
38
|
+
"class": "ServiceMock",
|
|
39
|
+
"user_friendly_name": "ServiceMock",
|
|
40
|
+
"class_doc": "class_doc",
|
|
41
|
+
"run_doc": None,
|
|
42
|
+
"run_name": "run",
|
|
43
|
+
"signature": [
|
|
44
|
+
{
|
|
45
|
+
"name": "args",
|
|
46
|
+
"kind": "VAR_POSITIONAL",
|
|
47
|
+
"default": "_empty",
|
|
48
|
+
"annotation": "_empty",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"name": "kwargs",
|
|
52
|
+
"kind": "VAR_KEYWORD",
|
|
53
|
+
"default": "_empty",
|
|
54
|
+
"annotation": "_empty",
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
"params": {},
|
|
58
|
+
"auto_run_supported": False,
|
|
59
|
+
"class_args": [],
|
|
60
|
+
"class_kwargs": {},
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@pytest.mark.parametrize(
|
|
66
|
+
"msg, process_called",
|
|
67
|
+
[
|
|
68
|
+
(messages.DAPRequestMessage(dap_cls="dap_cls", dap_type="on_demand", config={}), True),
|
|
69
|
+
(messages.ScanStatusMessage(scan_id="scan_id", status="open", info={}), False),
|
|
70
|
+
],
|
|
71
|
+
)
|
|
72
|
+
def test_DAPServiceManager_request_callback(service_manager, msg, process_called):
|
|
73
|
+
msg_obj = MessageObject(value=msg, topic="topic")
|
|
74
|
+
with mock.patch.object(service_manager, "process_dap_request") as mock_process_dap_request:
|
|
75
|
+
service_manager._dap_request_callback(msg_obj)
|
|
76
|
+
if process_called:
|
|
77
|
+
mock_process_dap_request.assert_called_once_with(msg)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@pytest.mark.parametrize(
|
|
81
|
+
"msg, raised_exception, error_msg",
|
|
82
|
+
[
|
|
83
|
+
(
|
|
84
|
+
messages.DAPRequestMessage(
|
|
85
|
+
dap_cls="ServiceMock",
|
|
86
|
+
dap_type="continuous",
|
|
87
|
+
config={"auto_fit": True, "class_args": [], "class_kwargs": {}},
|
|
88
|
+
),
|
|
89
|
+
False,
|
|
90
|
+
"",
|
|
91
|
+
),
|
|
92
|
+
(
|
|
93
|
+
messages.DAPRequestMessage(
|
|
94
|
+
dap_cls="ServiceMock", dap_type="continuous", config={"auto_fit": False}
|
|
95
|
+
),
|
|
96
|
+
False,
|
|
97
|
+
"",
|
|
98
|
+
),
|
|
99
|
+
(
|
|
100
|
+
messages.DAPRequestMessage(dap_cls="ServiceMock", dap_type="on_demand", config={}),
|
|
101
|
+
False,
|
|
102
|
+
"",
|
|
103
|
+
),
|
|
104
|
+
],
|
|
105
|
+
)
|
|
106
|
+
def test_process_dap_request(service_manager, msg, raised_exception, error_msg):
|
|
107
|
+
if raised_exception:
|
|
108
|
+
with mock.patch.object(service_manager, "send_dap_response") as mock_send_dap_response:
|
|
109
|
+
service_manager.process_dap_request(msg)
|
|
110
|
+
mock_send_dap_response.assert_called_once_with(
|
|
111
|
+
msg, success=False, error=error_msg, metadata=msg.metadata
|
|
112
|
+
)
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
service_manager.process_dap_request(msg)
|