QuLab 2.4.15__cp311-cp311-win_amd64.whl → 2.4.17__cp311-cp311-win_amd64.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: QuLab
3
- Version: 2.4.15
3
+ Version: 2.4.17
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,17 +1,17 @@
1
1
  qulab/__init__.py,sha256=vkFybY8YSsQilYdThPRD83-btPAR41sy_WCXiM-6mME,141
2
2
  qulab/__main__.py,sha256=g9iBs8xxX6Yik7cmgllQkpBN8C4JNoZVsEOyCCLCyFU,63
3
3
  qulab/dicttree.py,sha256=ZoSJVWK4VMqfzj42gPb_n5RqLlM6K1Me0WmLIfLEYf8,14195
4
- qulab/fun.cp311-win_amd64.pyd,sha256=EIukgpUfAMTwdIoEcGJZBLGKAwiHnUEh1iIL9fUioxs,31744
5
- qulab/version.py,sha256=QW2MBz1JeuFtoyMh-qAewXiVGQGFzZAiBx69V3wIX5U,22
4
+ qulab/fun.cp311-win_amd64.pyd,sha256=H1XtP6wtWvUAQY8wmhNWbq2MJGwYoujLil94KpfThb4,31744
5
+ qulab/version.py,sha256=7sdjAp5MKcoRwUjjN0nAZGMtB3lz4cfXjSGNTq8NnJ4,22
6
6
  qulab/cli/__init__.py,sha256=6xd2eYw32k1NmfAuYSu__1kaP12Oz1QVqwbkYXdWno4,588
7
7
  qulab/cli/config.py,sha256=gvMObzaVJ-xTJ1GmhP3sATayfDasYlijX1krSGeccNY,3071
8
8
  qulab/executor/__init__.py,sha256=LosPzOMaljSZY1thy_Fxtbrgq7uubJszMABEB7oM7tU,101
9
- qulab/executor/cli.py,sha256=LRSb5-J8Tn7dj-fxwCp3OP_6YUgPRoY-f8O18sbWG8I,5164
10
- qulab/executor/load.py,sha256=4qQrw9O5dmWYYwxWt15z7uc6B3YuRB7xKgKi0g8-YtA,10418
9
+ qulab/executor/cli.py,sha256=9x7yCvEI41MaALE5Hv9-15Z_IGs2_Kswo3EjCoh_RPE,5595
10
+ qulab/executor/load.py,sha256=eKysHL5EHKd_YcfHOVwRoaNsD-k0cTuxDY_7Yn5W8hA,11078
11
11
  qulab/executor/schedule.py,sha256=SfMZys8WdmIvfW5fPM42g-F6XwewTdpC0-puhf5TA54,11721
12
12
  qulab/executor/storage.py,sha256=M66Q5_Uc5MMfc_QAuuaaexwAz7wxBPMkeleB5nRpQmI,4621
13
13
  qulab/executor/transform.py,sha256=inaOn6eqCs22ZZ0xAQl8s8YCoEACaXSwFNNu7jqdwAk,2148
14
- qulab/executor/utils.py,sha256=jp3F0swO9gpKhmTauxbgEK9WVorjI9FAL6zT60cYTdk,3106
14
+ qulab/executor/utils.py,sha256=RmnT0wMTAvavM-abgFt2tQN8TaaHuk86-YAiOUQCoBU,3101
15
15
  qulab/monitor/__init__.py,sha256=xEVDkJF8issrsDeLqQmDsvtRmrf-UiViFcGTWuzdlFU,43
16
16
  qulab/monitor/__main__.py,sha256=k2H1H5Zf9LLXTDLISJkbikLH-z0f1e5i5i6wXXYPOrE,105
17
17
  qulab/monitor/config.py,sha256=y_5StMkdrbZO1ziyKBrvIkB7Jclp9RCPK1QbsOhCxnY,785
@@ -91,9 +91,9 @@ qulab/visualization/plot_seq.py,sha256=Uo1-dB1YE9IN_A9tuaOs9ZG3S5dKDQ_l98iD2Wbxp
91
91
  qulab/visualization/qdat.py,sha256=HubXFu4nfcA7iUzghJGle1C86G6221hicLR0b-GqhKQ,5887
92
92
  qulab/visualization/rot3d.py,sha256=jGHJcqj1lEWBUV-W4GUGONGacqjrYvuFoFCwPse5h1Y,757
93
93
  qulab/visualization/widgets.py,sha256=HcYwdhDtLreJiYaZuN3LfofjJmZcLwjMfP5aasebgDo,3266
94
- QuLab-2.4.15.dist-info/LICENSE,sha256=b4NRQ-GFVpJMT7RuExW3NwhfbrYsX7AcdB7Gudok-fs,1086
95
- QuLab-2.4.15.dist-info/METADATA,sha256=9k0ereN9Bo_fbFCBZtL5IHpTeyNuG4zJE8H7PxVzRPM,3804
96
- QuLab-2.4.15.dist-info/WHEEL,sha256=yNnHoQL2GZYIUXm9YvoaBpFjGlUoK9qq9oqYeudrWlE,101
97
- QuLab-2.4.15.dist-info/entry_points.txt,sha256=b0v1GXOwmxY-nCCsPN_rHZZvY9CtTbWqrGj8u1m8yHo,45
98
- QuLab-2.4.15.dist-info/top_level.txt,sha256=3T886LbAsbvjonu_TDdmgxKYUn939BVTRPxPl9r4cEg,6
99
- QuLab-2.4.15.dist-info/RECORD,,
94
+ QuLab-2.4.17.dist-info/LICENSE,sha256=b4NRQ-GFVpJMT7RuExW3NwhfbrYsX7AcdB7Gudok-fs,1086
95
+ QuLab-2.4.17.dist-info/METADATA,sha256=DwgNA--FfjwweGZlKCLdUpvP80VyQQiYE-iisAp0d5E,3804
96
+ QuLab-2.4.17.dist-info/WHEEL,sha256=yNnHoQL2GZYIUXm9YvoaBpFjGlUoK9qq9oqYeudrWlE,101
97
+ QuLab-2.4.17.dist-info/entry_points.txt,sha256=b0v1GXOwmxY-nCCsPN_rHZZvY9CtTbWqrGj8u1m8yHo,45
98
+ QuLab-2.4.17.dist-info/top_level.txt,sha256=3T886LbAsbvjonu_TDdmgxKYUn939BVTRPxPl9r4cEg,6
99
+ QuLab-2.4.17.dist-info/RECORD,,
qulab/executor/cli.py CHANGED
@@ -54,6 +54,7 @@ def create(workflow, code):
54
54
  """
55
55
  Create a new workflow file.
56
56
  """
57
+ logger.info(f'[CMD]: create {workflow} --code {code}')
57
58
  if code is None:
58
59
  code = Path.cwd()
59
60
 
@@ -82,6 +83,7 @@ def set(key, value, api):
82
83
  """
83
84
  Set a config.
84
85
  """
86
+ logger.info(f'[CMD]: set {key} {value} --api {api}')
85
87
  from . import transform
86
88
  if api is not None:
87
89
  api = importlib.import_module(api)
@@ -103,6 +105,7 @@ def get(key, api):
103
105
  """
104
106
  Get a config.
105
107
  """
108
+ logger.info(f'[CMD]: get {key} --api {api}')
106
109
  from . import transform
107
110
  if api is not None:
108
111
  api = importlib.import_module(api)
@@ -123,6 +126,9 @@ def run(workflow, code, data, api, plot, no_dependents):
123
126
  """
124
127
  Run a workflow.
125
128
  """
129
+ logger.info(
130
+ f'[CMD]: run {workflow} --code {code} --data {data} --api {api} --plot {plot} --no-dependents {no_dependents}'
131
+ )
126
132
  if api is not None:
127
133
  api = importlib.import_module(api)
128
134
  set_config_api(api.query_config, api.update_config)
@@ -159,6 +165,9 @@ def maintain(workflow, code, data, api, plot):
159
165
  """
160
166
  Maintain a workflow.
161
167
  """
168
+ logger.info(
169
+ f'[CMD]: maintain {workflow} --code {code} --data {data} --api {api} --plot {plot}'
170
+ )
162
171
  if api is not None:
163
172
  api = importlib.import_module(api)
164
173
  set_config_api(api.query_config, api.update_config)
qulab/executor/load.py CHANGED
@@ -15,12 +15,13 @@ from .storage import Result
15
15
 
16
16
  class SetConfigWorkflow():
17
17
  __timeout__ = None
18
+ __mtime__ = 0
18
19
 
19
20
  def __init__(self, key):
20
21
  self.key = key
21
22
 
22
23
  def depends(self):
23
- return [[]]
24
+ return []
24
25
 
25
26
  def check_state(self, history: Result) -> bool:
26
27
  from . import transform
@@ -200,10 +201,13 @@ def load_workflow_from_file(file_name: str,
200
201
  package='workflows') -> WorkflowType:
201
202
  base_path = Path(base_path)
202
203
  path = Path(file_name)
204
+ if not (base_path / path).exists():
205
+ raise FileNotFoundError(f"File not found: {base_path / path}")
203
206
  module_name = f"{package}.{'.'.join([*path.parts[:-1], path.stem])}"
204
207
  spec = spec_from_file_location(module_name, base_path / path)
205
208
  module = module_from_spec(spec)
206
209
  spec.loader.exec_module(module)
210
+ module.__mtime__ = (base_path / path).stat().st_mtime
207
211
 
208
212
  if hasattr(module, 'entries'):
209
213
  return module
@@ -224,13 +228,16 @@ def load_workflow_from_template(template_path: str,
224
228
  mappping: dict[str, str],
225
229
  base_path: str | Path,
226
230
  target_path: str | None = None,
227
- package='workflows') -> WorkflowType:
231
+ package='workflows',
232
+ mtime: float = 0) -> WorkflowType:
228
233
  base_path = Path(base_path)
229
234
  path = Path(template_path)
230
235
 
231
236
  with open(base_path / path) as f:
232
237
  content = f.read()
233
238
 
239
+ mtime = max(Path(template_path).stat().st_mtime, mtime)
240
+
234
241
  def replace(text):
235
242
  """
236
243
  将给定文本中的所有 _D_("var") 替换为 ${var}。
@@ -247,6 +254,10 @@ def load_workflow_from_template(template_path: str,
247
254
  return new_text
248
255
 
249
256
  template = string.Template(replace(content))
257
+ keys = template.get_identifiers()
258
+ missing = set(keys) - set(mappping.keys())
259
+ if missing:
260
+ raise KeyError(f"{template_path}: Missing keys in mapping: {missing}")
250
261
  content = template.substitute(mappping)
251
262
 
252
263
  hash_str = hashlib.md5(pickle.dumps(mappping)).hexdigest()[:8]
@@ -267,7 +278,7 @@ def load_workflow_from_template(template_path: str,
267
278
  with open(file, 'w') as f:
268
279
  f.write(content)
269
280
  else:
270
- if file.stat().st_mtime < Path(template_path).stat().st_mtime:
281
+ if file.stat().st_mtime < mtime:
271
282
  with open(file, 'w') as f:
272
283
  f.write(content)
273
284
  else:
@@ -277,22 +288,24 @@ def load_workflow_from_template(template_path: str,
277
288
  )
278
289
 
279
290
  module = load_workflow_from_file(str(path), base_path, package)
291
+ module.__mtime__ = max(mtime, module.__mtime__)
280
292
 
281
293
  return module
282
294
 
283
295
 
284
296
  def load_workflow(workflow: str | tuple[str, dict],
285
297
  base_path: str | Path,
286
- package='workflows') -> WorkflowType:
298
+ package='workflows',
299
+ mtime: float = 0) -> WorkflowType:
287
300
  if isinstance(workflow, tuple):
288
301
  if len(workflow) == 2:
289
302
  file_name, mapping = workflow
290
303
  w = load_workflow_from_template(file_name, mapping, base_path,
291
- None, package)
304
+ None, package, mtime)
292
305
  elif len(workflow) == 3:
293
306
  template_path, target_path, mapping = workflow
294
307
  w = load_workflow_from_template(template_path, mapping, base_path,
295
- target_path, package)
308
+ target_path, package, mtime)
296
309
  else:
297
310
  raise ValueError(f"Invalid workflow: {workflow}")
298
311
  w.__workflow_id__ = str(Path(w.__file__).relative_to(base_path))
@@ -312,8 +325,14 @@ def load_workflow(workflow: str | tuple[str, dict],
312
325
 
313
326
  def get_dependents(workflow: WorkflowType,
314
327
  code_path: str | Path) -> list[WorkflowType]:
315
- return [load_workflow(n, code_path) for n in workflow.depends()[0]]
328
+ return [
329
+ load_workflow(n, code_path, mtime=workflow.__mtime__)
330
+ for n in workflow.depends()
331
+ ]
316
332
 
317
333
 
318
334
  def get_entries(workflow: WorkflowType, code_path: str | Path) -> WorkflowType:
319
- return [load_workflow(n, code_path) for n in workflow.entries()]
335
+ return [
336
+ load_workflow(n, code_path, mtime=workflow.__mtime__)
337
+ for n in workflow.entries()
338
+ ]
qulab/executor/utils.py CHANGED
@@ -25,7 +25,7 @@ def dependent_tree(node: str, code_path: str | Path) -> dict[str, list[str]]:
25
25
  Returns a dict of nodes and their dependents.
26
26
  '''
27
27
  tree = {}
28
- for n in load_workflow(node, code_path).depends()[0]:
28
+ for n in load_workflow(node, code_path).depends():
29
29
  tree[n] = dependent_tree(n, code_path)
30
30
  return tree
31
31
 
@@ -43,7 +43,7 @@ import numpy as np
43
43
  __timeout__ = 7*24*3600
44
44
 
45
45
  def depends():
46
- return [{deps!r}]
46
+ return {deps!r}
47
47
 
48
48
 
49
49
  def calibrate():
Binary file
qulab/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "2.4.15"
1
+ __version__ = "2.4.17"
File without changes