rainbow-rb-zenoh 0.0.9.dev5__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.
- rainbow_rb_zenoh-0.0.9.dev5/PKG-INFO +196 -0
- rainbow_rb_zenoh-0.0.9.dev5/README.md +184 -0
- rainbow_rb_zenoh-0.0.9.dev5/pyproject.toml +31 -0
- rainbow_rb_zenoh-0.0.9.dev5/setup.cfg +4 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow/rb_zenoh/__init__.py +1 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow/rb_zenoh/client.py +2145 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow/rb_zenoh/exeption.py +56 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow/rb_zenoh/frs_client.py +2026 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow/rb_zenoh/py.typed +0 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow/rb_zenoh/router.py +277 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow/rb_zenoh/schema.py +68 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow/rb_zenoh/utils.py +150 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow_rb_zenoh.egg-info/PKG-INFO +196 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow_rb_zenoh.egg-info/SOURCES.txt +15 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow_rb_zenoh.egg-info/dependency_links.txt +1 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow_rb_zenoh.egg-info/requires.txt +4 -0
- rainbow_rb_zenoh-0.0.9.dev5/src/rainbow_rb_zenoh.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rainbow-rb-zenoh
|
|
3
|
+
Version: 0.0.9.dev5
|
|
4
|
+
Summary: Rainbow Zenoh Python
|
|
5
|
+
Author-email: Derek <dfd1123@rainbow-robotics.com>
|
|
6
|
+
Requires-Python: <3.13,>=3.12
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: psutil<8.0.0,>=7.0.0
|
|
9
|
+
Requires-Dist: flatbuffers<26.0.0,>=25.2.10
|
|
10
|
+
Requires-Dist: fastapi>=0.116.1
|
|
11
|
+
Requires-Dist: rainbow-rb-utils==0.0.9.dev5
|
|
12
|
+
|
|
13
|
+
# rb_zenoh
|
|
14
|
+
|
|
15
|
+
`rb_zenoh`는 Zenoh 기반의 공통 통신 패키지입니다.
|
|
16
|
+
주요 기능은 `publish/subscribe`, `query/queryable`, `ZenohRouter` 데코레이터 라우팅입니다.
|
|
17
|
+
|
|
18
|
+
## 설치/의존성
|
|
19
|
+
|
|
20
|
+
- Python: `>=3.12,<3.13`
|
|
21
|
+
- 패키지 의존성: `flatbuffers`, `psutil`, `rb_utils`, `rb_modules`
|
|
22
|
+
|
|
23
|
+
## 핵심 객체
|
|
24
|
+
|
|
25
|
+
- `ZenohClient`: 저수준 통신 API
|
|
26
|
+
- `ZenohRouter`: 데코레이터 기반 라우터
|
|
27
|
+
- `SubscribeOptions`: subscribe 동작 옵션
|
|
28
|
+
|
|
29
|
+
## 1) publish
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
from rb_zenoh.client import ZenohClient
|
|
33
|
+
|
|
34
|
+
client = ZenohClient()
|
|
35
|
+
client.publish("muscat/sample/topic", payload={"ok": True})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
FlatBuffer 요청 publish:
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
from rb_flat_buffers.IPC.Request_MotionPause import Request_MotionPauseT
|
|
42
|
+
|
|
43
|
+
req = Request_MotionPauseT()
|
|
44
|
+
client.publish(
|
|
45
|
+
"C500920/call_pause",
|
|
46
|
+
flatbuffer_req_obj=req,
|
|
47
|
+
flatbuffer_buf_size=64,
|
|
48
|
+
)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 2) subscribe
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from rb_zenoh.client import ZenohClient
|
|
55
|
+
from rb_zenoh.schema import SubscribeOptions
|
|
56
|
+
|
|
57
|
+
client = ZenohClient()
|
|
58
|
+
|
|
59
|
+
async def on_msg(*, topic, mv, obj_payload, dict_payload, attachment):
|
|
60
|
+
print(topic, obj_payload, dict_payload, attachment)
|
|
61
|
+
|
|
62
|
+
client.subscribe(
|
|
63
|
+
"muscat/sample/topic",
|
|
64
|
+
on_msg,
|
|
65
|
+
options=SubscribeOptions(dispatch="immediate"),
|
|
66
|
+
)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
콜백 시그니처:
|
|
70
|
+
- `topic`: topic 문자열
|
|
71
|
+
- `mv`: raw payload(memoryview)
|
|
72
|
+
- `obj_payload`: `flatbuffer_obj_t=<FlatBuffer T class>` 파싱 객체 (`T | None`)
|
|
73
|
+
- `dict_payload`: `flatbuffer_obj_t` 유무와 무관하게 dict 변환 결과 (`dict | None`)
|
|
74
|
+
- `attachment`: `sender`, `sender_id` 정보
|
|
75
|
+
|
|
76
|
+
## 3) queryable
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
def on_query(req=None, params=None):
|
|
80
|
+
return {"status": "ok"}
|
|
81
|
+
|
|
82
|
+
client.queryable("muscat/sample/query", on_query)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
콜백 인자 의미:
|
|
86
|
+
- `req`: query payload 본문
|
|
87
|
+
- `flatbuffer_req_t`/`flatbuffer_req_T_class`를 지정한 경우에만 주입됩니다.
|
|
88
|
+
- 내부에서 `InitFromPackedBuf(...)`로 파싱한 FlatBuffer `...T` 객체입니다.
|
|
89
|
+
- 요청 payload가 없는데 `flatbuffer_req_t`를 지정하면 에러가 발생합니다.
|
|
90
|
+
- `params`: query parameter
|
|
91
|
+
- 내부 `q.parameters` 값을 `dict[str, str]` 형태로 주입합니다.
|
|
92
|
+
- payload(`req`)와 별도로 필터/옵션 전달에 사용합니다.
|
|
93
|
+
|
|
94
|
+
주의사항:
|
|
95
|
+
- 콜백 파라미터 이름이 정확히 `req`, `params`일 때만 자동 주입됩니다.
|
|
96
|
+
- `request`, `query_params` 같은 다른 이름으로 선언하면 주입되지 않습니다.
|
|
97
|
+
- 둘 다 선언하지 않으면 인자 없이 호출됩니다.
|
|
98
|
+
|
|
99
|
+
## 4) query_one / query_all
|
|
100
|
+
|
|
101
|
+
### query_one
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
res = client.query_one("muscat/program/state", timeout=0.3)
|
|
105
|
+
print(res.get("dict_payload"))
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- 첫 응답 1개만 반환
|
|
109
|
+
- 응답이 없으면 `ZenohNoReply` 예외
|
|
110
|
+
|
|
111
|
+
### query_all
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
res_list = client.query_all("*/health", timeout=0.5)
|
|
115
|
+
for item in res_list:
|
|
116
|
+
print(item.get("key"), item.get("dict_payload"))
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
- timeout 내 도착한 응답을 모두 list로 반환
|
|
120
|
+
- 응답이 없어도 빈 리스트 반환
|
|
121
|
+
|
|
122
|
+
### 언제 무엇을 쓸지
|
|
123
|
+
|
|
124
|
+
- 단일 대상 호출: `query_one`
|
|
125
|
+
- 와일드카드/다중 서비스 수집: `query_all`
|
|
126
|
+
|
|
127
|
+
## FlatBuffer 파라미터 상세
|
|
128
|
+
|
|
129
|
+
### `flatbuffer_req_obj`
|
|
130
|
+
|
|
131
|
+
- 의미: 요청으로 보낼 FlatBuffer 객체(`Pack()` 가능한 객체)
|
|
132
|
+
- 사용 위치: `publish`, `query_one`, `query_all`
|
|
133
|
+
- 내부 동작: builder로 pack 후 bytes payload 전송
|
|
134
|
+
|
|
135
|
+
### `flatbuffer_buf_size`
|
|
136
|
+
|
|
137
|
+
- 의미: FlatBuffer 직렬화 builder 초기 버퍼 크기
|
|
138
|
+
- 사용 위치:
|
|
139
|
+
- 요청 직렬화: `publish`, `query_one`, `query_all`
|
|
140
|
+
- queryable 응답 직렬화: `queryable(..., flatbuffer_res_buf_size=...)`
|
|
141
|
+
- 너무 작으면 직렬화 실패 가능
|
|
142
|
+
- 권장: 64/128/256/512부터 시작해 payload 크기에 맞게 상향
|
|
143
|
+
|
|
144
|
+
### `flatbuffer_res_T_class`
|
|
145
|
+
|
|
146
|
+
- 의미: 응답 payload를 어떤 FlatBuffer 타입으로 파싱할지 지정
|
|
147
|
+
- 사용 위치: `query_one`, `query_all`
|
|
148
|
+
- 타입: **FlatBuffer Object API 클래스(T 클래스)** 를 넘겨야 함
|
|
149
|
+
- 예: `Response_FunctionsT`, `State_CoreT`
|
|
150
|
+
- 보통 이름이 `...T`로 끝나는 클래스
|
|
151
|
+
- 내부적으로 `InitFromPackedBuf(...)`를 통해 파싱됨
|
|
152
|
+
- 결과:
|
|
153
|
+
- 지정 시: `obj_payload`에 파싱 객체
|
|
154
|
+
- 미지정 시: `dict_payload`/raw payload 중심 사용
|
|
155
|
+
|
|
156
|
+
예시:
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
from rb_flat_buffers.IPC.Request_MotionPause import Request_MotionPauseT
|
|
160
|
+
from rb_flat_buffers.IPC.Response_Functions import Response_FunctionsT
|
|
161
|
+
|
|
162
|
+
res = client.query_one(
|
|
163
|
+
"C500920/call_pause",
|
|
164
|
+
flatbuffer_req_obj=Request_MotionPauseT(),
|
|
165
|
+
flatbuffer_res_T_class=Response_FunctionsT,
|
|
166
|
+
flatbuffer_buf_size=64,
|
|
167
|
+
timeout=0.3,
|
|
168
|
+
)
|
|
169
|
+
obj = res.get("obj_payload")
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## 5) ZenohRouter 사용
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
from rb_zenoh.router import ZenohRouter
|
|
176
|
+
|
|
177
|
+
router = ZenohRouter(prefix="muscat/common")
|
|
178
|
+
|
|
179
|
+
@router.subscribe("health")
|
|
180
|
+
async def on_health(*, topic, obj_payload, dict_payload, attachment):
|
|
181
|
+
pass
|
|
182
|
+
|
|
183
|
+
@router.queryable("echo")
|
|
184
|
+
async def on_echo(params=None):
|
|
185
|
+
return {"ok": True}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
라이프사이클:
|
|
189
|
+
- 시작 시 `await router.startup()`
|
|
190
|
+
- 종료 시 `await router.shutdown()`
|
|
191
|
+
|
|
192
|
+
## 예외/주의사항
|
|
193
|
+
|
|
194
|
+
- `query_one` no-reply: `ZenohNoReply`
|
|
195
|
+
- transport 재연결 계열: `ZenohTransportError`
|
|
196
|
+
- `ZenohClient`는 프로세스 단위 싱글톤이므로 불필요한 잦은 `close()` 호출은 피하는 것을 권장
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# rb_zenoh
|
|
2
|
+
|
|
3
|
+
`rb_zenoh`는 Zenoh 기반의 공통 통신 패키지입니다.
|
|
4
|
+
주요 기능은 `publish/subscribe`, `query/queryable`, `ZenohRouter` 데코레이터 라우팅입니다.
|
|
5
|
+
|
|
6
|
+
## 설치/의존성
|
|
7
|
+
|
|
8
|
+
- Python: `>=3.12,<3.13`
|
|
9
|
+
- 패키지 의존성: `flatbuffers`, `psutil`, `rb_utils`, `rb_modules`
|
|
10
|
+
|
|
11
|
+
## 핵심 객체
|
|
12
|
+
|
|
13
|
+
- `ZenohClient`: 저수준 통신 API
|
|
14
|
+
- `ZenohRouter`: 데코레이터 기반 라우터
|
|
15
|
+
- `SubscribeOptions`: subscribe 동작 옵션
|
|
16
|
+
|
|
17
|
+
## 1) publish
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
from rb_zenoh.client import ZenohClient
|
|
21
|
+
|
|
22
|
+
client = ZenohClient()
|
|
23
|
+
client.publish("muscat/sample/topic", payload={"ok": True})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
FlatBuffer 요청 publish:
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
from rb_flat_buffers.IPC.Request_MotionPause import Request_MotionPauseT
|
|
30
|
+
|
|
31
|
+
req = Request_MotionPauseT()
|
|
32
|
+
client.publish(
|
|
33
|
+
"C500920/call_pause",
|
|
34
|
+
flatbuffer_req_obj=req,
|
|
35
|
+
flatbuffer_buf_size=64,
|
|
36
|
+
)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 2) subscribe
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
from rb_zenoh.client import ZenohClient
|
|
43
|
+
from rb_zenoh.schema import SubscribeOptions
|
|
44
|
+
|
|
45
|
+
client = ZenohClient()
|
|
46
|
+
|
|
47
|
+
async def on_msg(*, topic, mv, obj_payload, dict_payload, attachment):
|
|
48
|
+
print(topic, obj_payload, dict_payload, attachment)
|
|
49
|
+
|
|
50
|
+
client.subscribe(
|
|
51
|
+
"muscat/sample/topic",
|
|
52
|
+
on_msg,
|
|
53
|
+
options=SubscribeOptions(dispatch="immediate"),
|
|
54
|
+
)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
콜백 시그니처:
|
|
58
|
+
- `topic`: topic 문자열
|
|
59
|
+
- `mv`: raw payload(memoryview)
|
|
60
|
+
- `obj_payload`: `flatbuffer_obj_t=<FlatBuffer T class>` 파싱 객체 (`T | None`)
|
|
61
|
+
- `dict_payload`: `flatbuffer_obj_t` 유무와 무관하게 dict 변환 결과 (`dict | None`)
|
|
62
|
+
- `attachment`: `sender`, `sender_id` 정보
|
|
63
|
+
|
|
64
|
+
## 3) queryable
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
def on_query(req=None, params=None):
|
|
68
|
+
return {"status": "ok"}
|
|
69
|
+
|
|
70
|
+
client.queryable("muscat/sample/query", on_query)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
콜백 인자 의미:
|
|
74
|
+
- `req`: query payload 본문
|
|
75
|
+
- `flatbuffer_req_t`/`flatbuffer_req_T_class`를 지정한 경우에만 주입됩니다.
|
|
76
|
+
- 내부에서 `InitFromPackedBuf(...)`로 파싱한 FlatBuffer `...T` 객체입니다.
|
|
77
|
+
- 요청 payload가 없는데 `flatbuffer_req_t`를 지정하면 에러가 발생합니다.
|
|
78
|
+
- `params`: query parameter
|
|
79
|
+
- 내부 `q.parameters` 값을 `dict[str, str]` 형태로 주입합니다.
|
|
80
|
+
- payload(`req`)와 별도로 필터/옵션 전달에 사용합니다.
|
|
81
|
+
|
|
82
|
+
주의사항:
|
|
83
|
+
- 콜백 파라미터 이름이 정확히 `req`, `params`일 때만 자동 주입됩니다.
|
|
84
|
+
- `request`, `query_params` 같은 다른 이름으로 선언하면 주입되지 않습니다.
|
|
85
|
+
- 둘 다 선언하지 않으면 인자 없이 호출됩니다.
|
|
86
|
+
|
|
87
|
+
## 4) query_one / query_all
|
|
88
|
+
|
|
89
|
+
### query_one
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
res = client.query_one("muscat/program/state", timeout=0.3)
|
|
93
|
+
print(res.get("dict_payload"))
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
- 첫 응답 1개만 반환
|
|
97
|
+
- 응답이 없으면 `ZenohNoReply` 예외
|
|
98
|
+
|
|
99
|
+
### query_all
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
res_list = client.query_all("*/health", timeout=0.5)
|
|
103
|
+
for item in res_list:
|
|
104
|
+
print(item.get("key"), item.get("dict_payload"))
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
- timeout 내 도착한 응답을 모두 list로 반환
|
|
108
|
+
- 응답이 없어도 빈 리스트 반환
|
|
109
|
+
|
|
110
|
+
### 언제 무엇을 쓸지
|
|
111
|
+
|
|
112
|
+
- 단일 대상 호출: `query_one`
|
|
113
|
+
- 와일드카드/다중 서비스 수집: `query_all`
|
|
114
|
+
|
|
115
|
+
## FlatBuffer 파라미터 상세
|
|
116
|
+
|
|
117
|
+
### `flatbuffer_req_obj`
|
|
118
|
+
|
|
119
|
+
- 의미: 요청으로 보낼 FlatBuffer 객체(`Pack()` 가능한 객체)
|
|
120
|
+
- 사용 위치: `publish`, `query_one`, `query_all`
|
|
121
|
+
- 내부 동작: builder로 pack 후 bytes payload 전송
|
|
122
|
+
|
|
123
|
+
### `flatbuffer_buf_size`
|
|
124
|
+
|
|
125
|
+
- 의미: FlatBuffer 직렬화 builder 초기 버퍼 크기
|
|
126
|
+
- 사용 위치:
|
|
127
|
+
- 요청 직렬화: `publish`, `query_one`, `query_all`
|
|
128
|
+
- queryable 응답 직렬화: `queryable(..., flatbuffer_res_buf_size=...)`
|
|
129
|
+
- 너무 작으면 직렬화 실패 가능
|
|
130
|
+
- 권장: 64/128/256/512부터 시작해 payload 크기에 맞게 상향
|
|
131
|
+
|
|
132
|
+
### `flatbuffer_res_T_class`
|
|
133
|
+
|
|
134
|
+
- 의미: 응답 payload를 어떤 FlatBuffer 타입으로 파싱할지 지정
|
|
135
|
+
- 사용 위치: `query_one`, `query_all`
|
|
136
|
+
- 타입: **FlatBuffer Object API 클래스(T 클래스)** 를 넘겨야 함
|
|
137
|
+
- 예: `Response_FunctionsT`, `State_CoreT`
|
|
138
|
+
- 보통 이름이 `...T`로 끝나는 클래스
|
|
139
|
+
- 내부적으로 `InitFromPackedBuf(...)`를 통해 파싱됨
|
|
140
|
+
- 결과:
|
|
141
|
+
- 지정 시: `obj_payload`에 파싱 객체
|
|
142
|
+
- 미지정 시: `dict_payload`/raw payload 중심 사용
|
|
143
|
+
|
|
144
|
+
예시:
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
from rb_flat_buffers.IPC.Request_MotionPause import Request_MotionPauseT
|
|
148
|
+
from rb_flat_buffers.IPC.Response_Functions import Response_FunctionsT
|
|
149
|
+
|
|
150
|
+
res = client.query_one(
|
|
151
|
+
"C500920/call_pause",
|
|
152
|
+
flatbuffer_req_obj=Request_MotionPauseT(),
|
|
153
|
+
flatbuffer_res_T_class=Response_FunctionsT,
|
|
154
|
+
flatbuffer_buf_size=64,
|
|
155
|
+
timeout=0.3,
|
|
156
|
+
)
|
|
157
|
+
obj = res.get("obj_payload")
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## 5) ZenohRouter 사용
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
from rb_zenoh.router import ZenohRouter
|
|
164
|
+
|
|
165
|
+
router = ZenohRouter(prefix="muscat/common")
|
|
166
|
+
|
|
167
|
+
@router.subscribe("health")
|
|
168
|
+
async def on_health(*, topic, obj_payload, dict_payload, attachment):
|
|
169
|
+
pass
|
|
170
|
+
|
|
171
|
+
@router.queryable("echo")
|
|
172
|
+
async def on_echo(params=None):
|
|
173
|
+
return {"ok": True}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
라이프사이클:
|
|
177
|
+
- 시작 시 `await router.startup()`
|
|
178
|
+
- 종료 시 `await router.shutdown()`
|
|
179
|
+
|
|
180
|
+
## 예외/주의사항
|
|
181
|
+
|
|
182
|
+
- `query_one` no-reply: `ZenohNoReply`
|
|
183
|
+
- transport 재연결 계열: `ZenohTransportError`
|
|
184
|
+
- `ZenohClient`는 프로세스 단위 싱글톤이므로 불필요한 잦은 `close()` 호출은 피하는 것을 권장
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=69", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "rainbow-rb-zenoh"
|
|
7
|
+
version = "0.0.9.dev5"
|
|
8
|
+
requires-python = ">=3.12,<3.13"
|
|
9
|
+
description = "Rainbow Zenoh Python"
|
|
10
|
+
authors = [
|
|
11
|
+
{ name = "Derek", email = "dfd1123@rainbow-robotics.com" },
|
|
12
|
+
]
|
|
13
|
+
readme = "README.md"
|
|
14
|
+
|
|
15
|
+
dependencies = [
|
|
16
|
+
"psutil>=7.0.0,<8.0.0",
|
|
17
|
+
"flatbuffers>=25.2.10,<26.0.0",
|
|
18
|
+
"fastapi>=0.116.1",
|
|
19
|
+
"rainbow-rb-utils==0.0.9.dev5",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
[tool.setuptools]
|
|
23
|
+
package-dir = {"" = "src"}
|
|
24
|
+
include-package-data = true
|
|
25
|
+
|
|
26
|
+
[tool.setuptools.packages.find]
|
|
27
|
+
where = ["src"]
|
|
28
|
+
include = ["rainbow.rb_zenoh*"]
|
|
29
|
+
|
|
30
|
+
[tool.setuptools.package-data]
|
|
31
|
+
"*" = ["py.typed"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|