nebu 0.1.121__py3-none-any.whl → 0.1.122__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.
- nebu/processors/consumer.py +8 -8
- nebu/processors/consumer_health_worker.py +77 -66
- {nebu-0.1.121.dist-info → nebu-0.1.122.dist-info}/METADATA +1 -1
- {nebu-0.1.121.dist-info → nebu-0.1.122.dist-info}/RECORD +7 -7
- {nebu-0.1.121.dist-info → nebu-0.1.122.dist-info}/WHEEL +0 -0
- {nebu-0.1.121.dist-info → nebu-0.1.122.dist-info}/licenses/LICENSE +0 -0
- {nebu-0.1.121.dist-info → nebu-0.1.122.dist-info}/top_level.txt +0 -0
nebu/processors/consumer.py
CHANGED
@@ -471,10 +471,10 @@ def check_health_subprocess() -> bool:
|
|
471
471
|
"""Check if the health subprocess is still running and restart if needed."""
|
472
472
|
global health_subprocess
|
473
473
|
|
474
|
-
print(f"[DEBUG] check_health_subprocess called")
|
474
|
+
# print(f"[DEBUG] check_health_subprocess called")
|
475
475
|
|
476
476
|
if health_subprocess is None:
|
477
|
-
print(f"[DEBUG] health_subprocess is None")
|
477
|
+
# print(f"[DEBUG] health_subprocess is None")
|
478
478
|
return False
|
479
479
|
|
480
480
|
# Cat the health subprocess log file
|
@@ -503,7 +503,7 @@ def check_health_subprocess() -> bool:
|
|
503
503
|
|
504
504
|
# Check if process is still running
|
505
505
|
poll_result = health_subprocess.poll()
|
506
|
-
print(f"[DEBUG] health_subprocess.poll() returned: {poll_result}")
|
506
|
+
# print(f"[DEBUG] health_subprocess.poll() returned: {poll_result}")
|
507
507
|
|
508
508
|
if poll_result is None:
|
509
509
|
print(f"[DEBUG] Health subprocess still running (PID {health_subprocess.pid})")
|
@@ -511,29 +511,29 @@ def check_health_subprocess() -> bool:
|
|
511
511
|
|
512
512
|
# Process has exited
|
513
513
|
exit_code = health_subprocess.returncode
|
514
|
-
print(f"[DEBUG] Health subprocess exited with code {exit_code}")
|
514
|
+
# print(f"[DEBUG] Health subprocess exited with code {exit_code}")
|
515
515
|
logger.warning(
|
516
516
|
f"[Consumer] Health subprocess exited with code {exit_code}. Restarting..."
|
517
517
|
)
|
518
518
|
|
519
519
|
# Start a new health subprocess
|
520
|
-
print(f"[DEBUG] Attempting to restart health subprocess...")
|
520
|
+
# print(f"[DEBUG] Attempting to restart health subprocess...")
|
521
521
|
health_subprocess = start_health_check_subprocess()
|
522
522
|
|
523
523
|
if health_subprocess:
|
524
|
-
print(f"[DEBUG] Health subprocess restarted successfully")
|
524
|
+
# print(f"[DEBUG] Health subprocess restarted successfully")
|
525
525
|
# Start monitoring thread for the new subprocess
|
526
526
|
monitor_thread = threading.Thread(
|
527
527
|
target=monitor_health_subprocess, args=(health_subprocess,), daemon=True
|
528
528
|
)
|
529
529
|
monitor_thread.start()
|
530
|
-
print(f"[DEBUG] Monitor thread started for health subprocess")
|
530
|
+
# print(f"[DEBUG] Monitor thread started for health subprocess")
|
531
531
|
logger.info(
|
532
532
|
"[Consumer] Health subprocess restarted and monitoring thread started."
|
533
533
|
)
|
534
534
|
return True
|
535
535
|
else:
|
536
|
-
print(f"[DEBUG] Failed to restart health subprocess")
|
536
|
+
# print(f"[DEBUG] Failed to restart health subprocess")
|
537
537
|
logger.error("[Consumer] Failed to restart health subprocess.")
|
538
538
|
return False
|
539
539
|
|
@@ -51,11 +51,11 @@ def process_health_check_message(
|
|
51
51
|
health_group: str,
|
52
52
|
) -> None:
|
53
53
|
"""Processes a single health check message."""
|
54
|
-
print(f"[HEALTH DEBUG] === PROCESSING HEALTH CHECK MESSAGE ===")
|
55
|
-
print(f"[HEALTH DEBUG] Message ID: {message_id}")
|
56
|
-
print(f"[HEALTH DEBUG] Message data: {message_data}")
|
57
|
-
print(f"[HEALTH DEBUG] Health stream: {health_stream}")
|
58
|
-
print(f"[HEALTH DEBUG] Health group: {health_group}")
|
54
|
+
# print(f"[HEALTH DEBUG] === PROCESSING HEALTH CHECK MESSAGE ===")
|
55
|
+
# print(f"[HEALTH DEBUG] Message ID: {message_id}")
|
56
|
+
# print(f"[HEALTH DEBUG] Message data: {message_data}")
|
57
|
+
# print(f"[HEALTH DEBUG] Health stream: {health_stream}")
|
58
|
+
# print(f"[HEALTH DEBUG] Health group: {health_group}")
|
59
59
|
|
60
60
|
logger.info(f"Processing health check message {message_id}: {message_data}")
|
61
61
|
|
@@ -64,33 +64,33 @@ def process_health_check_message(
|
|
64
64
|
details: Optional[Dict[str, Any]] = None
|
65
65
|
return_stream: Optional[str] = None
|
66
66
|
original_message_id: Optional[str] = None
|
67
|
-
user_id: Optional[str] = None
|
67
|
+
# user_id: Optional[str] = None
|
68
68
|
|
69
69
|
try:
|
70
70
|
if "data" in message_data:
|
71
|
-
print(f"[HEALTH DEBUG] Found 'data' field in message")
|
71
|
+
# print(f"[HEALTH DEBUG] Found 'data' field in message")
|
72
72
|
data_str = message_data["data"]
|
73
73
|
print(f"[HEALTH DEBUG] Raw data string: {data_str}")
|
74
74
|
|
75
75
|
data = json.loads(data_str)
|
76
|
-
print(f"[HEALTH DEBUG] Parsed data: {json.dumps(data, indent=2)}")
|
76
|
+
# print(f"[HEALTH DEBUG] Parsed data: {json.dumps(data, indent=2)}")
|
77
77
|
logger.info(f"Health check data: {data}")
|
78
78
|
|
79
79
|
# Extract important fields from the forwarded message
|
80
80
|
return_stream = data.get("return_stream")
|
81
81
|
original_message_id = data.get("original_message_id")
|
82
|
-
user_id = data.get("user_id")
|
83
|
-
inner_kind = data.get("kind")
|
82
|
+
# user_id = data.get("user_id")
|
83
|
+
# inner_kind = data.get("kind")
|
84
84
|
inner_id = data.get("id")
|
85
85
|
content = data.get("content")
|
86
86
|
|
87
|
-
print(f"[HEALTH DEBUG] Extracted fields:")
|
88
|
-
print(f"[HEALTH DEBUG] return_stream: {return_stream}")
|
89
|
-
print(f"[HEALTH DEBUG] original_message_id: {original_message_id}")
|
90
|
-
print(f"[HEALTH DEBUG] user_id: {user_id}")
|
91
|
-
print(f"[HEALTH DEBUG] inner_kind: {inner_kind}")
|
92
|
-
print(f"[HEALTH DEBUG] inner_id: {inner_id}")
|
93
|
-
print(f"[HEALTH DEBUG] content: {content}")
|
87
|
+
# print(f"[HEALTH DEBUG] Extracted fields:")
|
88
|
+
# print(f"[HEALTH DEBUG] return_stream: {return_stream}")
|
89
|
+
# print(f"[HEALTH DEBUG] original_message_id: {original_message_id}")
|
90
|
+
# print(f"[HEALTH DEBUG] user_id: {user_id}")
|
91
|
+
# print(f"[HEALTH DEBUG] inner_kind: {inner_kind}")
|
92
|
+
# print(f"[HEALTH DEBUG] inner_id: {inner_id}")
|
93
|
+
# print(f"[HEALTH DEBUG] content: {content}")
|
94
94
|
|
95
95
|
# Update details with health check info
|
96
96
|
details = {
|
@@ -101,12 +101,13 @@ def process_health_check_message(
|
|
101
101
|
|
102
102
|
if content and isinstance(content, dict):
|
103
103
|
details.update({"check_content": content})
|
104
|
-
print(f"[HEALTH DEBUG] Added check_content to details")
|
104
|
+
# print(f"[HEALTH DEBUG] Added check_content to details")
|
105
105
|
else:
|
106
|
-
print(f"[HEALTH DEBUG] No 'data' field found in message_data")
|
106
|
+
# print(f"[HEALTH DEBUG] No 'data' field found in message_data")
|
107
|
+
pass
|
107
108
|
|
108
109
|
except (json.JSONDecodeError, KeyError) as e:
|
109
|
-
print(f"[HEALTH DEBUG] ERROR parsing message data: {e}")
|
110
|
+
# print(f"[HEALTH DEBUG] ERROR parsing message data: {e}")
|
110
111
|
logger.warning(f"Could not parse health check message data: {e}")
|
111
112
|
health_status = "error"
|
112
113
|
health_message = f"Failed to parse health check message data: {e}"
|
@@ -126,16 +127,16 @@ def process_health_check_message(
|
|
126
127
|
|
127
128
|
# Send the response to the return stream in the format expected by the system
|
128
129
|
if return_stream:
|
129
|
-
print(
|
130
|
-
|
131
|
-
)
|
130
|
+
# print(
|
131
|
+
# f"[HEALTH DEBUG] Sending V1ProcessorHealthResponse to return_stream: {return_stream}"
|
132
|
+
# )
|
132
133
|
try:
|
133
134
|
# Send the V1ProcessorHealthResponse directly (not wrapped in StreamResponseMessage)
|
134
135
|
response_data = health_response.model_dump()
|
135
136
|
|
136
|
-
print(
|
137
|
-
|
138
|
-
)
|
137
|
+
# print(
|
138
|
+
# f"[HEALTH DEBUG] Sending V1ProcessorHealthResponse directly: {json.dumps(response_data, indent=2)}"
|
139
|
+
# )
|
139
140
|
|
140
141
|
# Send to return stream
|
141
142
|
redis_conn.xadd(
|
@@ -144,38 +145,39 @@ def process_health_check_message(
|
|
144
145
|
maxlen=1000,
|
145
146
|
approximate=True,
|
146
147
|
)
|
147
|
-
print(
|
148
|
-
|
149
|
-
)
|
148
|
+
# print(
|
149
|
+
# f"[HEALTH DEBUG] V1ProcessorHealthResponse sent successfully to {return_stream}"
|
150
|
+
# )
|
150
151
|
logger.info(
|
151
152
|
f"Sent health response for {message_id} to stream: {return_stream}"
|
152
153
|
)
|
153
154
|
except Exception as e_resp_send:
|
154
|
-
print(f"[HEALTH DEBUG] ERROR sending response: {e_resp_send}")
|
155
|
+
# print(f"[HEALTH DEBUG] ERROR sending response: {e_resp_send}")
|
155
156
|
logger.error(
|
156
157
|
f"Failed to send health response for {message_id} to stream {return_stream}: {e_resp_send}"
|
157
158
|
)
|
158
159
|
else:
|
159
|
-
print(f"[HEALTH DEBUG] No return_stream specified, not sending response")
|
160
|
+
# print(f"[HEALTH DEBUG] No return_stream specified, not sending response")
|
161
|
+
pass
|
160
162
|
|
161
163
|
# Acknowledge the health check message
|
162
|
-
print(f"[HEALTH DEBUG] Acknowledging message {message_id}")
|
164
|
+
# print(f"[HEALTH DEBUG] Acknowledging message {message_id}")
|
163
165
|
try:
|
164
166
|
redis_conn.xack(health_stream, health_group, message_id)
|
165
|
-
print(f"[HEALTH DEBUG] Message {message_id} acknowledged successfully")
|
167
|
+
# print(f"[HEALTH DEBUG] Message {message_id} acknowledged successfully")
|
166
168
|
logger.info(f"Acknowledged health check message {message_id}")
|
167
169
|
except Exception as e_ack:
|
168
|
-
print(f"[HEALTH DEBUG] ERROR acknowledging message: {e_ack}")
|
170
|
+
# print(f"[HEALTH DEBUG] ERROR acknowledging message: {e_ack}")
|
169
171
|
logger.error(
|
170
172
|
f"Failed to acknowledge health check message {message_id}: {e_ack}"
|
171
173
|
)
|
172
174
|
|
173
|
-
print(f"[HEALTH DEBUG] === FINISHED PROCESSING HEALTH CHECK MESSAGE ===")
|
175
|
+
# print(f"[HEALTH DEBUG] === FINISHED PROCESSING HEALTH CHECK MESSAGE ===")
|
174
176
|
|
175
177
|
|
176
178
|
def main():
|
177
179
|
"""Main function for the health check consumer subprocess."""
|
178
|
-
print(f"[HEALTH DEBUG] === HEALTH WORKER STARTING ===")
|
180
|
+
# print(f"[HEALTH DEBUG] === HEALTH WORKER STARTING ===")
|
179
181
|
logger = setup_health_logging()
|
180
182
|
|
181
183
|
# Get environment variables
|
@@ -183,10 +185,10 @@ def main():
|
|
183
185
|
health_stream = os.environ.get("REDIS_HEALTH_STREAM")
|
184
186
|
health_group = os.environ.get("REDIS_HEALTH_CONSUMER_GROUP")
|
185
187
|
|
186
|
-
print(f"[HEALTH DEBUG] Environment variables:")
|
187
|
-
print(f"[HEALTH DEBUG] REDIS_URL: {redis_url}")
|
188
|
-
print(f"[HEALTH DEBUG] REDIS_HEALTH_STREAM: {health_stream}")
|
189
|
-
print(f"[HEALTH DEBUG] REDIS_HEALTH_CONSUMER_GROUP: {health_group}")
|
188
|
+
# print(f"[HEALTH DEBUG] Environment variables:")
|
189
|
+
# print(f"[HEALTH DEBUG] REDIS_URL: {redis_url}")
|
190
|
+
# print(f"[HEALTH DEBUG] REDIS_HEALTH_STREAM: {health_stream}")
|
191
|
+
# print(f"[HEALTH DEBUG] REDIS_HEALTH_CONSUMER_GROUP: {health_group}")
|
190
192
|
|
191
193
|
if not all([redis_url, health_stream, health_group]):
|
192
194
|
print(f"[HEALTH DEBUG] ERROR: Missing required environment variables")
|
@@ -208,56 +210,58 @@ def main():
|
|
208
210
|
)
|
209
211
|
|
210
212
|
# Configure SOCKS proxy
|
211
|
-
print(f"[HEALTH DEBUG] Configuring SOCKS proxy...")
|
213
|
+
# print(f"[HEALTH DEBUG] Configuring SOCKS proxy...")
|
212
214
|
socks.set_default_proxy(socks.SOCKS5, "localhost", 1055)
|
213
215
|
socket.socket = socks.socksocket
|
214
216
|
logger.info("Configured SOCKS5 proxy for socket connections via localhost:1055")
|
215
217
|
|
216
218
|
health_redis_conn: Optional[redis.Redis] = None
|
217
219
|
health_consumer_name = f"health-consumer-{os.getpid()}-{socket.gethostname()}"
|
218
|
-
print(f"[HEALTH DEBUG] Health consumer name: {health_consumer_name}")
|
220
|
+
# print(f"[HEALTH DEBUG] Health consumer name: {health_consumer_name}")
|
219
221
|
|
220
|
-
print(f"[HEALTH DEBUG] === ENTERING MAIN LOOP ===")
|
222
|
+
# print(f"[HEALTH DEBUG] === ENTERING MAIN LOOP ===")
|
221
223
|
while True:
|
222
224
|
try:
|
223
225
|
if health_redis_conn is None:
|
224
|
-
print(f"[HEALTH DEBUG] Connecting to Redis for health stream...")
|
226
|
+
# print(f"[HEALTH DEBUG] Connecting to Redis for health stream...")
|
225
227
|
logger.info("Connecting to Redis for health stream...")
|
228
|
+
|
226
229
|
health_redis_conn = redis.from_url(redis_url, decode_responses=True)
|
227
230
|
health_redis_conn.ping()
|
228
|
-
print(f"[HEALTH DEBUG] Connected to Redis successfully")
|
231
|
+
# print(f"[HEALTH DEBUG] Connected to Redis successfully")
|
229
232
|
logger.info("Connected to Redis for health stream.")
|
230
233
|
|
231
234
|
# Create health consumer group if it doesn't exist
|
232
|
-
print(f"[HEALTH DEBUG] Creating/checking consumer group...")
|
235
|
+
# print(f"[HEALTH DEBUG] Creating/checking consumer group...")
|
236
|
+
logger.info("Creating/checking consumer group...")
|
233
237
|
try:
|
234
238
|
health_redis_conn.xgroup_create(
|
235
239
|
health_stream, health_group, id="0", mkstream=True
|
236
240
|
)
|
237
|
-
print(
|
238
|
-
|
239
|
-
)
|
241
|
+
# print(
|
242
|
+
# f"[HEALTH DEBUG] Created consumer group {health_group} for stream {health_stream}"
|
243
|
+
# )
|
240
244
|
logger.info(
|
241
245
|
f"Created consumer group {health_group} for stream {health_stream}"
|
242
246
|
)
|
243
247
|
except ResponseError as e_group:
|
244
248
|
if "BUSYGROUP" in str(e_group):
|
245
|
-
print(
|
246
|
-
|
247
|
-
)
|
249
|
+
# print(
|
250
|
+
# f"[HEALTH DEBUG] Consumer group {health_group} already exists"
|
251
|
+
# )
|
248
252
|
logger.info(f"Consumer group {health_group} already exists.")
|
249
253
|
else:
|
250
|
-
print(
|
251
|
-
|
252
|
-
)
|
254
|
+
# print(
|
255
|
+
# f"[HEALTH DEBUG] ERROR creating health consumer group: {e_group}"
|
256
|
+
# )
|
253
257
|
logger.error(f"Error creating health consumer group: {e_group}")
|
254
258
|
time.sleep(5)
|
255
259
|
health_redis_conn = None
|
256
260
|
continue
|
257
261
|
except Exception as e_group_other:
|
258
|
-
print(
|
259
|
-
|
260
|
-
)
|
262
|
+
# print(
|
263
|
+
# f"[HEALTH DEBUG] UNEXPECTED ERROR creating health consumer group: {e_group_other}"
|
264
|
+
# )
|
261
265
|
logger.error(
|
262
266
|
f"Unexpected error creating health consumer group: {e_group_other}"
|
263
267
|
)
|
@@ -268,7 +272,8 @@ def main():
|
|
268
272
|
# Read from health stream
|
269
273
|
assert health_redis_conn is not None
|
270
274
|
|
271
|
-
print(f"[HEALTH DEBUG] Reading from health stream {health_stream}...")
|
275
|
+
# print(f"[HEALTH DEBUG] Reading from health stream {health_stream}...")
|
276
|
+
logger.info(f"Reading from health stream {health_stream}...")
|
272
277
|
health_streams_arg: Dict[str, object] = {health_stream: ">"}
|
273
278
|
raw_messages = health_redis_conn.xreadgroup(
|
274
279
|
health_group,
|
@@ -278,21 +283,26 @@ def main():
|
|
278
283
|
block=5000, # Block for 5 seconds
|
279
284
|
)
|
280
285
|
|
281
|
-
print(f"[HEALTH DEBUG] xreadgroup returned: {raw_messages}")
|
282
|
-
print(f"[HEALTH DEBUG] Messages type: {type(raw_messages)}")
|
286
|
+
# print(f"[HEALTH DEBUG] xreadgroup returned: {raw_messages}")
|
287
|
+
# print(f"[HEALTH DEBUG] Messages type: {type(raw_messages)}")
|
283
288
|
|
284
289
|
if raw_messages:
|
285
|
-
print(f"[HEALTH DEBUG] Found messages to process")
|
290
|
+
# print(f"[HEALTH DEBUG] Found messages to process")
|
291
|
+
logger.info("Found messages to process")
|
286
292
|
# Cast to expected type for decode_responses=True
|
287
293
|
messages = cast(
|
288
294
|
List[Tuple[str, List[Tuple[str, Dict[str, str]]]]], raw_messages
|
289
295
|
)
|
290
296
|
for stream_name, stream_messages in messages:
|
291
|
-
print(
|
292
|
-
|
297
|
+
# print(
|
298
|
+
# f"[HEALTH DEBUG] Processing stream: {stream_name} with {len(stream_messages)} message(s)"
|
299
|
+
# )
|
300
|
+
logger.info(
|
301
|
+
f"Processing stream: {stream_name} with {len(stream_messages)} message(s)"
|
293
302
|
)
|
294
303
|
for message_id, message_data in stream_messages:
|
295
|
-
print(f"[HEALTH DEBUG] Processing message {message_id}")
|
304
|
+
# print(f"[HEALTH DEBUG] Processing message {message_id}")
|
305
|
+
logger.info(f"Processing message {message_id}")
|
296
306
|
process_health_check_message(
|
297
307
|
message_id,
|
298
308
|
message_data,
|
@@ -302,7 +312,8 @@ def main():
|
|
302
312
|
health_group,
|
303
313
|
)
|
304
314
|
else:
|
305
|
-
print(f"[HEALTH DEBUG] No messages received (timeout)")
|
315
|
+
# print(f"[HEALTH DEBUG] No messages received (timeout)")
|
316
|
+
logger.info("No messages received (timeout)")
|
306
317
|
|
307
318
|
except (ConnectionError, RedisTimeoutError, TimeoutError) as e_conn:
|
308
319
|
logger.error(f"Redis connection error: {e_conn}. Reconnecting in 5s...")
|
@@ -13,8 +13,8 @@ nebu/containers/container.py,sha256=Mrh_gvMsTvDkj3CwpqIPzJ72IMw0gQIg64y548vq0yg,
|
|
13
13
|
nebu/containers/models.py,sha256=0j6NGy4yto-enRDh_4JH_ZTbHrLdSpuMOqNQPnIrwC4,6815
|
14
14
|
nebu/namespaces/models.py,sha256=EqUOpzhVBhvJw2P92ONDUbIgC31M9jMmcaG5vyOrsWg,497
|
15
15
|
nebu/namespaces/namespace.py,sha256=oeZyGqsIGIrppyjif1ZONsdTmqRgd9oSLFE1BChXTTE,5247
|
16
|
-
nebu/processors/consumer.py,sha256=
|
17
|
-
nebu/processors/consumer_health_worker.py,sha256=
|
16
|
+
nebu/processors/consumer.py,sha256=RoQqpE8ee7-dV68dYLZTX3c7W373txNs7qsJF-NK8Oo,78541
|
17
|
+
nebu/processors/consumer_health_worker.py,sha256=wC3sDOFf6VNHmw_tuYoN1ICknmk0VaX4_pBtr3c1bLQ,15134
|
18
18
|
nebu/processors/consumer_process_worker.py,sha256=h--eNFKaLbUayxn88mB8oGGdrU2liE1dnwm_TPlewX8,36960
|
19
19
|
nebu/processors/decorate.py,sha256=5p9pQrk_H8-Fj0UjsgSVCYx7Jk7KFuhMZtNhkKvpmkQ,61306
|
20
20
|
nebu/processors/default.py,sha256=cy4ETMdbdRGkrvbYec1o60h7mGDlGN5JsuUph0ENtDU,364
|
@@ -22,8 +22,8 @@ nebu/processors/models.py,sha256=8-TmKha2_QAnPlXcZxYjrCSPDCX7FFcMDMcHK77jK0U,422
|
|
22
22
|
nebu/processors/processor.py,sha256=wos5BkNZUVaY5ifT7yeDLbJkdfeloJ7hRuK9P18LU7U,26155
|
23
23
|
nebu/redis/models.py,sha256=coPovAcVXnOU1Xh_fpJL4PO3QctgK9nBe5QYoqEcnxg,1230
|
24
24
|
nebu/services/service.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
25
|
-
nebu-0.1.
|
26
|
-
nebu-0.1.
|
27
|
-
nebu-0.1.
|
28
|
-
nebu-0.1.
|
29
|
-
nebu-0.1.
|
25
|
+
nebu-0.1.122.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
26
|
+
nebu-0.1.122.dist-info/METADATA,sha256=PKvcKsR_xuYgqq2ibnHoDGcsZSz1POQdYswJp_xWkRM,1798
|
27
|
+
nebu-0.1.122.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
28
|
+
nebu-0.1.122.dist-info/top_level.txt,sha256=uLIbEKJeGSHWOAJN5S0i5XBGwybALlF9bYoB1UhdEgQ,5
|
29
|
+
nebu-0.1.122.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|