bec-ipython-client 3.70.0__py3-none-any.whl → 3.86.1__py3-none-any.whl

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.

Potentially problematic release.


This version of bec-ipython-client might be problematic. Click here for more details.

@@ -8,14 +8,14 @@ image_name = (
8
8
  )
9
9
  podman = PodmanCliUtils()
10
10
 
11
- for i in range(1, 4):
11
+ for i in range(1, 6):
12
12
  try:
13
13
  output = podman._run_and_capture_error("podman", "pull", image_name)
14
14
  print("successfully pulled requirements image for current version")
15
15
  exit(0)
16
16
  except ProcedureWorkerError as e:
17
17
  print(e)
18
- print("retrying in 2 minutes...")
19
- sleep(120)
18
+ print("retrying in 5 minutes...")
19
+ sleep(5 * 60)
20
20
  print(f"No more retries. Check if {image_name} actually exists!")
21
21
  exit(1)
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import time
4
+ from dataclasses import dataclass
4
5
  from importlib.metadata import version
5
6
  from typing import TYPE_CHECKING, Callable, Generator
6
7
  from unittest.mock import MagicMock, patch
@@ -11,7 +12,7 @@ from bec_ipython_client.main import BECIPythonClient
11
12
  from bec_lib import messages
12
13
  from bec_lib.endpoints import MessageEndpoints
13
14
  from bec_lib.logger import bec_logger
14
- from bec_server.scan_server.procedures.constants import PROCEDURE
15
+ from bec_server.scan_server.procedures.constants import _CONTAINER, _WORKER
15
16
  from bec_server.scan_server.procedures.container_utils import get_backend
16
17
  from bec_server.scan_server.procedures.container_worker import ContainerProcedureWorker
17
18
  from bec_server.scan_server.procedures.manager import ProcedureManager
@@ -28,6 +29,15 @@ logger = bec_logger.logger
28
29
  pytestmark = pytest.mark.random_order(disabled=True)
29
30
 
30
31
 
32
+ @dataclass(frozen=True)
33
+ class PATCHED_CONSTANTS:
34
+ WORKER = _WORKER()
35
+ CONTAINER = _CONTAINER()
36
+ MANAGER_SHUTDOWN_TIMEOUT_S = 2
37
+ BEC_VERSION = version("bec_lib")
38
+ REDIS_HOST = "localhost"
39
+
40
+
31
41
  @pytest.fixture
32
42
  def client_logtool_and_manager(
33
43
  bec_ipython_client_fixture_with_logtool: tuple[BECIPythonClient, "LogTestTool"],
@@ -52,7 +62,7 @@ def _wait_while(cond: Callable[[], bool], timeout_s):
52
62
  def test_building_worker_image():
53
63
  podman_utils = get_backend()
54
64
  build = podman_utils.build_worker_image()
55
- assert len(build._command_output.splitlines()[-1]) == 64
65
+ assert len(build._command_output.splitlines()[-1]) == 64 # type: ignore
56
66
  assert podman_utils.image_exists(f"bec_procedure_worker:v{version('bec_lib')}")
57
67
 
58
68
 
@@ -62,7 +72,7 @@ def test_procedure_runner_spawns_worker(
62
72
  client_logtool_and_manager: tuple[BECIPythonClient, "LogTestTool", ProcedureManager],
63
73
  ):
64
74
  client, _, manager = client_logtool_and_manager
65
- assert manager.active_workers == {}
75
+ assert manager._active_workers == {}
66
76
  endpoint = MessageEndpoints.procedure_request()
67
77
  msg = messages.ProcedureRequestMessage(
68
78
  identifier="sleep", args_kwargs=((), {"time_s": 2}), queue="test"
@@ -77,21 +87,22 @@ def test_procedure_runner_spawns_worker(
77
87
  manager.add_callback("test", cb)
78
88
  client.connector.xadd(topic=endpoint, msg_dict=msg.model_dump())
79
89
 
80
- _wait_while(lambda: manager.active_workers == {}, 5)
81
- _wait_while(lambda: manager.active_workers != {}, 20)
90
+ _wait_while(lambda: manager._active_workers == {}, 5)
91
+ _wait_while(lambda: manager._active_workers != {}, 20)
82
92
 
83
93
  assert logs != []
84
94
 
85
95
 
86
96
  @pytest.mark.timeout(100)
87
97
  @patch("bec_server.scan_server.procedures.manager.procedure_registry.is_registered", lambda _: True)
98
+ @patch("bec_server.scan_server.procedures.container_worker.PROCEDURE", PATCHED_CONSTANTS())
88
99
  def test_happy_path_container_procedure_runner(
89
100
  client_logtool_and_manager: tuple[BECIPythonClient, "LogTestTool", ProcedureManager],
90
101
  ):
91
102
  test_args = (1, 2, 3)
92
103
  test_kwargs = {"a": "b", "c": "d"}
93
104
  client, logtool, manager = client_logtool_and_manager
94
- assert manager.active_workers == {}
105
+ assert manager._active_workers == {}
95
106
  conn = client.connector
96
107
  endpoint = MessageEndpoints.procedure_request()
97
108
  msg = messages.ProcedureRequestMessage(
@@ -99,12 +110,15 @@ def test_happy_path_container_procedure_runner(
99
110
  )
100
111
  conn.xadd(topic=endpoint, msg_dict=msg.model_dump())
101
112
 
102
- _wait_while(lambda: manager.active_workers == {}, 5)
103
- _wait_while(lambda: manager.active_workers != {}, 20)
113
+ _wait_while(lambda: manager._active_workers == {}, 5)
114
+ _wait_while(lambda: manager._active_workers != {}, 20)
104
115
 
105
116
  logtool.fetch()
106
117
  assert logtool.is_present_in_any_message("procedure accepted: True, message:")
107
- assert logtool.is_present_in_any_message("ContainerWorker started container for queue primary")
118
+ assert logtool.is_present_in_any_message(
119
+ "ContainerWorker started container for queue primary"
120
+ ), f"Log content relating to procedures: {manager._logs}"
121
+
108
122
  res, msg = logtool.are_present_in_order(
109
123
  [
110
124
  "Container worker 'primary' status update: IDLE",
@@ -114,12 +128,7 @@ def test_happy_path_container_procedure_runner(
114
128
  ]
115
129
  )
116
130
  assert res, f"failed on {msg}"
117
- res, msg = logtool.are_present_in_order(
118
- [
119
- "Container worker 'primary' status update: IDLE",
120
- f"Builtin procedure log_message_args_kwargs called with args: {test_args} and kwargs: {test_kwargs}",
121
- "Container worker 'primary' status update: IDLE",
122
- "Container worker 'primary' status update: FINISHED",
123
- ]
131
+
132
+ assert logtool.is_present_in_any_message(
133
+ f"Builtin procedure log_message_args_kwargs called with args: {test_args} and kwargs: {test_kwargs}"
124
134
  )
125
- assert res, f"failed on {msg}"
@@ -1,9 +1,12 @@
1
+ from __future__ import annotations
2
+
1
3
  import _thread
2
4
  import io
3
5
  import os
4
6
  import threading
5
7
  import time
6
8
  from contextlib import redirect_stdout
9
+ from typing import TYPE_CHECKING
7
10
  from unittest.mock import PropertyMock
8
11
 
9
12
  import h5py
@@ -19,6 +22,9 @@ from bec_lib.logger import bec_logger
19
22
 
20
23
  logger = bec_logger.logger
21
24
 
25
+ if TYPE_CHECKING: # pragma: no cover
26
+ from bec_ipython_client.main import BECIPythonClient
27
+
22
28
  # pylint: disable=protected-access
23
29
 
24
30
 
@@ -201,13 +207,13 @@ def test_mv_scan_mv(bec_ipython_client_fixture):
201
207
 
202
208
 
203
209
  @pytest.mark.timeout(100)
204
- def test_scan_abort(bec_ipython_client_fixture):
210
+ def test_scan_abort(bec_ipython_client_fixture: BECIPythonClient):
205
211
  def send_abort(bec):
206
212
  while True:
207
213
  current_scan_info = bec.queue.scan_storage.current_scan_info
208
214
  if not current_scan_info:
209
215
  continue
210
- status = current_scan_info.get("status").lower()
216
+ status = current_scan_info.status.lower()
211
217
  if status not in ["running", "deferred_pause"]:
212
218
  continue
213
219
  if bec.queue.scan_storage.current_scan is None:
@@ -217,7 +223,7 @@ def test_scan_abort(bec_ipython_client_fixture):
217
223
  break
218
224
  while True:
219
225
  queue = bec.queue.queue_storage.current_scan_queue
220
- if queue["primary"]["info"][0]["status"] == "DEFERRED_PAUSE":
226
+ if queue["primary"].info[0].status == "DEFERRED_PAUSE":
221
227
  break
222
228
  time.sleep(0.5)
223
229
  _thread.interrupt_main()
@@ -241,7 +247,7 @@ def test_scan_abort(bec_ipython_client_fixture):
241
247
  time.sleep(0.5)
242
248
 
243
249
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
244
- while current_queue["info"] or current_queue["status"] != "RUNNING":
250
+ while current_queue.info or current_queue.status != "RUNNING":
245
251
  time.sleep(0.5)
246
252
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
247
253
 
@@ -307,7 +313,7 @@ def test_queued_scan(bec_ipython_client_fixture):
307
313
  while len(scan2.scan.live_data) != 50:
308
314
  time.sleep(0.5)
309
315
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
310
- while current_queue["info"] or current_queue["status"] != "RUNNING":
316
+ while current_queue.info or current_queue.status != "RUNNING":
311
317
  time.sleep(0.5)
312
318
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
313
319
  scan_number_end = bec.queue.next_scan_number
@@ -356,7 +362,7 @@ def test_scan_restart(bec_ipython_client_fixture):
356
362
  scan2.wait()
357
363
 
358
364
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
359
- while current_queue["info"] or current_queue["status"] != "RUNNING":
365
+ while current_queue.info or current_queue.status != "RUNNING":
360
366
  time.sleep(0.5)
361
367
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
362
368
  scan_number_end = bec.queue.next_scan_number
@@ -364,7 +370,7 @@ def test_scan_restart(bec_ipython_client_fixture):
364
370
 
365
371
 
366
372
  @pytest.mark.timeout(100)
367
- def test_scan_observer_repeat_queued(bec_ipython_client_fixture):
373
+ def test_scan_observer_repeat_queued(bec_ipython_client_fixture: BECIPythonClient):
368
374
  bec = bec_ipython_client_fixture
369
375
  bec.metadata.update({"unit_test": "test_scan_observer_repeat_queued"})
370
376
  scans = bec.scans
@@ -396,7 +402,7 @@ def test_scan_observer_repeat_queued(bec_ipython_client_fixture):
396
402
  scan2.wait()
397
403
 
398
404
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
399
- while current_queue["info"] or current_queue["status"] != "RUNNING":
405
+ while current_queue.info or current_queue.status != "RUNNING":
400
406
  time.sleep(0.5)
401
407
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
402
408
  scan_number_end = bec.queue.next_scan_number
@@ -433,7 +439,7 @@ def test_scan_observer_repeat(bec_ipython_client_fixture):
433
439
  scan1.wait()
434
440
 
435
441
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
436
- while current_queue["info"] or current_queue["status"] != "RUNNING":
442
+ while current_queue.info or current_queue.status != "RUNNING":
437
443
  time.sleep(0.5)
438
444
  current_queue = bec.queue.queue_storage.current_scan_queue["primary"]
439
445
  while True:
@@ -737,12 +743,12 @@ def test_update_config(bec_ipython_client_fixture):
737
743
  bec = bec_ipython_client_fixture
738
744
  bec.metadata.update({"unit_test": "test_update_config"})
739
745
  demo_config_path = os.path.join(os.path.dirname(configs.__file__), "demo_config.yaml")
740
- config = bec.config._load_config_from_file(demo_config_path)
746
+ config = bec.device_manager.config_helper._load_config_from_file(demo_config_path)
741
747
  config.pop("samx")
742
- bec.config.send_config_request(action="set", config=config)
748
+ bec.device_manager.config_helper.send_config_request(action="set", config=config)
743
749
  assert "samx" not in bec.device_manager.devices
744
- config = bec.config._load_config_from_file(demo_config_path)
745
- bec.config.send_config_request(action="set", config=config)
750
+ config = bec.device_manager.config_helper._load_config_from_file(demo_config_path)
751
+ bec.device_manager.config_helper.send_config_request(action="set", config=config)
746
752
 
747
753
 
748
754
  @pytest.mark.timeout(100)
@@ -322,7 +322,9 @@ def test_config_reload(
322
322
  num_devices = len(bec.device_manager.devices)
323
323
  if raises_error:
324
324
  with pytest.raises(DeviceConfigError):
325
- bec.config.update_session_with_file(runtime_config_file_path)
325
+ bec.config.update_session_with_file(
326
+ runtime_config_file_path, force=True, validate=False
327
+ )
326
328
  if deletes_config:
327
329
  assert len(bec.device_manager.devices) == 0
328
330
  elif disabled_device:
@@ -330,7 +332,7 @@ def test_config_reload(
330
332
  else:
331
333
  assert len(bec.device_manager.devices) == num_devices
332
334
  else:
333
- bec.config.update_session_with_file(runtime_config_file_path)
335
+ bec.config.update_session_with_file(runtime_config_file_path, force=True, validate=False)
334
336
  assert len(bec.device_manager.devices) == 2
335
337
  for dev in disabled_device:
336
338
  assert bec.device_manager.devices[dev].enabled is False
@@ -375,7 +377,7 @@ def test_config_reload_with_describe_failure(bec_test_config_file_path, bec_clie
375
377
  f.write(yaml.dump(config))
376
378
 
377
379
  with pytest.raises(DeviceConfigError):
378
- bec.config.update_session_with_file(runtime_config_file_path)
380
+ bec.config.update_session_with_file(runtime_config_file_path, force=True, validate=False)
379
381
 
380
382
  assert len(bec.device_manager.devices) == 2
381
383
  assert bec.device_manager.devices["eyefoc"].enabled is True
@@ -386,7 +388,7 @@ def test_config_reload_with_describe_failure(bec_test_config_file_path, bec_clie
386
388
  f"e2e_test_hexapod_fail", messages.DeviceStatusMessage(device="hexapod", status=0)
387
389
  )
388
390
 
389
- bec.config.update_session_with_file(runtime_config_file_path)
391
+ bec.config.update_session_with_file(runtime_config_file_path, force=True)
390
392
  assert len(bec.device_manager.devices) == 2
391
393
  assert bec.device_manager.devices["eyefoc"].enabled is True
392
394
  assert bec.device_manager.devices["hexapod"].enabled is True
@@ -412,13 +414,13 @@ def test_config_add_remove_device(bec_client_lib):
412
414
  "readOnly": False,
413
415
  }
414
416
  }
415
- bec.config.send_config_request(action="add", config=config)
417
+ bec.device_manager.config_helper.send_config_request(action="add", config=config)
416
418
  with pytest.raises(DeviceConfigError) as config_error:
417
- bec.config.send_config_request(action="add", config=config)
419
+ bec.device_manager.config_helper.send_config_request(action="add", config=config)
418
420
  assert config_error.match("Device new_device already exists")
419
421
  assert "new_device" in dev
420
422
 
421
- bec.config.send_config_request(action="remove", config={"new_device": {}})
423
+ bec.device_manager.config_helper.send_config_request(action="remove", config={"new_device": {}})
422
424
  assert "new_device" not in dev
423
425
 
424
426
  device_config_msg = bec.connector.get(MessageEndpoints.device_config())
@@ -429,7 +431,7 @@ def test_config_add_remove_device(bec_client_lib):
429
431
 
430
432
  config["new_device"]["deviceClass"] = "ophyd_devices.doesnt_exist"
431
433
  with pytest.raises(DeviceConfigError) as config_error:
432
- bec.config.send_config_request(action="add", config=config)
434
+ bec.device_manager.config_helper.send_config_request(action="add", config=config)
433
435
  assert config_error.match("module 'ophyd_devices' has no attribute 'doesnt_exist'")
434
436
  assert "new_device" not in dev
435
437
  assert "samx" in dev
@@ -461,17 +463,21 @@ def test_cached_device_readout(bec_client_lib):
461
463
  dev = bec.device_manager.devices
462
464
 
463
465
  dev.samx.setpoint.put(5)
464
- data = dev.samx.setpoint.get()
466
+ data = dev.samx.setpoint.get(cached=True)
465
467
  assert data == 5
466
468
 
467
- orig_velocity = dev.samx.velocity.get()
469
+ orig_velocity = dev.samx.velocity.get(cached=True)
468
470
  dev.samx.velocity.put(10)
469
- data = dev.samx.velocity.get()
471
+ data = dev.samx.velocity.get(cached=True)
470
472
  assert data == 10
471
473
 
472
- config = dev.samx.read_configuration()
474
+ config = dev.samx.read_configuration(cached=True)
473
475
  assert config["samx_velocity"]["value"] == 10
474
476
 
477
+ dev.samx.velocity.set(20).wait()
478
+ data = dev.samx.velocity.get(cached=True)
479
+ assert data == 20
480
+
475
481
  dev.samx.velocity.put(orig_velocity)
476
482
 
477
483
  data = dev.hexapod.x.readback.read()
@@ -1,43 +0,0 @@
1
- .gitignore,sha256=UmJ0gTRAPp4EI1A6tb9Pi-k5uxDIb_NWJU9ye6AW-8Y,3306
2
- PKG-INFO,sha256=8InaX9sdNJR4GYyFYQ4MxSmsiSYuXiUO8FTYFB5ruBU,1052
3
- demo.py,sha256=TE-niyXPUEAP-GaL-QRBPgnaxfXqBmTsBiKUxl3F_VQ,7053
4
- pyproject.toml,sha256=Tnvc9IgRWhxdkfFa6p9UsMPkkpapIOPzmMV6ocwsdnY,1229
5
- bec_ipython_client/__init__.py,sha256=ihd_V8I7Qo0MWKMo7bcvPf-ZyUQqkcNf8IAWLJKiFJE,79
6
- bec_ipython_client/beamline_mixin.py,sha256=scMWIFbHJajyECzbwEVKyQUGjpqA9C_KiU2M6FuRH_Q,1067
7
- bec_ipython_client/bec_magics.py,sha256=Rz2aXkUCeAV_VxdXqLUNHh8T44kSH9ha83OiEtdptzI,2792
8
- bec_ipython_client/bec_startup.py,sha256=GGlHyxnSCQfYF5n-pYq2ic0pSyW5zvnT2PAlI5kY77w,1930
9
- bec_ipython_client/main.py,sha256=OQeDX1XxavvKo-0lpM8-Pd8tkMIS09DG7fqeCjsIEHw,11237
10
- bec_ipython_client/prettytable.py,sha256=TnhGPGuU0XEvnIYJ1UfTEwadcowFW4rqJW8z_Sm0EDw,2534
11
- bec_ipython_client/progressbar.py,sha256=aDKYjzXmGSwa82ewm59V8WSuqVQz9GiZPx5G65fEwpk,11090
12
- bec_ipython_client/signals.py,sha256=mbThPo6h3mQ6RFRm9viETDMC_unFa7QxiymCdM_ZK7U,4194
13
- bec_ipython_client/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- bec_ipython_client/callbacks/device_progress.py,sha256=y3GFSlCD-etOIrLJkX2ozxEyCNRMaRAaTdZmN8xOcjk,2385
15
- bec_ipython_client/callbacks/ipython_live_updates.py,sha256=tcr3ATyg46NAS3yQHhdOS7KFJnfVxri36PuKpILjyqU,10322
16
- bec_ipython_client/callbacks/live_table.py,sha256=2FjNSTC5HbNgg-aNJcEfNZRnhIUqJoRRTthU3L1UKD4,13350
17
- bec_ipython_client/callbacks/move_device.py,sha256=FXCztPGqKNmaSKs9Q13y7syZJs57IZo4mJH6GTOIbOU,5863
18
- bec_ipython_client/callbacks/utils.py,sha256=AEEzsfD9S2ZMuJA4yAxy9gMa1iPMCxQ3zr7ZDO01bHE,5702
19
- bec_ipython_client/high_level_interfaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- bec_ipython_client/high_level_interfaces/bec_hli.py,sha256=G1eF-lbLEDuN2mr_AYSxhhGb4LT6P72g0a4sU9M9zgk,1221
21
- bec_ipython_client/high_level_interfaces/spec_hli.py,sha256=z7WtjiC4LtMfKJn12SbguHPCLqbAsZNfUDyiUW0LOiU,5818
22
- bec_ipython_client/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- bec_ipython_client/plugins/SLS/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- bec_ipython_client/plugins/SLS/sls_info.py,sha256=93GU_XNRDsCO0ZvUrCf_SWnUMJ1FlRTJSuXXh_bYJ30,4934
25
- bec_ipython_client/plugins/XTreme/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- bec_ipython_client/plugins/XTreme/x-treme.py,sha256=ZKI_EEPYyWW-sdrK9DIllb81aeObc1O3fU1eWqipjTQ,3631
27
- bec_ipython_client/plugins/flomni/flomni_config.yaml,sha256=bCN1VKCzF6tw24HYeUE2b81kXMXzhEd69Ea8_q8Ywfk,6184
28
- tests/conftest.py,sha256=4yzGYqs8EVOxxY9Bu-yGbzmOpzG9dxs3cwSCzjmRziQ,233
29
- tests/client_tests/test_beamline_mixins.py,sha256=8Ws0bmzl2gSW0VuOVu80_JbYNb5Y-htchmrrptwjwDo,4611
30
- tests/client_tests/test_bec_client.py,sha256=pMpjDpgdeynHMJXZkXCMYERm5OEwu4VR50ID28eNFhc,7722
31
- tests/client_tests/test_device_progress.py,sha256=GEw2g8MQZnv5mxABEZlxBmaMpxVS33wogaYohFolDEs,2353
32
- tests/client_tests/test_ipython_live_updates.py,sha256=HpA16Mx0WdseqlfP0FojlAd6VfvjnwAUReDkItZVYWs,6081
33
- tests/client_tests/test_live_table.py,sha256=5ZtCWDYBm_Vxg1lw6Nuj5qpmtY4VPGCYdX-cY00dSf8,18178
34
- tests/client_tests/test_move_callback.py,sha256=e5c14pa9tUsMPgNhI9m7vrml5TKEAmMAQKLuiZPftDw,7026
35
- tests/client_tests/test_pretty_table.py,sha256=uQ-KPb3RXoCFE_t1IrpkT6kZAoqW7pFXxbFc445sX0Y,469
36
- tests/end-2-end/_ensure_requirements_container.py,sha256=iAcTHqudgJMh7yS9kmfN1bqfqUgvj6ZG-LyuJVIfgFE,722
37
- tests/end-2-end/test_procedures_e2e.py,sha256=3CPzjW3VpsSU8GKVP814SSvLZ0c7bBtPB_VtX725TCY,4737
38
- tests/end-2-end/test_scans_e2e.py,sha256=CxlXjQrzDJebaoZObt_oYx41wbnHLuJLSjKlno4u2B4,30981
39
- tests/end-2-end/test_scans_lib_e2e.py,sha256=bUxKX7JRRQYtjgyOX1LktpcxOE8aZbQ6Ut_alKQhGYg,19063
40
- bec_ipython_client-3.70.0.dist-info/METADATA,sha256=8InaX9sdNJR4GYyFYQ4MxSmsiSYuXiUO8FTYFB5ruBU,1052
41
- bec_ipython_client-3.70.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
42
- bec_ipython_client-3.70.0.dist-info/entry_points.txt,sha256=oQUXYY0jjD9ZvKPHwaGn2wkUIWpDZM8L4ixDA3RlBWE,53
43
- bec_ipython_client-3.70.0.dist-info/RECORD,,