mccode-plumber 0.8.0__py3-none-any.whl → 0.8.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.
@@ -0,0 +1,6 @@
1
+ from importlib.metadata import version, PackageNotFoundError
2
+
3
+ try:
4
+ __version__ = version('mccode-plumber')
5
+ except PackageNotFoundError:
6
+ pass
mccode_plumber/epics.py CHANGED
@@ -53,9 +53,11 @@ class MailboxHandler:
53
53
 
54
54
  def get_parser():
55
55
  from argparse import ArgumentParser
56
+ from mccode_plumber import __version__
56
57
  p = ArgumentParser()
57
58
  p.add_argument('instr', type=str, help='The instrument file to read')
58
59
  p.add_argument('-p', '--prefix', type=str, help='The EPICS PV prefix to use', default='mcstas:')
60
+ p.add_argument('-v', '--version', action='version', version=__version__)
59
61
  return p
60
62
 
61
63
 
@@ -62,12 +62,14 @@ def reset_forwarder(pvs: list[dict], config=None, prefix=None, topic=None):
62
62
  def parse_registrar_args():
63
63
  from argparse import ArgumentParser
64
64
  from .mccode import get_mccode_instr_parameters
65
+ from mccode_plumber import __version__
65
66
 
66
67
  parser = ArgumentParser(description="Discover EPICS PVs and inform a forwarder about them")
67
68
  parser.add_argument('-p', '--prefix', type=str, default='mcstas:')
68
69
  parser.add_argument('instrument', type=str, help="The mcstas instrument with EPICS PVs")
69
70
  parser.add_argument('-c', '--config', type=str, help="The Kafka server and topic for configuring the Forwarder")
70
71
  parser.add_argument('-t', '--topic', type=str, help="The Kafka topic to instruct the Forwarder to send data to")
72
+ parser.add_argument('-v', '--version', action='version', version=__version__)
71
73
 
72
74
  args = parser.parse_args()
73
75
  parameter_names = [p.name for p in get_mccode_instr_parameters(args.instrument)]
mccode_plumber/kafka.py CHANGED
@@ -1,9 +1,11 @@
1
1
  def parse_kafka_topic_args():
2
2
  from argparse import ArgumentParser
3
+ from mccode_plumber import __version__
3
4
  parser = ArgumentParser(description="Prepare the named Kafka broker to host one or more topics")
4
5
  parser.add_argument('-b', '--broker', type=str, help='The Kafka broker server to interact with')
5
6
  parser.add_argument('topic', nargs="+", type=str, help='The Kafka topic(s) to register')
6
7
  parser.add_argument('-q', '--quiet', action='store_true', help='Quiet (positive) failure')
8
+ parser.add_argument('-v', '--version', action='version', version=__version__)
7
9
 
8
10
  args = parser.parse_args()
9
11
  return args
mccode_plumber/mccode.py CHANGED
@@ -1,15 +1,13 @@
1
1
  from pathlib import Path
2
2
  from typing import Union
3
- from mccode_antlr.instr import Instr
4
- from mccode_antlr.common import InstrumentParameter
5
3
 
6
4
 
7
- def get_mcstas_instr(filename: Union[Path, str]) -> Instr:
5
+ def get_mcstas_instr(filename: Union[Path, str]):
8
6
  from restage.instr import load_instr
9
7
  return load_instr(filename)
10
8
 
11
9
 
12
- def get_mccode_instr_parameters(filename: Union[Path, str]) -> tuple[InstrumentParameter]:
10
+ def get_mccode_instr_parameters(filename: Union[Path, str]):
13
11
  from mccode_antlr.loader.loader import parse_mccode_instr_parameters
14
12
  if not isinstance(filename, Path):
15
13
  filename = Path(filename)
@@ -42,12 +40,14 @@ def insert_mcstas_hdf5(filename: Union[Path, str], outfile: Union[Path, str], pa
42
40
 
43
41
  def get_arg_parser():
44
42
  from argparse import ArgumentParser
43
+ from mccode_plumber import __version__
45
44
  from .utils import is_readable, is_appendable
46
45
  parser = ArgumentParser(description="Copy a Instr HDF5 representation to a NeXus HDF5 file")
47
46
  a = parser.add_argument
48
47
  a('instrument', type=is_readable, default=None, help="The mcstas instrument file")
49
48
  a('-p', '--parent', type=str, default='mcstas')
50
49
  a('-o', '--outfile', type=is_appendable, default=None, help='Base NeXus structure, will be extended')
50
+ a('-v', '--version', action='version', version=__version__)
51
51
  return parser
52
52
 
53
53
 
@@ -1,10 +1,12 @@
1
1
  def make_parser():
2
+ from mccode_plumber import __version__
2
3
  from restage.splitrun import make_splitrun_parser
3
4
  parser = make_splitrun_parser()
4
5
  parser.prog = 'mp-splitrun'
5
6
  parser.add_argument('--broker', type=str, help='The Kafka broker to send monitors to', default=None)
6
7
  parser.add_argument('--source', type=str, help='The Kafka source name to use for monitors', default=None)
7
8
  parser.add_argument('--topic', type=str, help='The Kafka topic name(s) to use for monitors', default=None, action='append')
9
+ parser.add_argument('-v', '--version', action='version', version=__version__)
8
10
  return parser
9
11
 
10
12
 
mccode_plumber/writer.py CHANGED
@@ -1,8 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
- from typing import Union, Callable
5
- from mccode_antlr.instr import Instr
6
4
 
7
5
  from .file_writer_control import WorkerJobPool
8
6
 
@@ -145,28 +143,39 @@ def get_writer_pool(broker: str = None, job: str = None, command: str = None):
145
143
  return pool
146
144
 
147
145
 
148
- def define_nexus_structure(instr: Union[Path, str], pvs: list[dict], title: str = None, event_stream: dict[str, str] = None,
149
- file: Union[Path, None] = None, func: Union[Callable[[Instr], dict], None] = None,
150
- binary: Union[Path, None] = None, origin: str = None):
151
- import json
152
- from .mccode import get_mcstas_instr
153
- if file is not None and file.exists():
154
- with open(file, 'r') as file:
155
- nexus_structure = json.load(file)
156
- elif func is not None:
157
- nexus_structure = func(get_mcstas_instr(instr))
158
- elif binary is not None and binary.exists():
159
- from subprocess import run, PIPE
160
- result = run([binary, str(instr)], stdout=PIPE, stderr=PIPE)
161
- if result.returncode != 0:
162
- raise RuntimeError(f"Failed to execute {binary} {instr} due to error {result.stderr.decode()}")
163
- nexus_structure = json.loads(result.stdout.decode())
164
- else:
165
- nexus_structure = default_nexus_structure(get_mcstas_instr(instr), origin=origin)
166
- nexus_structure = add_pvs_to_nexus_structure(nexus_structure, pvs)
167
- nexus_structure = add_title_to_nexus_structure(nexus_structure, title)
168
- # nexus_structure = insert_events_in_nexus_structure(nexus_structure, event_stream)
169
- return nexus_structure
146
+ def make_define_nexus_structure():
147
+ from typing import Union, Callable
148
+ from mccode_antlr.instr import Instr
149
+
150
+ def define_nexus_structure(
151
+ instr: Union[Path, str],
152
+ pvs: list[dict],
153
+ title: str = None,
154
+ event_stream: dict[str, str] = None,
155
+ file: Union[Path, None] = None,
156
+ func: Union[Callable[[Instr], dict], None] = None,
157
+ binary: Union[Path, None] = None,
158
+ origin: str = None):
159
+ import json
160
+ from .mccode import get_mcstas_instr
161
+ if file is not None and file.exists():
162
+ with open(file, 'r') as file:
163
+ nexus_structure = json.load(file)
164
+ elif func is not None:
165
+ nexus_structure = func(get_mcstas_instr(instr))
166
+ elif binary is not None and binary.exists():
167
+ from subprocess import run, PIPE
168
+ result = run([binary, str(instr)], stdout=PIPE, stderr=PIPE)
169
+ if result.returncode != 0:
170
+ raise RuntimeError(f"Failed to execute {binary} {instr} due to error {result.stderr.decode()}")
171
+ nexus_structure = json.loads(result.stdout.decode())
172
+ else:
173
+ nexus_structure = default_nexus_structure(get_mcstas_instr(instr), origin=origin)
174
+ nexus_structure = add_pvs_to_nexus_structure(nexus_structure, pvs)
175
+ nexus_structure = add_title_to_nexus_structure(nexus_structure, title)
176
+ # nexus_structure = insert_events_in_nexus_structure(nexus_structure, event_stream)
177
+ return nexus_structure
178
+ return define_nexus_structure
170
179
 
171
180
 
172
181
  def start_pool_writer(start_time_string, structure, filename=None, stop_time_string: str | None = None,
@@ -224,6 +233,7 @@ def start_pool_writer(start_time_string, structure, filename=None, stop_time_str
224
233
 
225
234
  def get_arg_parser():
226
235
  from argparse import ArgumentParser
236
+ from mccode_plumber import __version__
227
237
  from .utils import is_callable, is_readable, is_executable, is_writable
228
238
  parser = ArgumentParser(description="Control writing Kafka stream(s) to a NeXus file")
229
239
  a = parser.add_argument
@@ -247,6 +257,7 @@ def get_arg_parser():
247
257
  a('--wait', action='store_true', help='If provided, wait for the writer to finish before exiting')
248
258
  a('--time-out', type=float, default=120., help='Wait up to the timeout for writing to start')
249
259
  a('--job-id', type=str, default=None, help='Unique Job identifier for this write-job')
260
+ a('-v', '--version', action='version', version=__version__)
250
261
 
251
262
  return parser
252
263
 
@@ -275,9 +286,12 @@ def construct_writer_pv_dicts_from_parameters(parameters, prefix: str, topic: st
275
286
  def parse_writer_args():
276
287
  args = get_arg_parser().parse_args()
277
288
  params = construct_writer_pv_dicts(args.instrument, args.prefix, args.topic)
278
- structure = define_nexus_structure(args.instrument, params, title=args.title, origin=args.origin,
279
- file=args.ns_file, func=args.ns_func, binary=args.ns_exec,
280
- event_stream={'source': args.event_source, 'topic': args.event_topic})
289
+ define_nexus_structure = make_define_nexus_structure()
290
+ structure = define_nexus_structure(
291
+ args.instrument, params, title=args.title, origin=args.origin,
292
+ file=args.ns_file, func=args.ns_func, binary=args.ns_exec,
293
+ event_stream={'source': args.event_source, 'topic': args.event_topic}
294
+ )
281
295
  if args.ns_save is not None:
282
296
  from json import dump
283
297
  with open(args.ns_save, 'w') as file:
@@ -303,6 +317,7 @@ def wait_on_writer():
303
317
  from os import EX_OK, EX_UNAVAILABLE
304
318
  from time import sleep
305
319
  from datetime import datetime, timedelta
320
+ from mccode_plumber import __version__
306
321
  from .file_writer_control import JobHandler, CommandState
307
322
 
308
323
  from argparse import ArgumentParser
@@ -314,6 +329,7 @@ def wait_on_writer():
314
329
  a('id', type=str, help='Job id to wait on')
315
330
  a('-s', '--stop-after', type=float, help='Stop after time, seconds', default=1)
316
331
  a('-t', '--time-out', type=float, help='Time out after, seconds', default=24*60*60*30)
332
+ a('-v', '--version', action='version', version=__version__)
317
333
  args = parser.parse_args()
318
334
 
319
335
  pool = get_writer_pool(broker=args.broker, job=args.job, command=args.command)
@@ -338,18 +354,25 @@ def wait_on_writer():
338
354
  exit(EX_OK)
339
355
 
340
356
 
357
+ def kill_list_parser():
358
+ from argparse import ArgumentParser
359
+ from mccode_plumber import __version__
360
+ parser = ArgumentParser()
361
+ a = parser.add_argument
362
+ a('-b', '--broker', help="Kafka broker", default='localhost:9092', type=str)
363
+ a('-c', '--command', help="Writer command topic", default="WriterCommand", type=str)
364
+ a('-t', '--topic', help='Writer job topic', default='WriterJobs', type=str)
365
+ a('-s', '--sleep', help='Post pool creation sleep time (s)', default=1, type=int)
366
+ a('-v', '--version', action='version', version=__version__)
367
+ return parser
368
+
369
+
341
370
  def kill_job():
342
371
  import time
343
- from argparse import ArgumentParser
344
372
  from .file_writer_control import WorkerJobPool
345
- parser = ArgumentParser()
346
- parser.add_argument('-b', '--broker', help="Kafka broker", default='localhost:9092', type=str)
347
- parser.add_argument('-c', '--command', help="Writer command topic", default="WriterCommand", type=str)
348
- parser.add_argument('-t', '--topic', help='Writer job topic', default='WriterJobs', type=str)
349
- parser.add_argument('-s', '--sleep', help='Post pool creation sleep time (s)', default=1, type=int)
373
+ parser = kill_list_parser()
350
374
  parser.add_argument('service_id', type=str, help='Writer service id to stop')
351
375
  parser.add_argument('job_id', type=str, help='Writer job id to stop')
352
-
353
376
  args = parser.parse_args()
354
377
  pool = WorkerJobPool(f'{args.broker}/{args.topic}', f'{args.broker}/{args.command}')
355
378
  time.sleep(args.sleep)
@@ -411,15 +434,9 @@ def print_current_state(channel: WorkerJobPool):
411
434
 
412
435
  def kill_all():
413
436
  import time
414
- from argparse import ArgumentParser
415
437
  from .file_writer_control import WorkerJobPool
416
- parser = ArgumentParser()
417
- parser.add_argument('-b', '--broker', help="Kafka broker", default='localhost:9092', type=str)
418
- parser.add_argument('-c', '--command', help="Writer command topic", default="WriterCommand", type=str)
419
- parser.add_argument('-t', '--topic', help='Writer job topic', default='WriterJobs', type=str)
420
- parser.add_argument('-s', '--sleep', help='Post pool creation sleep time (s)', default=1, type=int)
421
- parser.add_argument('-v', '--verbose', help='Verbose output', action='store_true')
422
-
438
+ parser = kill_list_parser()
439
+ parser.add_argument('--verbose', help='Verbose output', action='store_true')
423
440
  args = parser.parse_args()
424
441
  pool = WorkerJobPool(f'{args.broker}/{args.topic}', f'{args.broker}/{args.command}')
425
442
  time.sleep(args.sleep)
@@ -439,12 +456,7 @@ def kill_all():
439
456
 
440
457
  def list_status():
441
458
  import time
442
- from argparse import ArgumentParser
443
- parser = ArgumentParser()
444
- parser.add_argument('-b', '--broker', help="Kafka broker", default='localhost:9092', type=str)
445
- parser.add_argument('-c', '--command', help="Writer command topic", default="WriterCommand", type=str)
446
- parser.add_argument('-t', '--topic', help='Writer job topic', default='WriterJobs', type=str)
447
- parser.add_argument('-s', '--sleep', type=int, help='Post pool creation sleep time', default=1)
459
+ parser = kill_list_parser()
448
460
  args = parser.parse_args()
449
461
  pool = WorkerJobPool(f'{args.broker}/{args.topic}', f'{args.broker}/{args.command}')
450
462
  time.sleep(args.sleep)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mccode-plumber
3
- Version: 0.8.0
3
+ Version: 0.8.1
4
4
  Author-email: Gregory Tucker <gregory.tucker@ess.eu>
5
5
  Classifier: License :: OSI Approved :: BSD License
6
6
  Description-Content-Type: text/markdown
@@ -1,12 +1,12 @@
1
- mccode_plumber/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1
+ mccode_plumber/__init__.py,sha256=ZQMwyPQ6GyoEkKXj7aWETPqhXfwUbDOD5EpvlXj1c18,148
2
2
  mccode_plumber/conductor.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- mccode_plumber/epics.py,sha256=5j_ictmDloxUGbGNe2ESlkSDQsPknzgPAbUsoZEUWO0,4441
4
- mccode_plumber/forwarder.py,sha256=1PdW91qLksDnA41-gOFMtgSae4wDdSLVvgAlrF23Uks,3764
5
- mccode_plumber/kafka.py,sha256=8fHTy2Zzk638XXj29pfrk-7fUxafuse9OYWmaRgvV7M,1195
6
- mccode_plumber/mccode.py,sha256=WXlu89Cs6a3s0aKtfRGuzqcOWoFZtdZWibLgBQnaXCI,2210
7
- mccode_plumber/splitrun.py,sha256=s1ShM-Y5d9DzndVIYuWXqPkYPmxzG9Cjjcxo7Pss6Q0,1393
3
+ mccode_plumber/epics.py,sha256=unZvCleb8LApHPjd4mg_ihpP9Pdr9OXHd8e_mTT5-PM,4561
4
+ mccode_plumber/forwarder.py,sha256=by4dYKDDIZ-8irW_pFg_s5FfcqyRl4T6F5aMdf9z2sk,3889
5
+ mccode_plumber/kafka.py,sha256=0Udl5d-lvoNJkfZqf7xhOGp4OxvbORI160qPM7Qvhj0,1320
6
+ mccode_plumber/mccode.py,sha256=vc4Gb5WhdOfuDRjEejU3Flps0C2A60sfFbMrxmKLhn0,2189
7
+ mccode_plumber/splitrun.py,sha256=XsOsiFgUdmrFBXqIn6sUpr7fue0ShrqlNQjDHkZ0-Cs,1518
8
8
  mccode_plumber/utils.py,sha256=E8NoGo_3Z-pPEpzicVGSWfQOX8p3eR-GxElT33-kX5U,2167
9
- mccode_plumber/writer.py,sha256=XUTrq1u1aQYX6jTDY5Rie3dQAuN8iE4nxxdbFmLRhQk,20886
9
+ mccode_plumber/writer.py,sha256=lrZGAZ3OCG1WcVrirFbokGsEdyRc_A_iJx4adqiMc18,20555
10
10
  mccode_plumber/file_writer_control/CommandChannel.py,sha256=U32mvk8Ctlw8vg38_ULP__-UAG2funWIkhEFo2xahiY,9024
11
11
  mccode_plumber/file_writer_control/CommandHandler.py,sha256=4dPsMyBYx5hKuiVw5HoPMOFJ0QFxmrI3XK3TA_a8ZGE,2207
12
12
  mccode_plumber/file_writer_control/CommandStatus.py,sha256=biNK58vY1H-USYAl9uB_JNQyMohBj1cwJwmXktndd4E,4517
@@ -20,8 +20,8 @@ mccode_plumber/file_writer_control/WorkerJobPool.py,sha256=4VKzAhreGzunYT52te5kG
20
20
  mccode_plumber/file_writer_control/WorkerStatus.py,sha256=uw1q-Pvf1o2hxpMIPVwdtnAXLcO7VeEpcZ3wKjxxdsk,2826
21
21
  mccode_plumber/file_writer_control/WriteJob.py,sha256=-2tQvfajctf6Bn19c9hT9N1lOP0uTo7SZRMnXV1A-aA,2721
22
22
  mccode_plumber/file_writer_control/__init__.py,sha256=Wp8A7JOB0vgpwAbvI9ik5cBlZa6lY-cq8dxYGRTRs0M,285
23
- mccode_plumber-0.8.0.dist-info/METADATA,sha256=STOHlVURtT4_6ixD8jijei4Me30rIB3v3YsvuJCxQSg,552
24
- mccode_plumber-0.8.0.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
25
- mccode_plumber-0.8.0.dist-info/entry_points.txt,sha256=VwqJ6B-ppH6Fezql9ZDKNcjw6QG2aQ8qvDxdqVGM-jk,670
26
- mccode_plumber-0.8.0.dist-info/top_level.txt,sha256=kCCIpYtKHCKWxiPEqX9J1UaGEm-ze0Qb-cemBCEPhDA,15
27
- mccode_plumber-0.8.0.dist-info/RECORD,,
23
+ mccode_plumber-0.8.1.dist-info/METADATA,sha256=oVeKbnB_ZbnkXvKyjrfjlfn64hvIgLZVWiOW6SWThyo,552
24
+ mccode_plumber-0.8.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
25
+ mccode_plumber-0.8.1.dist-info/entry_points.txt,sha256=VwqJ6B-ppH6Fezql9ZDKNcjw6QG2aQ8qvDxdqVGM-jk,670
26
+ mccode_plumber-0.8.1.dist-info/top_level.txt,sha256=kCCIpYtKHCKWxiPEqX9J1UaGEm-ze0Qb-cemBCEPhDA,15
27
+ mccode_plumber-0.8.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.1.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5