rocket-welder-sdk 1.1.35.dev12__tar.gz → 1.1.36__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 (68) hide show
  1. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/PKG-INFO +1 -1
  2. rocket_welder_sdk-1.1.36/VERSION +1 -0
  3. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/high_level/__init__.py +2 -0
  4. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/high_level/client.py +3 -30
  5. rocket_welder_sdk-1.1.36/rocket_welder_sdk/high_level/frame_sink_factory.py +118 -0
  6. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/high_level/schema.py +2 -4
  7. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/transport/__init__.py +2 -1
  8. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/transport/frame_sink.py +45 -0
  9. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk.egg-info/PKG-INFO +1 -1
  10. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk.egg-info/SOURCES.txt +1 -0
  11. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_high_level_api.py +8 -2
  12. rocket_welder_sdk-1.1.35.dev12/VERSION +0 -1
  13. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/MANIFEST.in +0 -0
  14. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/README.md +0 -0
  15. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/logo.png +0 -0
  16. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/pyproject.toml +0 -0
  17. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/__init__.py +0 -0
  18. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/bytes_size.py +0 -0
  19. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/connection_string.py +0 -0
  20. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/controllers.py +0 -0
  21. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/external_controls/__init__.py +0 -0
  22. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/external_controls/contracts.py +0 -0
  23. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/external_controls/contracts_old.py +0 -0
  24. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/frame_metadata.py +0 -0
  25. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/gst_metadata.py +0 -0
  26. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/high_level/connection_strings.py +0 -0
  27. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/high_level/data_context.py +0 -0
  28. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/high_level/transport_protocol.py +0 -0
  29. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/keypoints_protocol.py +0 -0
  30. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/opencv_controller.py +0 -0
  31. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/periodic_timer.py +0 -0
  32. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/py.typed +0 -0
  33. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/rocket_welder_client.py +0 -0
  34. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/segmentation_result.py +0 -0
  35. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/session_id.py +0 -0
  36. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/transport/frame_source.py +0 -0
  37. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/transport/nng_transport.py +0 -0
  38. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/transport/stream_transport.py +0 -0
  39. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/transport/tcp_transport.py +0 -0
  40. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/transport/unix_socket_transport.py +0 -0
  41. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/ui/__init__.py +0 -0
  42. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/ui/controls.py +0 -0
  43. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/ui/icons.py +0 -0
  44. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/ui/ui_events_projection.py +0 -0
  45. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/ui/ui_service.py +0 -0
  46. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk/ui/value_types.py +0 -0
  47. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk.egg-info/dependency_links.txt +0 -0
  48. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk.egg-info/requires.txt +0 -0
  49. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/rocket_welder_sdk.egg-info/top_level.txt +0 -0
  50. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/setup.cfg +0 -0
  51. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/setup.py +0 -0
  52. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_bytes_size.py +0 -0
  53. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_connection_string.py +0 -0
  54. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_controllers.py +0 -0
  55. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_external_controls_serialization.py +0 -0
  56. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_external_controls_serialization_v2.py +0 -0
  57. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_frame_metadata.py +0 -0
  58. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_gst_metadata.py +0 -0
  59. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_icons.py +0 -0
  60. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_keypoints_cross_platform.py +0 -0
  61. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_keypoints_protocol.py +0 -0
  62. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_rocket_welder_client.py +0 -0
  63. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_segmentation_cross_platform.py +0 -0
  64. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_segmentation_result.py +0 -0
  65. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_session_id.py +0 -0
  66. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_transport_cross_platform.py +0 -0
  67. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_ui_controls.py +0 -0
  68. {rocket_welder_sdk-1.1.35.dev12 → rocket_welder_sdk-1.1.36}/tests/test_ui_service_happy_path.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rocket-welder-sdk
3
- Version: 1.1.35.dev12
3
+ Version: 1.1.36
4
4
  Summary: High-performance video streaming SDK for RocketWelder services using ZeroBuffer IPC
5
5
  Home-page: https://github.com/modelingevolution/rocket-welder-sdk
6
6
  Author: ModelingEvolution
@@ -0,0 +1 @@
1
+ 1.1.36
@@ -23,6 +23,7 @@ from .data_context import (
23
23
  IKeyPointsDataContext,
24
24
  ISegmentationDataContext,
25
25
  )
26
+ from .frame_sink_factory import FrameSinkFactory
26
27
  from .schema import (
27
28
  IKeyPointsSchema,
28
29
  ISegmentationSchema,
@@ -35,6 +36,7 @@ from .transport_protocol import (
35
36
  )
36
37
 
37
38
  __all__ = [
39
+ "FrameSinkFactory",
38
40
  "IKeyPointsDataContext",
39
41
  "IKeyPointsSchema",
40
42
  "ISegmentationDataContext",
@@ -32,13 +32,13 @@ from .data_context import (
32
32
  KeyPointsDataContext,
33
33
  SegmentationDataContext,
34
34
  )
35
+ from .frame_sink_factory import FrameSinkFactory
35
36
  from .schema import (
36
37
  IKeyPointsSchema,
37
38
  ISegmentationSchema,
38
39
  KeyPointsSchema,
39
40
  SegmentationSchema,
40
41
  )
41
- from .transport_protocol import TransportKind
42
42
 
43
43
  if TYPE_CHECKING:
44
44
  from rocket_welder_sdk.keypoints_protocol import KeyPointsSink
@@ -203,35 +203,8 @@ class RocketWelderClient:
203
203
  return kp_ctx, seg_ctx
204
204
 
205
205
  def _create_frame_sink(self, protocol: Any, address: str) -> IFrameSink:
206
- """Create frame sink from protocol."""
207
- from rocket_welder_sdk.transport import NngFrameSink
208
- from rocket_welder_sdk.transport.stream_transport import StreamFrameSink
209
- from rocket_welder_sdk.transport.unix_socket_transport import UnixSocketFrameSink
210
-
211
- from .transport_protocol import TransportProtocol
212
-
213
- if not isinstance(protocol, TransportProtocol):
214
- raise TypeError(f"Expected TransportProtocol, got {type(protocol)}")
215
-
216
- if protocol.kind == TransportKind.FILE:
217
- logger.debug("Creating file sink: %s", address)
218
- file_handle = open(address, "wb")
219
- try:
220
- return StreamFrameSink(file_handle)
221
- except Exception:
222
- file_handle.close()
223
- raise
224
- elif protocol.kind == TransportKind.SOCKET:
225
- logger.debug("Creating Unix socket sink: %s", address)
226
- return UnixSocketFrameSink.connect(address)
227
- elif protocol.kind in (TransportKind.NNG_PUSH_IPC, TransportKind.NNG_PUSH_TCP):
228
- logger.debug("Creating NNG pusher: %s", address)
229
- return NngFrameSink.create_pusher(address)
230
- elif protocol.kind in (TransportKind.NNG_PUB_IPC, TransportKind.NNG_PUB_TCP):
231
- logger.debug("Creating NNG publisher: %s", address)
232
- return NngFrameSink.create_publisher(address)
233
- else:
234
- raise ValueError(f"Unsupported protocol: {protocol}")
206
+ """Create frame sink from protocol using FrameSinkFactory."""
207
+ return FrameSinkFactory.create(protocol, address, logger_instance=logger)
235
208
 
236
209
  def close(self) -> None:
237
210
  """Release resources."""
@@ -0,0 +1,118 @@
1
+ """
2
+ Factory for creating IFrameSink instances from parsed protocol and address.
3
+
4
+ Does NOT parse URLs - use SegmentationConnectionString or KeyPointsConnectionString for parsing.
5
+
6
+ This mirrors the C# FrameSinkFactory class for API consistency.
7
+
8
+ Usage:
9
+ from rocket_welder_sdk.high_level import FrameSinkFactory, SegmentationConnectionString
10
+
11
+ cs = SegmentationConnectionString.parse("socket:///tmp/seg.sock")
12
+ sink = FrameSinkFactory.create(cs.protocol, cs.address)
13
+
14
+ # For null sink (no output configured):
15
+ sink = FrameSinkFactory.create_null()
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import logging
21
+ from typing import TYPE_CHECKING, Optional
22
+
23
+ from .transport_protocol import TransportProtocol
24
+
25
+ if TYPE_CHECKING:
26
+ from rocket_welder_sdk.transport.frame_sink import IFrameSink
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ class FrameSinkFactory:
32
+ """
33
+ Factory for creating IFrameSink instances from parsed protocol and address.
34
+
35
+ Does NOT parse URLs - use SegmentationConnectionString or KeyPointsConnectionString for parsing.
36
+
37
+ Mirrors C# RocketWelder.SDK.Transport.FrameSinkFactory.
38
+ """
39
+
40
+ @staticmethod
41
+ def create(
42
+ protocol: Optional[TransportProtocol],
43
+ address: str,
44
+ *,
45
+ logger_instance: Optional[logging.Logger] = None,
46
+ ) -> IFrameSink:
47
+ """
48
+ Create a frame sink from parsed protocol and address.
49
+
50
+ Returns NullFrameSink if protocol is None (no URL specified).
51
+
52
+ Args:
53
+ protocol: The transport protocol (from ConnectionString.protocol), or None
54
+ address: The address (file path, socket path, or NNG address)
55
+ logger_instance: Optional logger for diagnostics
56
+
57
+ Returns:
58
+ An IFrameSink connected to the specified address, or NullFrameSink if protocol is None
59
+
60
+ Raises:
61
+ ValueError: If protocol is not supported for sinks
62
+
63
+ Example:
64
+ cs = SegmentationConnectionString.parse("socket:///tmp/seg.sock")
65
+ sink = FrameSinkFactory.create(cs.protocol, cs.address)
66
+ """
67
+ from rocket_welder_sdk.transport import NngFrameSink, NullFrameSink
68
+ from rocket_welder_sdk.transport.stream_transport import StreamFrameSink
69
+ from rocket_welder_sdk.transport.unix_socket_transport import UnixSocketFrameSink
70
+
71
+ log = logger_instance or logger
72
+
73
+ # Handle None protocol - return null sink
74
+ if protocol is None:
75
+ log.debug("No protocol specified, using NullFrameSink")
76
+ return NullFrameSink.instance()
77
+
78
+ if not isinstance(protocol, TransportProtocol):
79
+ raise TypeError(f"Expected TransportProtocol, got {type(protocol).__name__}")
80
+
81
+ if protocol.is_file:
82
+ log.info("Creating file frame sink at: %s", address)
83
+ file_handle = open(address, "wb") # noqa: SIM115
84
+ return StreamFrameSink(file_handle)
85
+
86
+ if protocol.is_socket:
87
+ log.info("Creating Unix socket frame sink at: %s", address)
88
+ return UnixSocketFrameSink.connect(address)
89
+
90
+ if protocol.is_nng:
91
+ log.info("Creating NNG frame sink (%s) at: %s", protocol.schema, address)
92
+
93
+ if protocol.is_pub:
94
+ return NngFrameSink.create_publisher(address)
95
+ if protocol.is_push:
96
+ return NngFrameSink.create_pusher(address)
97
+
98
+ raise ValueError(
99
+ f"NNG protocol '{protocol.schema}' is not supported for sinks "
100
+ "(only pub and push are supported)"
101
+ )
102
+
103
+ raise ValueError(f"Transport protocol '{protocol.schema}' is not supported for frame sinks")
104
+
105
+ @staticmethod
106
+ def create_null() -> IFrameSink:
107
+ """
108
+ Create a null frame sink that discards all data.
109
+
110
+ Use when no output URL is configured.
111
+ """
112
+ from rocket_welder_sdk.transport import NullFrameSink
113
+
114
+ return NullFrameSink.instance()
115
+
116
+
117
+ # Re-export for convenience
118
+ __all__ = ["FrameSinkFactory"]
@@ -10,7 +10,7 @@ from __future__ import annotations
10
10
  import json
11
11
  from abc import ABC, abstractmethod
12
12
  from dataclasses import dataclass
13
- from typing import Dict, List, Any
13
+ from typing import Any, Dict, List
14
14
 
15
15
 
16
16
  @dataclass(frozen=True)
@@ -190,8 +190,6 @@ class SegmentationSchema(ISegmentationSchema):
190
190
  metadata: Dict[str, Any] = {
191
191
  "version": 1,
192
192
  "type": "segmentation",
193
- "classes": [
194
- {"classId": c.class_id, "name": c.name} for c in self._classes.values()
195
- ],
193
+ "classes": [{"classId": c.class_id, "name": c.name} for c in self._classes.values()],
196
194
  }
197
195
  return json.dumps(metadata, indent=2)
@@ -4,7 +4,7 @@ Transport layer for RocketWelder SDK.
4
4
  Provides transport-agnostic frame sink/source abstractions for protocols.
5
5
  """
6
6
 
7
- from .frame_sink import IFrameSink
7
+ from .frame_sink import IFrameSink, NullFrameSink
8
8
  from .frame_source import IFrameSource
9
9
  from .nng_transport import NngFrameSink, NngFrameSource
10
10
  from .stream_transport import StreamFrameSink, StreamFrameSource
@@ -20,6 +20,7 @@ __all__ = [
20
20
  "IFrameSource",
21
21
  "NngFrameSink",
22
22
  "NngFrameSource",
23
+ "NullFrameSink",
23
24
  "StreamFrameSink",
24
25
  "StreamFrameSource",
25
26
  "TcpFrameSink",
@@ -75,3 +75,48 @@ class IFrameSink(ABC):
75
75
  async def close_async(self) -> None:
76
76
  """Close the sink and release resources asynchronously."""
77
77
  pass
78
+
79
+
80
+ class NullFrameSink(IFrameSink):
81
+ """
82
+ A frame sink that discards all data.
83
+
84
+ Use when no output URL is configured or for testing.
85
+ Singleton pattern - use NullFrameSink.instance() to get the shared instance.
86
+ """
87
+
88
+ _instance: "NullFrameSink | None" = None
89
+
90
+ def __new__(cls) -> "NullFrameSink":
91
+ if cls._instance is None:
92
+ cls._instance = super().__new__(cls)
93
+ return cls._instance
94
+
95
+ @classmethod
96
+ def instance(cls) -> "NullFrameSink":
97
+ """Get the singleton instance."""
98
+ return cls()
99
+
100
+ def write_frame(self, frame_data: bytes) -> None:
101
+ """Discards the frame data (no-op)."""
102
+ pass
103
+
104
+ async def write_frame_async(self, frame_data: bytes) -> None:
105
+ """Discards the frame data (no-op)."""
106
+ pass
107
+
108
+ def flush(self) -> None:
109
+ """No-op flush."""
110
+ pass
111
+
112
+ async def flush_async(self) -> None:
113
+ """No-op flush."""
114
+ pass
115
+
116
+ def close(self) -> None:
117
+ """No-op close (singleton, never actually closed)."""
118
+ pass
119
+
120
+ async def close_async(self) -> None:
121
+ """No-op close (singleton, never actually closed)."""
122
+ pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rocket-welder-sdk
3
- Version: 1.1.35.dev12
3
+ Version: 1.1.36
4
4
  Summary: High-performance video streaming SDK for RocketWelder services using ZeroBuffer IPC
5
5
  Home-page: https://github.com/modelingevolution/rocket-welder-sdk
6
6
  Author: ModelingEvolution
@@ -30,6 +30,7 @@ rocket_welder_sdk/high_level/__init__.py
30
30
  rocket_welder_sdk/high_level/client.py
31
31
  rocket_welder_sdk/high_level/connection_strings.py
32
32
  rocket_welder_sdk/high_level/data_context.py
33
+ rocket_welder_sdk/high_level/frame_sink_factory.py
33
34
  rocket_welder_sdk/high_level/schema.py
34
35
  rocket_welder_sdk/high_level/transport_protocol.py
35
36
  rocket_welder_sdk/transport/__init__.py
@@ -363,7 +363,10 @@ class TestKeyPointsSchema:
363
363
  json_str = schema.get_metadata_json()
364
364
  assert "nose" in json_str
365
365
  assert "left_eye" in json_str
366
- assert '"version": "1.0"' in json_str
366
+ assert '"version": 1' in json_str
367
+ assert '"type": "keypoints"' in json_str
368
+ assert '"id": 0' in json_str
369
+ assert '"id": 1' in json_str
367
370
 
368
371
 
369
372
  class TestSegmentationSchema:
@@ -423,7 +426,10 @@ class TestSegmentationSchema:
423
426
  json_str = schema.get_metadata_json()
424
427
  assert "person" in json_str
425
428
  assert "car" in json_str
426
- assert '"version": "1.0"' in json_str
429
+ assert '"version": 1' in json_str
430
+ assert '"type": "segmentation"' in json_str
431
+ assert '"classId": 1' in json_str
432
+ assert '"classId": 2' in json_str
427
433
 
428
434
 
429
435
  class TestKeyPointDefinition:
@@ -1 +0,0 @@
1
- 1.1.35.dev12