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.
Files changed (124) hide show
  1. bec_server-2.5.0/.gitignore +180 -0
  2. bec_server-2.5.0/PKG-INFO +33 -0
  3. bec_server-2.5.0/pyproject.toml +63 -0
  4. bec_server-2.5.0/tests/tests_bec_server_utils/test_main.py +68 -0
  5. bec_server-2.5.0/tests/tests_bec_server_utils/test_service_handler.py +64 -0
  6. bec_server-2.5.0/tests/tests_bec_server_utils/test_tmux_launch.py +47 -0
  7. bec_server-2.5.0/tests/tests_data_processing/conftest.py +12 -0
  8. bec_server-2.5.0/tests/tests_data_processing/test_dap_cli_launch.py +40 -0
  9. bec_server-2.5.0/tests/tests_data_processing/test_dap_server.py +13 -0
  10. bec_server-2.5.0/tests/tests_data_processing/test_dap_service_manager.py +115 -0
  11. bec_server-2.5.0/tests/tests_data_processing/test_lmfit1d_service.py +164 -0
  12. bec_server-2.5.0/tests/tests_device_server/conftest.py +24 -0
  13. bec_server-2.5.0/tests/tests_device_server/test_config_handler.py +109 -0
  14. bec_server-2.5.0/tests/tests_device_server/test_device_manager_ds.py +174 -0
  15. bec_server-2.5.0/tests/tests_device_server/test_device_serializer.py +45 -0
  16. bec_server-2.5.0/tests/tests_device_server/test_device_server.py +814 -0
  17. bec_server-2.5.0/tests/tests_device_server/test_device_server_cli_launch.py +32 -0
  18. bec_server-2.5.0/tests/tests_device_server/test_rpc_mixin.py +255 -0
  19. bec_server-2.5.0/tests/tests_file_writer/conftest.py +12 -0
  20. bec_server-2.5.0/tests/tests_file_writer/test_file_writer.py +165 -0
  21. bec_server-2.5.0/tests/tests_file_writer/test_file_writer_cli_launch.py +32 -0
  22. bec_server-2.5.0/tests/tests_file_writer/test_file_writer_manager.py +284 -0
  23. bec_server-2.5.0/tests/tests_scan_bundler/conftest.py +51 -0
  24. bec_server-2.5.0/tests/tests_scan_bundler/test_bec_emitter.py +65 -0
  25. bec_server-2.5.0/tests/tests_scan_bundler/test_bluesky_emitter.py +78 -0
  26. bec_server-2.5.0/tests/tests_scan_bundler/test_emitter.py +104 -0
  27. bec_server-2.5.0/tests/tests_scan_bundler/test_scan_bundler.py +664 -0
  28. bec_server-2.5.0/tests/tests_scan_bundler/test_scan_bundler_cli_launch.py +32 -0
  29. bec_server-2.5.0/tests/tests_scan_server/conftest.py +12 -0
  30. bec_server-2.5.0/tests/tests_scan_server/test_flomni_fermat_scan.py +61 -0
  31. bec_server-2.5.0/tests/tests_scan_server/test_path_optimization.py +230 -0
  32. bec_server-2.5.0/tests/tests_scan_server/test_scan_guard.py +307 -0
  33. bec_server-2.5.0/tests/tests_scan_server/test_scan_server_cli_launch.py +32 -0
  34. bec_server-2.5.0/tests/tests_scan_server/test_scan_server_queue.py +696 -0
  35. bec_server-2.5.0/tests/tests_scan_server/test_scan_stubs.py +123 -0
  36. bec_server-2.5.0/tests/tests_scan_server/test_scan_worker.py +1520 -0
  37. bec_server-2.5.0/tests/tests_scan_server/test_scans.py +2703 -0
  38. bec_server-2.5.0/tests/tests_scan_server/utils.py +118 -0
  39. bec_server-2.5.0/tests/tests_scihub/conftest.py +12 -0
  40. bec_server-2.5.0/tests/tests_scihub/test_repeated_timer.py +32 -0
  41. bec_server-2.5.0/tests/tests_scihub/test_scibec_config_handler.py +352 -0
  42. bec_server-2.5.0/tests/tests_scihub/test_scibec_connector.py +151 -0
  43. bec_server-2.5.0/tests/tests_scihub/test_scibec_metadata_handler.py +213 -0
  44. bec_server-2.5.0/tests/tests_scihub/test_scihub_cli_launch.py +32 -0
  45. bec_server-2.5.0/tests/tests_scihub/test_scilog_connector.py +40 -0
  46. bec-server-2.4.2/PKG-INFO +0 -12
  47. bec-server-2.4.2/bec_server.egg-info/PKG-INFO +0 -12
  48. bec-server-2.4.2/bec_server.egg-info/SOURCES.txt +0 -78
  49. bec-server-2.4.2/bec_server.egg-info/dependency_links.txt +0 -1
  50. bec-server-2.4.2/bec_server.egg-info/entry_points.txt +0 -8
  51. bec-server-2.4.2/bec_server.egg-info/requires.txt +0 -24
  52. bec-server-2.4.2/bec_server.egg-info/top_level.txt +0 -1
  53. bec-server-2.4.2/setup.cfg +0 -26
  54. bec-server-2.4.2/setup.py +0 -52
  55. {bec-server-2.4.2 → bec_server-2.5.0}/README.md +0 -0
  56. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/__init__.py +0 -0
  57. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/__init__.py +0 -0
  58. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/launch.py +0 -0
  59. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/service_handler.py +0 -0
  60. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/subprocess_launch.py +0 -0
  61. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/bec_server_utils/tmux_launch.py +0 -0
  62. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/__init__.py +0 -0
  63. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/cli/__init__.py +0 -0
  64. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/cli/launch.py +0 -0
  65. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/dap_server.py +0 -0
  66. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/dap_service.py +0 -0
  67. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/dap_service_manager.py +0 -0
  68. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/data_processing/lmfit1d_service.py +0 -0
  69. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/__init__.py +0 -0
  70. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/cli/__init__.py +0 -0
  71. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/cli/launch.py +0 -0
  72. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/device_server.py +0 -0
  73. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/devices/__init__.py +0 -0
  74. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/devices/config_update_handler.py +0 -0
  75. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/devices/device_serializer.py +0 -0
  76. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/devices/devicemanager.py +0 -0
  77. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/device_server/rpc_mixin.py +0 -0
  78. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/__init__.py +0 -0
  79. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/cli/__init__.py +0 -0
  80. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/cli/launch.py +0 -0
  81. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/file_writer.py +0 -0
  82. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/file_writer_manager.py +0 -0
  83. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer/merged_dicts.py +0 -0
  84. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer_plugins/__init__.py +0 -0
  85. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer_plugins/cSAXS.py +0 -0
  86. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/file_writer_plugins/default_writer.py +0 -0
  87. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/__init__.py +0 -0
  88. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/bec_emitter.py +0 -0
  89. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/bluesky_emitter.py +0 -0
  90. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/cli/__init__.py +0 -0
  91. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/cli/launch.py +0 -0
  92. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/emitter.py +0 -0
  93. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_bundler/scan_bundler.py +0 -0
  94. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/__init__.py +0 -0
  95. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/cli/__init__.py +0 -0
  96. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/cli/launch.py +0 -0
  97. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/device_validation.py +0 -0
  98. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/errors.py +0 -0
  99. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/path_optimization.py +0 -0
  100. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_assembler.py +0 -0
  101. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_guard.py +0 -0
  102. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_manager.py +0 -0
  103. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/LamNIFermatScan.py +0 -0
  104. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/__init__.py +0 -0
  105. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/flomni_fermat_scan.py +0 -0
  106. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/otf_scan.py +0 -0
  107. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/owis_grid.py +0 -0
  108. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_plugins/sgalil_grid.py +0 -0
  109. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_queue.py +0 -0
  110. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_server.py +0 -0
  111. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_stubs.py +0 -0
  112. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scan_worker.py +0 -0
  113. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scan_server/scans.py +0 -0
  114. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/__init__.py +0 -0
  115. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/cli/__init__.py +0 -0
  116. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/cli/launch.py +0 -0
  117. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/repeated_timer.py +0 -0
  118. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scibec/__init__.py +0 -0
  119. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scibec/config_handler.py +0 -0
  120. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scibec/scibec_connector.py +0 -0
  121. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scibec/scibec_metadata_handler.py +0 -0
  122. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scihub.py +0 -0
  123. {bec-server-2.4.2 → bec_server-2.5.0}/bec_server/scihub/scilog/__init__.py +0 -0
  124. {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,12 @@
1
+ import pytest
2
+
3
+ from bec_lib import bec_logger
4
+
5
+ # overwrite threads_check fixture from bec_lib,
6
+ # to have it in autouse
7
+
8
+
9
+ @pytest.fixture(autouse=True)
10
+ def threads_check(threads_check):
11
+ yield
12
+ bec_logger.logger.remove()
@@ -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)