pychemstation 0.10.8.dev3__py3-none-any.whl → 0.10.9__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.
@@ -83,7 +83,9 @@ class CSVProcessor(ReportProcessor):
83
83
  if "00" in name and file_extension.lower() == "csv":
84
84
  prefix, _, _ = name.partition("00")
85
85
  return prefix
86
- raise FileNotFoundError("Couldn't find the prefix for CSV")
86
+ raise FileNotFoundError(
87
+ "Couldn't find the prefix for CSV, please make sure the post-run settings generate a CSV."
88
+ )
87
89
 
88
90
  def report_contains(self, labels: List[str], want: List[str]):
89
91
  for label in labels:
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import os
4
4
  import time
5
5
  import warnings
6
- from typing import Dict, List, Optional, Set, Union, Tuple
6
+ from typing import Dict, List, Optional, Union, Tuple
7
7
 
8
8
  from result import Err, Ok, Result
9
9
 
@@ -51,9 +51,7 @@ class MethodController(RunController):
51
51
  )
52
52
 
53
53
  def get_current_method_name(self) -> str:
54
- time.sleep(2)
55
- self.send(Command.GET_METHOD_CMD)
56
- time.sleep(2)
54
+ self.sleepy_send(Command.GET_METHOD_CMD)
57
55
  res = self.receive()
58
56
  if res.is_ok():
59
57
  return res.ok_value.string_response
@@ -192,7 +190,6 @@ class MethodController(RunController):
192
190
  method_dir=method_dir, method_name=method_name
193
191
  )
194
192
  )
195
-
196
193
  time.sleep(2)
197
194
  self.send(Command.GET_METHOD_CMD)
198
195
  time.sleep(2)
@@ -341,7 +338,7 @@ class MethodController(RunController):
341
338
  )
342
339
  if isinstance(method_param.chemstation_key, list):
343
340
  for register_flag in method_param.chemstation_key:
344
- self.send(
341
+ self.sleepy_send(
345
342
  setting_command.value.format(
346
343
  register=register,
347
344
  register_flag=register_flag,
@@ -349,20 +346,17 @@ class MethodController(RunController):
349
346
  )
350
347
  )
351
348
  else:
352
- self.send(
349
+ self.sleepy_send(
353
350
  setting_command.value.format(
354
351
  register=register,
355
352
  register_flag=method_param.chemstation_key,
356
353
  val=method_param.val,
357
354
  )
358
355
  )
359
- time.sleep(2)
360
356
  self.download()
361
357
 
362
358
  def download(self):
363
- self.send("Sleep 1")
364
359
  self.sleepy_send("DownloadRCMethod PMP1")
365
- self.send("Sleep 1")
366
360
 
367
361
  def _edit_row(
368
362
  self,
@@ -579,10 +573,10 @@ class MethodController(RunController):
579
573
  else:
580
574
  warnings.warn(run_completed.err_value)
581
575
  else:
582
- folder = self._fuzzy_match_most_recent_folder(self.data_files[-1], None)
576
+ folder = self._fuzzy_match_most_recent_folder(self.data_files[-1])
583
577
  i = 0
584
578
  while folder.is_err() and i < 10:
585
- folder = self._fuzzy_match_most_recent_folder(self.data_files[-1], None)
579
+ folder = self._fuzzy_match_most_recent_folder(self.data_files[-1])
586
580
  i += 1
587
581
  if folder.is_ok():
588
582
  self.data_files[-1] = folder.ok_value
@@ -591,11 +585,11 @@ class MethodController(RunController):
591
585
  warnings.warn(warning)
592
586
 
593
587
  def _fuzzy_match_most_recent_folder(
594
- self, most_recent_folder: T, child_dirs: Optional[Set[str]]
588
+ self, most_recent_folder: T
595
589
  ) -> Result[str, str]:
596
590
  if isinstance(most_recent_folder, str) or isinstance(most_recent_folder, bytes):
597
591
  if os.path.exists(most_recent_folder):
598
- return Ok(most_recent_folder)
592
+ return Ok(str(most_recent_folder))
599
593
  return Err("Folder not found!")
600
594
  raise ValueError("Folder is not a str or byte type.")
601
595
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import os
4
4
  import time
5
5
  import warnings
6
- from typing import Any, Dict, List, Optional, Union, Set, Tuple
6
+ from typing import Any, Dict, List, Optional, Union, Tuple
7
7
 
8
8
  from result import Err, Ok, Result
9
9
  from typing_extensions import override
@@ -301,11 +301,6 @@ class SequenceController(RunController):
301
301
  under the <data_dir>/<sequence table name> folder.
302
302
  Device must be ready.
303
303
  """
304
- if self.controller:
305
- self.controller.send(Command.SAVE_METHOD_CMD)
306
- self.controller.send(Command.SAVE_SEQUENCE_CMD)
307
- else:
308
- raise ValueError("Controller is offline!")
309
304
 
310
305
  current_sequence_name = self.get_current_sequence_name()
311
306
  if not self.table_state or self.table_state.name not in current_sequence_name:
@@ -333,6 +328,8 @@ class SequenceController(RunController):
333
328
  timestamp = time.strftime(SEQUENCE_TIME_FORMAT)
334
329
  folder_name = f"{self.table_state.name} {timestamp}"
335
330
 
331
+ self.send(Command.SAVE_METHOD_CMD)
332
+ self.send(Command.SAVE_SEQUENCE_CMD)
336
333
  self.send(Command.RUN_SEQUENCE_CMD.value)
337
334
  self.timeout = total_runtime * 60
338
335
 
@@ -344,12 +341,11 @@ class SequenceController(RunController):
344
341
  break
345
342
 
346
343
  if hplc_running:
347
- current_sample_file, full_path_name = self.try_getting_run_info(folder_name)
344
+ full_path_name, current_sample_file = self.try_getting_run_info(folder_name)
348
345
  if full_path_name and current_sample_file:
349
346
  data_file = SequenceDataFiles(
350
347
  sequence_name=self.table_state.name,
351
348
  dir=full_path_name,
352
- _data_files=[r.data_file for r in self.table_state.rows],
353
349
  child_dirs=[os.path.join(full_path_name, current_sample_file)],
354
350
  )
355
351
  self.data_files.append(data_file)
@@ -374,64 +370,25 @@ class SequenceController(RunController):
374
370
  )
375
371
  except ValueError:
376
372
  pass
377
- if full_path_name and folder_name in full_path_name:
378
- pass
379
- else:
380
- if self.controller:
381
- self.controller.send(Command.GET_RUNNING_SEQUENCE_DIR)
382
- res = self.controller.receive()
383
- if res.is_ok():
384
- if os.path.isdir(res.ok_value.string_response):
385
- if folder_name in res.ok_value.string_response:
386
- full_path_name = res.ok_value.string_response
387
- else:
388
- raise ValueError("Could not get sequence data folder.")
389
- else:
390
- raise ValueError("Controller is offline.")
391
- if current_sample_file and full_path_name:
392
- return full_path_name, current_sample_file
393
- elif full_path_name:
394
- return full_path_name, None
395
- else:
396
- raise ValueError("Could not get sequence data folder")
373
+ if current_sample_file and full_path_name:
374
+ return full_path_name, current_sample_file
375
+ elif full_path_name:
376
+ return full_path_name, None
377
+ raise ValueError("Could not get sequence data folder")
397
378
 
398
379
  @override
399
380
  def _fuzzy_match_most_recent_folder(
400
- self, most_recent_folder: T, child_dirs: Optional[Set[str]]
381
+ self, most_recent_folder: T
401
382
  ) -> Result[SequenceDataFiles, str]:
402
383
  if isinstance(most_recent_folder, SequenceDataFiles):
403
384
  try:
404
385
  if most_recent_folder.dir and os.path.isdir(most_recent_folder.dir):
405
386
  subdirs = [x[0] for x in os.walk(most_recent_folder.dir)]
406
- if (
407
- child_dirs
408
- and len(child_dirs) > 0
409
- and set(most_recent_folder._data_files) == child_dirs
410
- ):
411
- most_recent_folder.child_dirs = [
412
- os.path.join(most_recent_folder.dir, f)
413
- if not os.path.isdir(f)
414
- else f
415
- for f in child_dirs
416
- ]
417
- for d in most_recent_folder.child_dirs:
418
- assert os.path.isdir(d)
419
- else:
420
- potential_folders: List[str] = sorted(
421
- list(
422
- filter(
423
- lambda d: most_recent_folder.dir in d,
424
- subdirs,
425
- )
426
- )
427
- )
428
- most_recent_folder.child_dirs = [
429
- f
430
- for f in potential_folders
431
- if most_recent_folder.dir in f
432
- and ".M" not in f
433
- and ".D" in f
434
- ]
387
+ most_recent_folder.child_dirs = [
388
+ f
389
+ for f in subdirs
390
+ if most_recent_folder.dir in f and ".D" in f and f[-1] == "D"
391
+ ]
435
392
  return Ok(most_recent_folder)
436
393
  else:
437
394
  return Err("No sequence folder found, please give the full path.")
@@ -446,14 +403,11 @@ class SequenceController(RunController):
446
403
  if custom_path
447
404
  else self.data_files[-1]
448
405
  )
449
- if len(seq_data_dir.child_dirs) == 0:
450
- search_folder = self._fuzzy_match_most_recent_folder(
451
- seq_data_dir, set(seq_data_dir.child_dirs)
452
- )
453
- if search_folder.is_ok():
454
- seq_data_dir = search_folder.ok_value
455
- else:
456
- raise FileNotFoundError(search_folder.err_value)
406
+ search_folder = self._fuzzy_match_most_recent_folder(seq_data_dir)
407
+ if search_folder.is_ok():
408
+ seq_data_dir = search_folder.ok_value
409
+ else:
410
+ raise FileNotFoundError(search_folder.err_value)
457
411
  all_w_spectra: List[Dict[int, AgilentHPLCChromatogram]] = []
458
412
  for row in seq_data_dir.child_dirs:
459
413
  all_w_spectra.append(self.get_data_uv(custom_path=row))
@@ -477,10 +431,9 @@ class SequenceController(RunController):
477
431
  if custom_path
478
432
  else self.data_files[-1]
479
433
  )
480
- if len(seq_file_dir.child_dirs) == 0:
481
- self.data_files[-1] = self._fuzzy_match_most_recent_folder(
482
- seq_file_dir, set(seq_file_dir.child_dirs)
483
- ).ok_value
434
+ self.data_files[-1] = self._fuzzy_match_most_recent_folder(
435
+ seq_file_dir
436
+ ).ok_value
484
437
  spectra: List[AgilentChannelChromatogramData] = []
485
438
  for row in self.data_files[-1].child_dirs:
486
439
  self.get_spectrum_at_channels(row)
@@ -499,17 +452,13 @@ class SequenceController(RunController):
499
452
  dir=custom_path,
500
453
  sequence_name="NA",
501
454
  ),
502
- child_dirs=None,
503
455
  ).ok_value
504
456
  )
505
457
  parent_dir = self.data_files[-1]
506
- if (
507
- len(parent_dir._data_files) != len(parent_dir.child_dirs)
508
- or len(parent_dir.child_dirs) == 0
509
- ):
510
- parent_dir = self._fuzzy_match_most_recent_folder(
511
- most_recent_folder=parent_dir, child_dirs=None
512
- )
458
+ parent_dir = self._fuzzy_match_most_recent_folder(
459
+ most_recent_folder=parent_dir,
460
+ ).ok_value
461
+ assert len(parent_dir.child_dirs) != 0
513
462
  spectra = self.get_data()
514
463
  reports = []
515
464
  for i, child_dir in enumerate(parent_dir.child_dirs):
@@ -252,7 +252,6 @@ class HPLCController:
252
252
  if len(self.sequence_controller.data_files):
253
253
  self.sequence_controller._fuzzy_match_most_recent_folder(
254
254
  most_recent_folder=self.sequence_controller.data_files[-1],
255
- child_dirs=set(),
256
255
  )
257
256
  return self.sequence_controller.data_files[-1]
258
257
  else:
@@ -88,10 +88,15 @@ class ABCCommunicationController(abc.ABC):
88
88
  :return: whether the HPLC machine is in a safe state to retrieve data back."""
89
89
  self.set_status()
90
90
  hplc_avail = isinstance(self._most_recent_hplc_status, HPLCAvailStatus)
91
- time.sleep(5)
91
+ time.sleep(10)
92
92
  self.set_status()
93
93
  hplc_actually_avail = isinstance(self._most_recent_hplc_status, HPLCAvailStatus)
94
- return hplc_avail and hplc_actually_avail
94
+ time.sleep(10)
95
+ self.set_status()
96
+ hplc_final_check_avail = isinstance(
97
+ self._most_recent_hplc_status, HPLCAvailStatus
98
+ )
99
+ return hplc_avail and hplc_actually_avail and hplc_final_check_avail
95
100
 
96
101
  def sleepy_send(self, cmd: Union[Command, str]):
97
102
  self.send("Sleep 0.1")
@@ -94,9 +94,7 @@ class RunController(ABCTableController, abc.ABC):
94
94
  return object.__new__(cls)
95
95
 
96
96
  @abc.abstractmethod
97
- def _fuzzy_match_most_recent_folder(
98
- self, most_recent_folder: T, child_dirs: Set[str]
99
- ) -> Result[T, str]:
97
+ def _fuzzy_match_most_recent_folder(self, most_recent_folder: T) -> Result[T, str]:
100
98
  pass
101
99
 
102
100
  @abc.abstractmethod
@@ -192,9 +190,7 @@ class RunController(ABCTableController, abc.ABC):
192
190
  else:
193
191
  raise ValueError("Timeout value is None, no comparison can be made.")
194
192
 
195
- check_folder = self._fuzzy_match_most_recent_folder(
196
- self.data_files[-1], self.current_run_child_files
197
- )
193
+ check_folder = self._fuzzy_match_most_recent_folder(self.data_files[-1])
198
194
  if check_folder.is_ok() and finished_run:
199
195
  return check_folder
200
196
  elif check_folder.is_ok():
@@ -0,0 +1,7 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class SignalRead:
6
+ on: bool
7
+ wavelength: int
@@ -13,13 +13,11 @@ class SequenceDataFiles:
13
13
 
14
14
  :param sequence_name: the name of the sequence that is running
15
15
  :param dir: the complete path of the directory generated for the sequence
16
- :param _data_files: the names of the files of the sequence runs, ends with ".D"
17
16
  :param child_dirs: the complete path of the files for sequence runs, contains the Chemstation data, `dir` and the sample run file.
18
17
  """
19
18
 
20
19
  sequence_name: str
21
20
  dir: str
22
- _data_files: List[str] = field(default_factory=list)
23
21
  child_dirs: List[str] = field(default_factory=list)
24
22
 
25
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pychemstation
3
- Version: 0.10.8.dev3
3
+ Version: 0.10.9
4
4
  Summary: Library to interact with Chemstation software, primarily used in Hein lab
5
5
  Project-URL: Documentation, https://pychemstation-e5a086.gitlab.io/pychemstation.html
6
6
  Project-URL: Repository, https://gitlab.com/heingroup/device-api/pychemstation
@@ -30,8 +30,7 @@ Description-Content-Type: text/markdown
30
30
  [![PyPI Latest Release](https://img.shields.io/pypi/v/pychemstation.svg)](https://pypi.org/project/pychemstation/)
31
31
 
32
32
  > **_NOTE:_** If you are running Python **3.8**, use versions 0.**8**.x. If you are running Python **3.9** use versions 0.**9**.x.
33
- > If you are running Python **>=3.10**, use version 0.**10**.x. You are welcome to use newer pychemstation versions with older Python versions, but functionality
34
- > is not guaranteed!
33
+ > If you are running Python **>=3.10**, use version 0.**10**.x. Older versions of pychemstation are not the most feature-rich and bug-free. Please consider upgrading to using Python 3.10!
35
34
 
36
35
  Unofficial Python package to control Agilent Chemstation; we are not affiliated with Agilent.
37
36
  Check out the [docs](https://pychemstation-e5a086.gitlab.io/pychemstation.html) for usage instructions. This project is under
@@ -73,21 +72,17 @@ HPLCTalk_Run
73
72
  ## Example Usage
74
73
 
75
74
  ```python
75
+ import time
76
76
  from pychemstation.control import HPLCController
77
77
  from pychemstation.utils.method_types import *
78
78
  import pandas as pd
79
79
 
80
- DEFAULT_METHOD_DIR = "C:\\ChemStation\\1\\Methods\\"
81
- SEQUENCE_DIR = "C:\\USERS\\PUBLIC\\DOCUMENTS\\CHEMSTATION\\3\\Sequence"
82
80
  DEFAULT_COMMAND_PATH = "C:\\Users\\User\\Desktop\\Lucy\\"
83
- DATA_DIR_2 = "C:\\Users\\Public\\Documents\\ChemStation\\2\\Data"
84
- DATA_DIR_3 = "C:\\Users\\Public\\Documents\\ChemStation\\3\\Data"
81
+ CUSTOM_DATA_DIR = "C:\\Users\\Public\\Documents\\ChemStation\\2\\Data\\MyData"
85
82
 
86
83
  # Initialize HPLC Controller
87
- hplc_controller = HPLCController(extra_data_dirs=[DATA_DIR_2, DATA_DIR_3],
88
- comm_dir=DEFAULT_COMMAND_PATH,
89
- method_dir=DEFAULT_METHOD_DIR,
90
- sequence_dir=SEQUENCE_DIR)
84
+ hplc_controller = HPLCController(extra_data_dirs=[CUSTOM_DATA_DIR],
85
+ comm_dir=DEFAULT_COMMAND_PATH)
91
86
 
92
87
  # Switching a method
93
88
  hplc_controller.switch_method("General-Poroshell")
@@ -116,7 +111,17 @@ new_method = MethodDetails(
116
111
  hplc_controller.edit_method(new_method)
117
112
 
118
113
  # Run a method and get a report or data from last run method
119
- hplc_controller.run_method(experiment_name="test_experiment")
114
+ hplc_controller.run_method(experiment_name="test_experiment", stall_while_running=False)
115
+ time_left, done = hplc_controller.check_method_complete()
116
+ while not done:
117
+ print(time_left)
118
+ time.sleep(time_left/2)
119
+ time_left, done = hplc_controller.check_method_complete()
120
+
121
+ # Save the path the HPLC data for later!
122
+ file_path = hplc_controller.get_last_run_method_file_path()
123
+
124
+ # Make sure CSV reports are being generated in the post-run MACRO!
120
125
  report = hplc_controller.get_last_run_method_report()
121
126
  vial_location = report.vial_location
122
127
 
@@ -2,40 +2,41 @@ pychemstation/__init__.py,sha256=Sc4z8LRVFMwJUoc_DPVUriSXTZ6PO9MaJ80PhRbKyB8,34
2
2
  pychemstation/analysis/__init__.py,sha256=mPNnp0TmkoUxrTGcT6wNKMyCiOar5vC0cTPmFLrDU1Q,313
3
3
  pychemstation/analysis/base_spectrum.py,sha256=HjbTPoueR7XB1_puCcmx7zbQmeT5SH6_HVwHrYhNXhA,16537
4
4
  pychemstation/analysis/chromatogram.py,sha256=Jk6xOMHA6kSV597fJDZgrFRlvVorldvK4zerPASZrug,3969
5
- pychemstation/analysis/process_report.py,sha256=aTsW6u5-0iwsH3jQtkoKE9jbsy5NAUG6l7O-I49B8kY,14650
5
+ pychemstation/analysis/process_report.py,sha256=GEazFm1asY1FZO87siiV9kWu2Wnbu7xwx86nlPeRexk,14728
6
6
  pychemstation/control/README.md,sha256=ohPn3xhgjFyPraQqR4x9aZhurQVAOYuYHv-E8sj0eK4,3124
7
7
  pychemstation/control/__init__.py,sha256=7lSkY7Qa7Ikdz82-2FESc_oqktv7JndsjltCkiMqnMI,147
8
- pychemstation/control/hplc.py,sha256=JrfkQ5Jt9K9kf5l2X5wQzuYaQvPEnDa_aAkCVeMBk0o,14244
8
+ pychemstation/control/hplc.py,sha256=Nw5rJAOsmW1W6faq4jRuMJlEoGda91kD9GqkRX2jcgk,14210
9
9
  pychemstation/control/controllers/README.md,sha256=S5cd4NJmPjs6TUH98BtPJJhiS1Lu-mxLCNS786ogOrQ,32
10
10
  pychemstation/control/controllers/__init__.py,sha256=q2TUEie3J-OLlxcGLkG7vIy8fazCEhHm61OGzJPbhD0,179
11
11
  pychemstation/control/controllers/comm.py,sha256=ySjgMBIfJ11sygXiZSPp9Rf6ABM4t6JhZRONRj1u2Cc,6652
12
12
  pychemstation/control/controllers/data_aq/__init__.py,sha256=w-Zgbit10niOQfz780ZmRHjUFxV1hMkdui7fOMPqeLA,132
13
- pychemstation/control/controllers/data_aq/method.py,sha256=KFKL8yt3lHxpgND52z4gN6TeMvnNaAOVetpO2su1GlU,24935
14
- pychemstation/control/controllers/data_aq/sequence.py,sha256=CgNPc-IaPXCHkkWjhb2UrxhDmAltUz7rPCiZa4O6ATw,20967
13
+ pychemstation/control/controllers/data_aq/method.py,sha256=sWtMjmBV-oY8dCxQbnksKvTVUtiH7rcq9cF1t-yoAKY,24787
14
+ pychemstation/control/controllers/data_aq/sequence.py,sha256=5JpXDWpS3JR2Cawn9RdUwOIYSipQPeB3OR7KW6muO6U,18623
15
15
  pychemstation/control/controllers/devices/__init__.py,sha256=QpgGnLXyWiB96KIB98wMccEi8oOUUaLxvBCyevJzcOg,75
16
16
  pychemstation/control/controllers/devices/injector.py,sha256=LyubM-fqf5ruseGx32deTDK-yevmaTOvdo6YKg2PF7I,4029
17
17
  pychemstation/generated/__init__.py,sha256=xnEs0QTjeuGYO3tVUIy8GDo95GqTV1peEjosGckpOu0,977
18
18
  pychemstation/generated/dad_method.py,sha256=xTUiSCvkXcxBUhjVm1YZKu-tHs16k23pF-0xYrQSwWA,8408
19
19
  pychemstation/generated/pump_method.py,sha256=s3MckKDw2-nZUC5lHrJVvXYdneWP8-9UvblNuGryPHY,12092
20
20
  pychemstation/utils/__init__.py,sha256=GZJyDzkhzrlMguxZTUpgthq72pA3YV23DJIR2Q63PCk,449
21
+ pychemstation/utils/device_types.py,sha256=X8LFRdZpOK3bmdLgKKpsi8N9T27bI0Tg6_qEG9QJEBs,98
21
22
  pychemstation/utils/injector_types.py,sha256=z2iWwTklGm0GRDCL9pnPCovQrwyRwxv8w5w5Xh7Pj3U,1152
22
23
  pychemstation/utils/macro.py,sha256=VGOU380ruJSKQhXJFI1g--qg4Xgx-e0D8z5FDPGe0cA,3433
23
24
  pychemstation/utils/method_types.py,sha256=ck8I4dRGhHXCUfBf3AT1OU1eCcSSZPgnlhvlLTfezEM,1562
24
25
  pychemstation/utils/num_utils.py,sha256=OpqZwMPoxTYkpjpinA1CcoQAXDY_0sie6d-hTU547uo,2087
25
26
  pychemstation/utils/parsing.py,sha256=mzdpxrH5ux4-_i4CwZvnIYnIwAnRnOptKb3fZyYJcx0,9307
26
- pychemstation/utils/sequence_types.py,sha256=JLGL7kCkPouHN7iBsnZfWe-nSjzF8XqFKzBPyF4SulE,2724
27
+ pychemstation/utils/sequence_types.py,sha256=H9htO2thyU9_KYOFBsGjlmA-4Nyd6aLd4D0MDLaXNCQ,2583
27
28
  pychemstation/utils/spec_utils.py,sha256=BtXgQndZy4kVKsrgEDxwNd0HctypnAt5upB9SOk1D9w,9700
28
29
  pychemstation/utils/table_types.py,sha256=ZmV52Vl1cYG_C1PEmVGB02mC3Dhfi7QMkUZwe0ujzAg,3748
29
30
  pychemstation/utils/tray_types.py,sha256=UeHM0hUYaNc9giT96ZiGpyWBPQwG-SyLA0rVGzDDAJk,6618
30
31
  pychemstation/utils/abc_tables/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- pychemstation/utils/abc_tables/abc_comm.py,sha256=gLvCiD8hDHXlMsiUzZX__g2kgFCeNnUIK7_nsLwI7Hc,5465
32
+ pychemstation/utils/abc_tables/abc_comm.py,sha256=7ywcufQZ7UWfNQdEEsfHqkA2CpRkt6ZlKYuLt9MXjvs,5656
32
33
  pychemstation/utils/abc_tables/device.py,sha256=v8MNFvymbKe4hWsqzO6Z_qsVvju_rISYtnPgaftecyE,919
33
- pychemstation/utils/abc_tables/run.py,sha256=Sr6Iz_YrwJ78HTNHFv6fTA-Kca8gP3Dic_-7-AriyOw,10140
34
+ pychemstation/utils/abc_tables/run.py,sha256=uURDl66Mga8NAMffOUsG6prKhjpLo1-p2Y2PUTY1hY0,10052
34
35
  pychemstation/utils/abc_tables/table.py,sha256=AbuitDcBHODV-KpxjL7ZPoE-TSa6gyG2uqXXY90Mv2o,7992
35
36
  pychemstation/utils/mocking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
37
  pychemstation/utils/mocking/mock_comm.py,sha256=vZeYBXaKBZOlJmhn4TSbkov62gqlkfztqf3MSFU9kLE,800
37
38
  pychemstation/utils/mocking/mock_hplc.py,sha256=esVIlU4oqEsYLPOQs0AeVnKv9l52xBGT6UY862l9RQE,1163
38
- pychemstation-0.10.8.dev3.dist-info/METADATA,sha256=v0QV6RM1Zumdp8W0qD8rNuy-O-b_Uov8uFcDBsA1FK4,5757
39
- pychemstation-0.10.8.dev3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
40
- pychemstation-0.10.8.dev3.dist-info/licenses/LICENSE,sha256=9bdF75gIf1MecZ7oymqWgJREVz7McXPG-mjqrTmzzD8,18658
41
- pychemstation-0.10.8.dev3.dist-info/RECORD,,
39
+ pychemstation-0.10.9.dist-info/METADATA,sha256=MecxkFDPopIv07Hrp-6togcH6zo6AbBswERVRw2sbvU,5848
40
+ pychemstation-0.10.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
41
+ pychemstation-0.10.9.dist-info/licenses/LICENSE,sha256=9bdF75gIf1MecZ7oymqWgJREVz7McXPG-mjqrTmzzD8,18658
42
+ pychemstation-0.10.9.dist-info/RECORD,,