spectra-plot 0.2.5__tar.gz → 0.2.7__tar.gz

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.
Files changed (103) hide show
  1. {spectra_plot-0.2.5/spectra_plot.egg-info → spectra_plot-0.2.7}/PKG-INFO +1 -1
  2. spectra_plot-0.2.7/VERSION +1 -0
  3. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_codec.py +17 -11
  4. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_codec_fb.py +56 -0
  5. spectra_plot-0.2.7/spectra/_embed.py +1678 -0
  6. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_launcher.py +30 -18
  7. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_transport.py +18 -0
  8. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/embed.py +148 -55
  9. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/topic.py +38 -10
  10. {spectra_plot-0.2.5 → spectra_plot-0.2.7/spectra_plot.egg-info}/PKG-INFO +1 -1
  11. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra_plot.egg-info/SOURCES.txt +2 -0
  12. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_embed.py +145 -0
  13. spectra_plot-0.2.7/tests/test_packaging_metadata.py +29 -0
  14. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_phase4.py +40 -117
  15. spectra_plot-0.2.7/tests/test_topic_publisher.py +127 -0
  16. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_windows_compat.py +4 -4
  17. spectra_plot-0.2.5/VERSION +0 -1
  18. spectra_plot-0.2.5/spectra/_embed.py +0 -504
  19. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/MANIFEST.in +0 -0
  20. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/pyproject.toml +0 -0
  21. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/setup.cfg +0 -0
  22. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/__init__.py +0 -0
  23. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_animation.py +0 -0
  24. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_axes.py +0 -0
  25. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_blob.py +0 -0
  26. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_cli.py +0 -0
  27. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_download.py +0 -0
  28. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_easy.py +0 -0
  29. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_errors.py +0 -0
  30. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/__init__.py +0 -0
  31. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/__init__.py +0 -0
  32. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/AckStatePayload.py +0 -0
  33. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/CmdAssignFiguresPayload.py +0 -0
  34. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/CmdCloseWindowPayload.py +0 -0
  35. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/CmdRemoveFigurePayload.py +0 -0
  36. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/CmdSetActivePayload.py +0 -0
  37. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/DiffOp.py +0 -0
  38. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/DiffOpType.py +0 -0
  39. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/EvtFigureDestroyedPayload.py +0 -0
  40. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/EvtInputPayload.py +0 -0
  41. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/EvtTopicListChangedPayload.py +0 -0
  42. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/EvtWindowClosedPayload.py +0 -0
  43. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/HelloPayload.py +0 -0
  44. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/InputType.py +0 -0
  45. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqAddSeriesPayload.py +0 -0
  46. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqAppendDataPayload.py +0 -0
  47. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqCloseFigurePayload.py +0 -0
  48. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqCloseWindowPayload.py +0 -0
  49. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqCreateAxesPayload.py +0 -0
  50. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqCreateFigurePayload.py +0 -0
  51. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqCreateWindowPayload.py +0 -0
  52. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqDeclareTopicPayload.py +0 -0
  53. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqDestroyFigurePayload.py +0 -0
  54. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqDetachFigurePayload.py +0 -0
  55. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqListTopicsPayload.py +0 -0
  56. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqPublishTopicSamplesPayload.py +0 -0
  57. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqReconnectPayload.py +0 -0
  58. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqRemoveSeriesPayload.py +0 -0
  59. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqSetDataPayload.py +0 -0
  60. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqShowPayload.py +0 -0
  61. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqSubscribeTopicPayload.py +0 -0
  62. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqUnsubscribeTopicPayload.py +0 -0
  63. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqUpdateBatchPayload.py +0 -0
  64. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/ReqUpdatePropertyPayload.py +0 -0
  65. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/RespAxesCreatedPayload.py +0 -0
  66. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/RespErrPayload.py +0 -0
  67. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/RespFigureCreatedPayload.py +0 -0
  68. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/RespFigureListPayload.py +0 -0
  69. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/RespOkPayload.py +0 -0
  70. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/RespSeriesAddedPayload.py +0 -0
  71. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/RespSubscribeTopicPayload.py +0 -0
  72. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/RespTopicListPayload.py +0 -0
  73. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/SnapshotAxisState.py +0 -0
  74. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/SnapshotFigureState.py +0 -0
  75. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/SnapshotKnobState.py +0 -0
  76. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/SnapshotSeriesState.py +0 -0
  77. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/StateDiffPayload.py +0 -0
  78. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/StateSnapshotPayload.py +0 -0
  79. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/TopicInfoEntry.py +0 -0
  80. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/WelcomePayload.py +0 -0
  81. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_fb_generated/spectra/ipc/fb/__init__.py +0 -0
  82. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_figure.py +0 -0
  83. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_log.py +0 -0
  84. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_persistence.py +0 -0
  85. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_protocol.py +0 -0
  86. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_series.py +0 -0
  87. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/_session.py +0 -0
  88. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/backends/__init__.py +0 -0
  89. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/backends/_qt_compat.py +0 -0
  90. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra/backends/backend_qtagg.py +0 -0
  91. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra_plot.egg-info/dependency_links.txt +0 -0
  92. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra_plot.egg-info/entry_points.txt +0 -0
  93. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra_plot.egg-info/requires.txt +0 -0
  94. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/spectra_plot.egg-info/top_level.txt +0 -0
  95. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_codec.py +0 -0
  96. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_cross_codec.py +0 -0
  97. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_download.py +0 -0
  98. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_easy.py +0 -0
  99. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_easy_embed.py +0 -0
  100. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_phase2.py +0 -0
  101. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_phase3.py +0 -0
  102. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_phase5.py +0 -0
  103. {spectra_plot-0.2.5 → spectra_plot-0.2.7}/tests/test_qt_backend.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spectra-plot
3
- Version: 0.2.5
3
+ Version: 0.2.7
4
4
  Summary: GPU-accelerated scientific plotting via IPC
5
5
  License: MIT
6
6
  Classifier: Development Status :: 3 - Alpha
@@ -0,0 +1 @@
1
+ 0.2.7
@@ -1,10 +1,8 @@
1
- """TLV (Tag-Length-Value) codec mirroring src/ipc/codec.hpp.
1
+ """IPC payload codec mirroring src/ipc/codec.hpp.
2
2
 
3
- Wire format per field: [tag: u8] [len: u32 LE] [data: len bytes]
4
-
5
- FlatBuffers payloads are prefixed with 0x01; legacy TLV payloads start with
6
- a raw tag byte (never 0x00 or 0x01 in practice, but 0x00 is reserved).
7
- Decode functions auto-detect the format and delegate to _codec_fb when needed.
3
+ All encode_* functions emit FlatBuffers (0x01 prefix) via _codec_fb.
4
+ PayloadEncoder remains for a few legacy write paths (chunked set-data, anim).
5
+ Decode functions auto-detect FlatBuffers vs legacy TLV and delegate to _codec_fb.
8
6
  """
9
7
 
10
8
  import struct
@@ -306,17 +304,25 @@ def encode_req_remove_series(figure_id: int, series_index: int) -> bytes:
306
304
  def encode_req_close_figure(figure_id: int) -> bytes:
307
305
  return fb_codec.encode_fb_req_close_figure(figure_id=figure_id)
308
306
 
307
+ def decode_req_update_batch(data: bytes) -> list:
308
+ """Decode REQ_UPDATE_BATCH. Returns a list of update dicts."""
309
+ if fb_codec._is_fb(data):
310
+ return fb_codec.decode_fb_req_update_batch(data)
311
+ updates = []
312
+ dec = PayloadDecoder(data)
313
+ while dec.next():
314
+ if dec.tag == P.TAG_BATCH_ITEM:
315
+ updates.append(decode_req_update_property(dec.as_blob()))
316
+ return updates
317
+
318
+
309
319
  def encode_req_update_batch(updates: list) -> bytes:
310
320
  """Encode REQ_UPDATE_BATCH — multiple property updates in one message.
311
321
 
312
322
  Each item in `updates` is a dict with keys matching encode_req_update_property kwargs:
313
323
  figure_id, axes_index, series_index, prop, f1..f4, bool_val, str_val
314
324
  """
315
- enc = PayloadEncoder()
316
- for upd in updates:
317
- item_bytes = encode_req_update_property(**upd)
318
- enc.put_blob(P.TAG_BATCH_ITEM, item_bytes)
319
- return enc.take()
325
+ return fb_codec.encode_fb_req_update_batch(updates)
320
326
 
321
327
 
322
328
  def encode_req_reconnect(session_id: int, session_token: str = "") -> bytes:
@@ -217,6 +217,38 @@ def encode_fb_req_update_property(
217
217
  return _finalize(builder)
218
218
 
219
219
 
220
+ def encode_fb_req_update_batch(updates: List[dict]) -> bytes:
221
+ """Encode REQ_UPDATE_BATCH with nested property updates."""
222
+ builder = flatbuffers.Builder(1024)
223
+ offsets = []
224
+ for upd in updates:
225
+ prop_off = builder.CreateString(upd.get("prop", ""))
226
+ str_val = upd.get("str_val", "")
227
+ str_off = builder.CreateString(str_val) if str_val else None
228
+ FBReqUpdProp.Start(builder)
229
+ FBReqUpdProp.AddFigureId(builder, upd.get("figure_id", 0))
230
+ FBReqUpdProp.AddAxesIndex(builder, upd.get("axes_index", 0))
231
+ FBReqUpdProp.AddSeriesIndex(builder, upd.get("series_index", 0))
232
+ FBReqUpdProp.AddProperty(builder, prop_off)
233
+ FBReqUpdProp.AddF1(builder, upd.get("f1", 0.0))
234
+ FBReqUpdProp.AddF2(builder, upd.get("f2", 0.0))
235
+ FBReqUpdProp.AddF3(builder, upd.get("f3", 0.0))
236
+ FBReqUpdProp.AddF4(builder, upd.get("f4", 0.0))
237
+ FBReqUpdProp.AddBoolVal(builder, upd.get("bool_val", False))
238
+ if str_off is not None:
239
+ FBReqUpdProp.AddStrVal(builder, str_off)
240
+ offsets.append(FBReqUpdProp.End(builder))
241
+ FBReqUpdBatch.StartUpdatesVector(builder, len(offsets))
242
+ for off in reversed(offsets):
243
+ builder.PrependUOffsetTRelative(off)
244
+ upds_off = builder.EndVector()
245
+ FBReqUpdBatch.Start(builder)
246
+ FBReqUpdBatch.AddUpdates(builder, upds_off)
247
+ root = builder.EndObject()
248
+ builder.Finish(root)
249
+ return _finalize(builder)
250
+
251
+
220
252
  def encode_fb_req_show(figure_id: int, window_id: int = 0) -> bytes:
221
253
  builder = flatbuffers.Builder(64)
222
254
  FBReqShow.Start(builder)
@@ -330,6 +362,30 @@ def decode_fb_evt_window_closed(data: bytes) -> Tuple[int, int, str]:
330
362
  )
331
363
 
332
364
 
365
+ def decode_fb_req_update_batch(data: bytes) -> List[dict]:
366
+ buf = _strip(data) if _is_fb(data) else data
367
+ fb = FBReqUpdBatch.ReqUpdateBatchPayload.GetRootAs(buf, 0)
368
+ updates = []
369
+ if fb.UpdatesLength():
370
+ for i in range(fb.UpdatesLength()):
371
+ upd = fb.Updates(i)
372
+ updates.append(
373
+ {
374
+ "figure_id": upd.FigureId(),
375
+ "axes_index": upd.AxesIndex(),
376
+ "series_index": upd.SeriesIndex(),
377
+ "prop": (upd.Property() or b"").decode("utf-8", errors="replace"),
378
+ "f1": upd.F1(),
379
+ "f2": upd.F2(),
380
+ "f3": upd.F3(),
381
+ "f4": upd.F4(),
382
+ "bool_val": upd.BoolVal(),
383
+ "str_val": (upd.StrVal() or b"").decode("utf-8", errors="replace"),
384
+ }
385
+ )
386
+ return updates
387
+
388
+
333
389
  def decode_fb_evt_figure_destroyed(data: bytes) -> Tuple[int, str]:
334
390
  buf = _strip(data) if _is_fb(data) else data
335
391
  fb = FBEvtFigDestroyed.EvtFigureDestroyedPayload.GetRootAs(buf, 0)