QuLab 2.9.1__cp312-cp312-macosx_10_13_universal2.whl → 2.9.3__cp312-cp312-macosx_10_13_universal2.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.
qulab/executor/load.py CHANGED
@@ -421,14 +421,10 @@ def _load_workflow_list(workflow, lst, code_path):
421
421
  for i, n in enumerate(lst):
422
422
  try:
423
423
  ret.append(load_workflow(n, code_path, mtime=workflow.__mtime__))
424
- except TemplateKeyError:
425
- raise TemplateKeyError(
426
- f"Workflow {workflow.__workflow_id__} missing key in {i}th {n[0]} dependent mapping."
427
- )
428
- except TemplateTypeError:
429
- raise TemplateTypeError(
430
- f"Workflow {workflow.__workflow_id__} type error in {i}th {n[0]} dependent mapping."
431
- )
424
+ except TemplateKeyError as e:
425
+ msg, *_ = e.args
426
+ e.args = (f"Workflow {workflow.__workflow_id__} entry {i}: {msg}", )
427
+ raise e
432
428
  return ret
433
429
 
434
430
 
@@ -470,8 +466,7 @@ def get_entries(workflow: WorkflowType,
470
466
 
471
467
  def make_graph(workflow: WorkflowType, graph: dict, code_path: str | Path):
472
468
  if workflow.__workflow_id__ in graph:
473
- raise graphlib.CycleError(
474
- f"Workflow {workflow.__workflow_id__} has a circular dependency")
469
+ return graph
475
470
  graph[workflow.__workflow_id__] = []
476
471
 
477
472
  if hasattr(workflow, 'entries'):
@@ -77,16 +77,18 @@ class TemplateVarExtractor(ast.NodeVisitor):
77
77
  if not isinstance(arg, ast.Constant) or not isinstance(
78
78
  arg.value, str):
79
79
  raise SyntaxError(
80
- f"Argument of VAR function must be a string. {self.fname}:{node.lineno}"
80
+ f"Argument of VAR function must be a string."
81
+ f" {self.fname}:{node.lineno}"
81
82
  )
82
83
  if len(node.args) != 1:
83
84
  raise SyntaxError(
84
- f"VAR function only accept one argument. {self.fname}:{node.lineno}"
85
+ f"VAR function only accept one argument."
86
+ f" {self.fname}:{node.lineno}"
85
87
  )
86
88
  default = _notset
87
89
  for k in node.keywords:
88
90
  if k.arg == 'default':
89
- pass
91
+ default = k.value
90
92
  # if isinstance(k.value, ast.Constant):
91
93
  # # default = k.value.value
92
94
  # default = k.value
@@ -97,7 +99,8 @@ class TemplateVarExtractor(ast.NodeVisitor):
97
99
  # # )
98
100
  else:
99
101
  raise SyntaxError(
100
- f"VAR function only accept keyword argument 'default'. {self.fname}:{node.lineno}"
102
+ f"VAR function only accept keyword argument 'default'."
103
+ f" {self.fname}:{node.lineno}"
101
104
  )
102
105
 
103
106
  if default is _notset:
@@ -107,7 +110,8 @@ class TemplateVarExtractor(ast.NodeVisitor):
107
110
  # ctx=ast.Load())
108
111
  if arg.value not in self.mapping:
109
112
  raise TemplateKeyError(
110
- f"The variable '{arg.value}' is not provided in mapping. {self.fname}:{node.lineno}"
113
+ f"The variable '{arg.value}' is not provided in mapping."
114
+ f" {self.fname}:{node.lineno}"
111
115
  )
112
116
  self.replacements[(node.lineno, node.end_lineno,
113
117
  node.col_offset,
@@ -147,12 +151,13 @@ class TemplateVarExtractor(ast.NodeVisitor):
147
151
  for var_name in template.get_identifiers():
148
152
  if var_name not in self.mapping:
149
153
  raise TemplateKeyError(
150
- f"The variable '{var_name}' is not provided in mapping. {self.fname}:{current_lineno}"
151
- )
154
+ f"The variable '{var_name}' is not provided in mapping."
155
+ f" {self.fname}:{current_lineno}")
152
156
  if not isinstance(self.mapping[var_name], str):
153
157
  raise TemplateTypeError(
154
- f"Mapping value for '{var_name}' must be a string. {self.fname}:{current_lineno}"
155
- )
158
+ f"Mapping value for '{var_name}' must be a string,"
159
+ f" but got {type(self.mapping[var_name])}."
160
+ f" {self.fname}:{current_lineno}")
156
161
  self.str_variables.add(var_name)
157
162
  start, stop = 0, len(line)
158
163
  if current_lineno == lineno:
@@ -208,20 +213,25 @@ def inject_mapping(source: str, mapping: dict[str, Any],
208
213
  lines[end_lineno - 1]) - length_of_last_line
209
214
  else:
210
215
  pattern = re.compile(
211
- r'VAR\s*\(\s*' # VAR(
212
- r'(["\'])(\w+)\1' # 第一个参数(引号包裹的变量名)
213
- r'(?:\s*,\s*(.*?))?' # 可选的其他参数
214
- r'\s*\)', # 闭合括号
215
- re.DOTALL # 允许.匹配换行符
216
+ r'VAR\s*\(\s*' # VAR(
217
+ r'(["\'])(\w+)\1' # 捕获引号和变量名
218
+ r'(?:\s*,\s*default\s*=\s*' # 匹配 default 参数
219
+ r'([^),]*)' # 捕获 default 值(排除逗号和括号)
220
+ r')?' # 可选参数组
221
+ r'\s*\)', # 闭合括号
222
+ re.DOTALL
216
223
  ) # yapf: disable
217
224
 
218
225
  def replacement(match):
219
226
  quote = match.group(1)
220
227
  var_name = match.group(2)
221
- extra_args = match.group(3)
228
+ default_value = match.group(3)
229
+
222
230
  base = f'__VAR_{hash_str}'
223
- if extra_args is not None:
224
- return f'{base}.get({quote}{var_name}{quote}, {extra_args})'
231
+ if default_value is not None:
232
+ # 清除 default 值前后的空格
233
+ clean_value = default_value.strip()
234
+ return f'{base}.get({quote}{var_name}{quote}, {clean_value})'
225
235
  else:
226
236
  return f'{base}[{quote}{var_name}{quote}]'
227
237
 
Binary file
qulab/scan/server.py CHANGED
@@ -125,7 +125,8 @@ def get_record(session: Session, id: int, datapath: Path) -> Record:
125
125
  record = record_cache[id][1]
126
126
  clear_cache()
127
127
  logger.debug(f"update lru time for record cache: {id=}")
128
- record_cache[id] = time.time(), record
128
+ if record:
129
+ record_cache[id] = time.time(), record
129
130
  return record
130
131
 
131
132
 
qulab/sys/__init__.py CHANGED
@@ -0,0 +1,2 @@
1
+ from .device import (BaseDevice, VisaDevice, action, create_device, delete,
2
+ exclude, get, post, set)
@@ -1,6 +1,7 @@
1
1
  import itertools
2
2
  import logging
3
3
  import re
4
+ import string
4
5
  from collections import defaultdict
5
6
  from functools import partial
6
7
  from typing import Any, Callable, Literal, NamedTuple
@@ -87,7 +88,8 @@ def _add_action(attrs: dict, key: str, method: str, func: Callable, doc: dict,
87
88
  matrix[arg] = attrs[arg]
88
89
  for values in itertools.product(*[matrix[arg] for arg in arguments]):
89
90
  kwds = dict(zip(arguments, values))
90
- mapping[key.format(**kwds)] = partial(func, **kwds)
91
+ # mapping[key.format(**kwds)] = partial(func, **kwds)
92
+ mapping[string.Template(key).substitute(kwds)] = partial(func, **kwds)
91
93
 
92
94
 
93
95
  def _build_docs(mapping: dict, attrs: dict) -> str:
@@ -180,6 +182,8 @@ class BaseDevice(metaclass=DeviceMeta):
180
182
 
181
183
  class VisaDevice(BaseDevice):
182
184
 
185
+ error_query = 'SYST:ERR?'
186
+
183
187
  def open(self) -> None:
184
188
  import pyvisa
185
189
  kwds = self.options.copy()
@@ -188,6 +192,7 @@ class VisaDevice(BaseDevice):
188
192
  else:
189
193
  rm = pyvisa.ResourceManager()
190
194
  self.resource = rm.open_resource(self.address, **kwds)
195
+ self.errors = []
191
196
 
192
197
  def close(self) -> None:
193
198
  self.resource.close()
@@ -196,6 +201,15 @@ class VisaDevice(BaseDevice):
196
201
  super().reset()
197
202
  self.resource.write('*RST')
198
203
 
204
+ def check_error(self):
205
+ if self.error_query:
206
+ while True:
207
+ error = self.resource.query(self.error_query)
208
+ error_code = int(error.split(',')[0])
209
+ if error_code == 0:
210
+ break
211
+ self.errors.append(error)
212
+
199
213
  @get('idn')
200
214
  def get_idn(self) -> str:
201
215
  """Get instrument identification."""
@@ -209,13 +223,9 @@ class VisaDevice(BaseDevice):
209
223
  @get('errors')
210
224
  def get_errors(self) -> list[str]:
211
225
  """Get error queue."""
212
- errors = []
213
- while True:
214
- error = self.resource.query('SYST:ERR?')
215
- error_code = int(error.split(',')[0])
216
- if error_code == 0:
217
- break
218
- errors.append(error)
226
+ self.check_error()
227
+ errors = self.errors
228
+ self.errors = []
219
229
  return errors
220
230
 
221
231
  @set('timeout')
@@ -79,7 +79,7 @@ def create_device(driver_name: str, *args, **kwds) -> BaseDevice:
79
79
  except:
80
80
  pass
81
81
 
82
- dev = create_device_from_module(f"waveforms.sys.drivers.{driver_name}",
82
+ dev = create_device_from_module(f"qulab.sys.drivers.{driver_name}",
83
83
  args, kwds)
84
84
  return dev
85
85
  except:
@@ -1,4 +1,6 @@
1
- from waveforms.sys.device import BaseDevice, exclude, get, set
1
+ import numpy as np
2
+
3
+ from qulab.sys import BaseDevice, exclude, get, set
2
4
 
3
5
 
4
6
  class Device(BaseDevice):
@@ -12,41 +14,55 @@ class Device(BaseDevice):
12
14
  def get_idn(self) -> str:
13
15
  return 'Fake Instrument'
14
16
 
15
- @set('{channel}.Vpp', channel=exclude(['M1', 'M2']))
17
+ @get('${channel_type}${channel_num}.SampleRate',
18
+ channel_type=['X', 'Y'],
19
+ channel_num=[1, 2, 3, 4])
20
+ def get_sample_rate_DDS(self, channel_type: str,
21
+ channel_num: int) -> float:
22
+ return 6e9
23
+
24
+ @get('${channel}.SampleRate', channel=['Z1', 'Z2', 'Z3', 'Z4'])
25
+ def get_sample_rate_Z(self, channel: str) -> float:
26
+ return 2e9
27
+
28
+ @get('${channel}.SampleRate', channel=['M1', 'M2'])
29
+ def get_sample_rate_AD(self, channel: str) -> float:
30
+ return 1e9
31
+
32
+ @set('${channel}.Vpp', channel=exclude(['M1', 'M2']))
16
33
  def set_voltage(self, value: float, channel: str) -> None:
17
34
  self.log.info(f'Set {channel} Vpp to {value}')
18
35
 
19
- @get('{channel}.Vpp', channel=exclude(['M1', 'M2']))
20
- def get_voltage(self, channel: str, default=0.0) -> float:
21
- return self._status.get(f'{channel}.Vpp', default)
36
+ # @get('${channel}.Vpp', channel=exclude(['M1', 'M2']))
37
+ # def get_voltage(self, channel: str, default=0.0) -> float:
38
+ # return self._status.get(f'{channel}.Vpp', default)
22
39
 
23
- @set('{channel}.Offset', channel=exclude(['M1', 'M2']))
24
- def set_frequency(
40
+ @set('${channel}.Offset', channel=exclude(['M1', 'M2']))
41
+ def set_offset(
25
42
  self,
26
43
  value: float,
27
44
  channel: str,
28
45
  ) -> None:
29
46
  self.log.info(f'Set {channel} offset to {value}')
30
47
 
31
- @get('{channel}.Offset', channel=exclude(['M1', 'M2']))
32
- def get_frequency(self, channel: str, default=0.0) -> float:
33
- return self._status.get(f'{channel}.Offset', default)
48
+ # @get('${channel}.Offset', channel=exclude(['M1', 'M2']))
49
+ # def get_offset(self, channel: str, default=0.0) -> float:
50
+ # return self._status.get(f'{channel}.Offset', default)
34
51
 
35
- @set('{channel}.Waveform', channel=exclude(['M1', 'M2']))
52
+ @set('${channel}.Waveform', channel=exclude(['M1', 'M2']))
36
53
  def set_waveform(self, value, channel: str) -> None:
37
54
  self.log.info(f'Set {channel} waveform to {value!r}')
38
55
 
39
- @get('{channel}.Waveform', channel=exclude(['M1', 'M2']))
40
- def get_waveform(self, channel: str, default=None) -> str:
41
- return self._status.get(f'{channel}.Waveform', default)
56
+ # @get('${channel}.Waveform', channel=exclude(['M1', 'M2']))
57
+ # def get_waveform(self, channel: str, default=None) -> str:
58
+ # return self._status.get(f'{channel}.Waveform', default)
42
59
 
43
- @set('{channel}.Size', channel=['M1', 'M2'])
60
+ @set('${channel}.Size', channel=['M1', 'M2'])
44
61
  def set_size(self, value, channel: str) -> None:
45
62
  self.log.info(f'Set {channel} size to {value!r}')
46
63
 
47
- @get('{channel}.Trace', channel=['M1', 'M2'])
48
- def get_size(self, channel: str) -> str:
49
- import numpy as np
64
+ @get('${channel}.Trace', channel=['M1', 'M2'])
65
+ def get_random_data(self, channel: str) -> np.ndarray:
50
66
  size = self._status.get(f'{channel}.Size', 1024)
51
67
  shots = self._status.get(f'{channel}.Shots', 128)
52
68
  return np.random.randn(shots, size)
qulab/sys/net/nginx.py CHANGED
@@ -6,6 +6,9 @@ from fastapi import FastAPI, Request
6
6
  from fastapi.responses import Response
7
7
  from pydantic import BaseModel
8
8
 
9
+ NGINX_DIR = 'C:/Users/Administrator/Desktop/nginx/nginx-1.20.2'
10
+ HOST_URL = 'https://systemq.baqis.ac.cn'
11
+
9
12
  db = {
10
13
  "n01": {
11
14
  "notebook_port": 1000,
@@ -28,7 +31,8 @@ db = {
28
31
  }
29
32
 
30
33
 
31
- def fmt_config(ip, notebook_port, codeserver_port, local_notebook_port, local_codeserver_port, page):
34
+ def fmt_config(ip, notebook_port, codeserver_port, local_notebook_port,
35
+ local_codeserver_port, page):
32
36
  return """
33
37
  server {""" + f"""
34
38
  listen {notebook_port} ssl;
@@ -108,6 +112,7 @@ server {""" + f"""
108
112
  }
109
113
  """
110
114
 
115
+
111
116
  def fmt_page(notebook_url, codeserver_url):
112
117
  return """
113
118
  <!DOCTYPE html>
@@ -142,7 +147,7 @@ class Node(BaseModel):
142
147
  app = FastAPI()
143
148
 
144
149
 
145
- @app.post("/ping")
150
+ @app.post("/auth")
146
151
  async def auth(request: Request, node: Node):
147
152
  try:
148
153
  assert node.name in db
@@ -156,34 +161,31 @@ async def auth(request: Request, node: Node):
156
161
  else:
157
162
  print(" CHANGE IP", db[node.name]['ip'], "===>", ip)
158
163
  db[node.name]['ip'] = ip
159
-
164
+
160
165
  #ip = request.headers.get('x-real-ip')
161
166
  local_notebook_port = node.notebook_port
162
167
  local_codeserver_port = node.codeserver_port
163
168
  codeserver_path = quote_plus(node.codeserver_path)
164
169
 
165
- codeserver_url = f"https://systemq.baqis.ac.cn:{codeserver_port}?tkn=lZBAQISFF532&folder={codeserver_path}"
166
- notebook_url = f"https://systemq.baqis.ac.cn:{notebook_port}/tree"
170
+ codeserver_url = f"{HOST_URL}:{codeserver_port}?tkn=lZBAQISFF532&folder={codeserver_path}"
171
+ notebook_url = f"{HOST_URL}:{notebook_port}/tree"
167
172
 
168
173
  page = fmt_page(notebook_url, codeserver_url)
169
174
  page = ''.join(page.splitlines())
170
175
 
171
- config = fmt_config(ip, notebook_port, codeserver_port, local_notebook_port, local_codeserver_port, page)
176
+ config = fmt_config(ip, notebook_port, codeserver_port,
177
+ local_notebook_port, local_codeserver_port, page)
172
178
 
173
- with open(
174
- f"C:/Users/Administrator/Desktop/nginx/nginx-1.20.2/conf/servers/{node.name}.conf",
175
- "w") as f:
179
+ with open(f"{NGINX_DIR}/conf/servers/{node.name}.conf", "w") as f:
176
180
  f.write(config)
177
181
 
178
182
  await asyncio.sleep(0.1)
179
-
183
+
180
184
  cwd = os.getcwd()
181
185
 
182
- os.chdir(r'C:\Users\Administrator\Desktop\nginx\nginx-1.20.2')
186
+ os.chdir(NGINX_DIR)
183
187
 
184
- os.system(
185
- r'C:\Users\Administrator\Desktop\nginx\nginx-1.20.2\nginx.exe -s reload'
186
- )
188
+ os.system(f'{NGINX_DIR}/nginx.exe -s reload')
187
189
 
188
190
  os.chdir(cwd)
189
191
 
qulab/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "2.9.1"
1
+ __version__ = "2.9.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: QuLab
3
- Version: 2.9.1
3
+ Version: 2.9.3
4
4
  Summary: contral instruments and manage data
5
5
  Author-email: feihoo87 <feihoo87@gmail.com>
6
6
  Maintainer-email: feihoo87 <feihoo87@gmail.com>
@@ -1,19 +1,19 @@
1
1
  qulab/__init__.py,sha256=JZ3bn_kTVlnY-P8JXQ5xEdViieFXqfxX8ReLuiiXIpo,321
2
2
  qulab/__main__.py,sha256=fjaRSL_uUjNIzBGNgjlGswb9TJ2VD5qnkZHW3hItrD4,68
3
3
  qulab/dicttree.py,sha256=tRRMpGZYVOLw0TEByE3_2Ss8FdOmzuGL9e1DWbs8qoY,13684
4
- qulab/fun.cpython-312-darwin.so,sha256=5vT_a76K8UyikVw-R8VKbR08kTO-M0yFniLKuka5OP4,126864
4
+ qulab/fun.cpython-312-darwin.so,sha256=c4Exi4c5KbqN57PbTrNLgeKoYcwSMJILwuFinTm-eio,126864
5
5
  qulab/typing.py,sha256=vg62sGqxuD9CI5677ejlzAmf2fVdAESZCQjAE_xSxPg,69
6
6
  qulab/utils.py,sha256=BdLdlfjpe6m6gSeONYmpAKTTqxDaYHNk4exlz8kZxTg,2982
7
- qulab/version.py,sha256=PI0CClL_hygeEn74dTBxg_JTTS5dp_WnkPKZJhTgaAo,21
7
+ qulab/version.py,sha256=7AHVAaKthvCbj8kmzQbs612AcCI58T1bx-FbdBObElA,21
8
8
  qulab/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  qulab/cli/commands.py,sha256=tgDIkkeIoasQXAifJZ6NU8jDgpNgb2a-B0C4nF0evrE,559
10
10
  qulab/cli/config.py,sha256=Ei7eSYnbwPPlluDnm8YmWONYiI4g7WtvlZGQdr1Z6vo,3688
11
11
  qulab/executor/__init__.py,sha256=LosPzOMaljSZY1thy_Fxtbrgq7uubJszMABEB7oM7tU,101
12
12
  qulab/executor/cli.py,sha256=8d-8bRWZ5lmsMtjASsl1zu1rV-syeAESMNVthvIQxlo,10018
13
- qulab/executor/load.py,sha256=zWofQqHujDyS6HykKEj3fytazA2qEGmB2ZF3OPScSFY,17566
13
+ qulab/executor/load.py,sha256=dUJFpPsDAe-9A19S645ESjymDv5drXToAFCQxGDdL4s,17266
14
14
  qulab/executor/schedule.py,sha256=0BV5LGxhqdIlGwW6-o5_5mljAtdtL1La8EDNBFi8pzU,18585
15
15
  qulab/executor/storage.py,sha256=OA_XMDoFDfPZCU89caf9-VZ3D6qaWib8MpJno10KUfc,20770
16
- qulab/executor/template.py,sha256=BhNP8GrTk0pCK3GwijI08Q2jmYPbLi_7A5XWZXhCtUo,10123
16
+ qulab/executor/template.py,sha256=_HEtsUQ5_jSujCw8FBDAK1PRTMRCa4iD4DduHIpjo3c,10569
17
17
  qulab/executor/transform.py,sha256=BDx0c4nqTHMAOLVqju0Ydd91uxNm6EpVIfssjZse0bI,2284
18
18
  qulab/executor/utils.py,sha256=l_b0y2kMwYKyyXeFtoblPYwKNU-wiFQ9PMo9QlWl9wE,6213
19
19
  qulab/monitor/__init__.py,sha256=nTHelnDpxRS_fl_B38TsN0njgq8eVTEz9IAnN3NbDlM,42
@@ -34,7 +34,7 @@ qulab/scan/optimize.py,sha256=VT9TpuqDkG7FdJJkYy60r5Pfrmjvfu5i36Ru6XvIiTI,2561
34
34
  qulab/scan/query.py,sha256=-5uHMhXSyGovK1oy_uUbGVEbRFzaMBkP78ZMNfI3jD0,11809
35
35
  qulab/scan/record.py,sha256=yIHPANf6nuBXy8Igf-dMtGJ7wuFTLYlBaaAUc0AzwyU,21280
36
36
  qulab/scan/scan.py,sha256=iXvbnXLZvHa4v88MlYiZ_LYubEB7ZfbX7OiFTMhl_1o,39479
37
- qulab/scan/server.py,sha256=XVwr8EC1iFhSAmecFZPWvn7N2O5MT65oZCd56GxDdIg,20035
37
+ qulab/scan/server.py,sha256=PEtitQeejAD11HYwTs1o1kJwkK7BkN0oLhn2_Pypk9M,20054
38
38
  qulab/scan/space.py,sha256=OQLepiNNP5TNYMHXeVFT59lL5n4soPmnMoMy_o9EHt0,6696
39
39
  qulab/scan/utils.py,sha256=SzJ_c4cLZJzERZr_CJO1_4juOxjfwCpU2K1mkc1PWGM,6124
40
40
  qulab/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -55,15 +55,15 @@ qulab/storage/models/models.py,sha256=JUqtvk8ywulkcFL38WfTviuVOcdvSGakZYJS7jAPNi
55
55
  qulab/storage/models/record.py,sha256=L0k531bGF9JN-GLv3hG87tB7k0kuSBkEeC9vi6_qywE,4970
56
56
  qulab/storage/models/report.py,sha256=j9ByrVoue-rwaXcnfTzVOSf1xDJdlZJq666agF0AZRY,798
57
57
  qulab/storage/models/tag.py,sha256=c3cTxpJUoG9L6xyDvVuagYVhB32amzbkBOmVeRIZ5Zo,2339
58
- qulab/sys/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
+ qulab/sys/__init__.py,sha256=-XRZUpLakoCDsNEmwtW6IG7vjvX0MPzEIuD2KXc9yAg,122
59
59
  qulab/sys/chat.py,sha256=DlFLP_gbVyL8fDUyad6Xu8sjQCZJauLIvF31mj5BtMs,22449
60
60
  qulab/sys/ipy_events.py,sha256=qvsqs7-CYQ-P4WtSe9UUZZ0tC88XxPMd9DM4LJALgEk,2889
61
61
  qulab/sys/progress.py,sha256=Tk1B96_1QrlI4yU0cyZlf2wVsF238DjQGqXJVG2j4t0,5350
62
62
  qulab/sys/device/__init__.py,sha256=bDqJrYQJx8YR4u_CYvJPpIBr6whP7pVnxnROTHk_yhA,149
63
- qulab/sys/device/basedevice.py,sha256=wMI93Y3Qz0oWYartWIVKoYEoOnuEaz_GRq3Ucw6brBk,6475
64
- qulab/sys/device/loader.py,sha256=AL0rNF4UZ-CUHoF8FNtT_ZGLwySvz7SDPsKALaJS8po,2501
63
+ qulab/sys/device/basedevice.py,sha256=IIN9IVxoW9RdRepeSI7ilHw39uvus9o3POhSfjom5yM,6778
64
+ qulab/sys/device/loader.py,sha256=BBcEnuQzCM6-ulJZ3nnf6xF3wSvUh02LLMN-cTY0ODE,2497
65
65
  qulab/sys/device/utils.py,sha256=4NG_OKMDRdVH8YKHNf6kVocevXf7bqyf1PiGctTF_oA,2314
66
- qulab/sys/drivers/FakeInstrument.py,sha256=kwIXN-dHmvGYBinmcCLxUQKm0ENiJpsMwgQIYNLDS2k,1867
66
+ qulab/sys/drivers/FakeInstrument.py,sha256=gG75d8z-GNNFDf5VcHa0Q9uTXXnGnMqsWgsNgMdnYm4,2411
67
67
  qulab/sys/drivers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  qulab/sys/net/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  qulab/sys/net/bencoder.py,sha256=p85DtmVy3cna3Da07boau77el2Cnym5-mKGF4xCJSy4,4959
@@ -72,7 +72,7 @@ qulab/sys/net/dhcp.py,sha256=gT5ehyvwW3y8E5u_DnYRd5I0KaddonmQJFVhlIS2yxM,23509
72
72
  qulab/sys/net/dhcpd.py,sha256=pNC47i-hu8HTzCrKU0PatL3AbgEqe1ovmpLPwNoZLa8,5322
73
73
  qulab/sys/net/kad.py,sha256=gGYb9cXbAdbYhubQdCRqOGigllBy0kSUp4z3_f3AWz0,38981
74
74
  qulab/sys/net/kcp.py,sha256=oFyiosQ1o0qeVA9hODIYEZtJj4HN1aNLGVP6vbxouMs,5761
75
- qulab/sys/net/nginx.py,sha256=QAQthr_Dux7xRpgqeY6BVxxre4dg0WJITztSk8Fn-jU,4964
75
+ qulab/sys/net/nginx.py,sha256=8dH76kQzB7coJ-VUCVggfSyjI86GsripDi6nlBrssM0,4890
76
76
  qulab/sys/rpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  qulab/sys/rpc/client.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
78
  qulab/sys/rpc/exceptions.py,sha256=djK44hYVMixF2Y-lAXDGHlyyCmYGw7EJjB3I0ttejok,2567
@@ -97,9 +97,9 @@ qulab/visualization/plot_seq.py,sha256=UWTS6p9nfX_7B8ehcYo6UnSTUCjkBsNU9jiOeW2ca
97
97
  qulab/visualization/qdat.py,sha256=ZeevBYWkzbww4xZnsjHhw7wRorJCBzbG0iEu-XQB4EA,5735
98
98
  qulab/visualization/rot3d.py,sha256=lMrEJlRLwYe6NMBlGkKYpp_V9CTipOAuDy6QW_cQK00,734
99
99
  qulab/visualization/widgets.py,sha256=6KkiTyQ8J-ei70LbPQZAK35wjktY47w2IveOa682ftA,3180
100
- qulab-2.9.1.dist-info/licenses/LICENSE,sha256=PRzIKxZtpQcH7whTG6Egvzl1A0BvnSf30tmR2X2KrpA,1065
101
- qulab-2.9.1.dist-info/METADATA,sha256=_cdzTIx-TpGTVj94TqmLcwMapxPz0LVn4DNAZoJw2ZU,3720
102
- qulab-2.9.1.dist-info/WHEEL,sha256=9_3tTSxMJq-dgdzMiScNvtT5eTBVd3l6RgHS7HwTzpA,115
103
- qulab-2.9.1.dist-info/entry_points.txt,sha256=b0v1GXOwmxY-nCCsPN_rHZZvY9CtTbWqrGj8u1m8yHo,45
104
- qulab-2.9.1.dist-info/top_level.txt,sha256=3T886LbAsbvjonu_TDdmgxKYUn939BVTRPxPl9r4cEg,6
105
- qulab-2.9.1.dist-info/RECORD,,
100
+ qulab-2.9.3.dist-info/licenses/LICENSE,sha256=PRzIKxZtpQcH7whTG6Egvzl1A0BvnSf30tmR2X2KrpA,1065
101
+ qulab-2.9.3.dist-info/METADATA,sha256=17sWryE2JrXI4Zsv1ofhNqGlG7uvomtC7o7DuV9GD9E,3720
102
+ qulab-2.9.3.dist-info/WHEEL,sha256=9_3tTSxMJq-dgdzMiScNvtT5eTBVd3l6RgHS7HwTzpA,115
103
+ qulab-2.9.3.dist-info/entry_points.txt,sha256=b0v1GXOwmxY-nCCsPN_rHZZvY9CtTbWqrGj8u1m8yHo,45
104
+ qulab-2.9.3.dist-info/top_level.txt,sha256=3T886LbAsbvjonu_TDdmgxKYUn939BVTRPxPl9r4cEg,6
105
+ qulab-2.9.3.dist-info/RECORD,,
File without changes