iii-sdk 0.13.0.dev1__tar.gz → 0.14.0.dev2__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 (65) hide show
  1. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/PKG-INFO +1 -1
  2. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/pyproject.toml +1 -1
  3. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/iii.py +17 -0
  4. iii_sdk-0.14.0.dev2/tests/test_trigger_registration_error.py +57 -0
  5. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/.gitignore +0 -0
  6. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/README.md +0 -0
  7. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/__init__.py +0 -0
  8. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/baggage_span_processor.py +0 -0
  9. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/channels.py +0 -0
  10. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/errors.py +0 -0
  11. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/format_utils.py +0 -0
  12. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/iii_constants.py +0 -0
  13. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/iii_types.py +0 -0
  14. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/logger.py +0 -0
  15. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/otel_worker_gauges.py +0 -0
  16. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/payload.py +0 -0
  17. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/span_ops.py +0 -0
  18. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/state.py +0 -0
  19. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/stream.py +0 -0
  20. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/telemetry.py +0 -0
  21. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/telemetry_exporters.py +0 -0
  22. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/telemetry_types.py +0 -0
  23. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/triggers.py +0 -0
  24. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/types.py +0 -0
  25. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/utils.py +0 -0
  26. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/src/iii/worker_metrics.py +0 -0
  27. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/conftest.py +0 -0
  28. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_api_triggers.py +0 -0
  29. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_async_api.py +0 -0
  30. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_baggage_span_processor.py +0 -0
  31. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_bridge.py +0 -0
  32. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_channel_close_delay.py +0 -0
  33. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_context_propagation.py +0 -0
  34. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_data_channels.py +0 -0
  35. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_errors.py +0 -0
  36. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_format_utils.py +0 -0
  37. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_healthcheck.py +0 -0
  38. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_hold_process.py +0 -0
  39. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_http_external_functions_integration.py +0 -0
  40. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_iii_registration_dedup.py +0 -0
  41. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_init_api.py +0 -0
  42. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_invocation_exception.py +0 -0
  43. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_logger_function_ids.py +0 -0
  44. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_logger_otel.py +0 -0
  45. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_middleware.py +0 -0
  46. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_payload.py +0 -0
  47. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_pubsub.py +0 -0
  48. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_queue_integration.py +0 -0
  49. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_rbac_workers.py +0 -0
  50. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_register_function_args.py +0 -0
  51. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_span_ops.py +0 -0
  52. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_state.py +0 -0
  53. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_stream_models.py +0 -0
  54. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_streams.py +0 -0
  55. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_streams_runtime_annotations.py +0 -0
  56. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_sync_api.py +0 -0
  57. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_telemetry.py +0 -0
  58. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_telemetry_exporters.py +0 -0
  59. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_telemetry_types.py +0 -0
  60. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_trace_helpers.py +0 -0
  61. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_trigger_metadata.py +0 -0
  62. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_utils.py +0 -0
  63. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_worker_metadata.py +0 -0
  64. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/tests/test_worker_metrics.py +0 -0
  65. {iii_sdk-0.13.0.dev1 → iii_sdk-0.14.0.dev2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iii-sdk
3
- Version: 0.13.0.dev1
3
+ Version: 0.14.0.dev2
4
4
  Summary: III SDK for Python
5
5
  Project-URL: Homepage, https://github.com/iii-hq/iii
6
6
  Project-URL: Repository, https://github.com/iii-hq/iii
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "iii-sdk"
7
- version = "0.13.0.dev1"
7
+ version = "0.14.0.dev2"
8
8
  description = "III SDK for Python"
9
9
  authors = [{ name = "III" }]
10
10
  license = { text = "Apache-2.0" }
@@ -438,6 +438,8 @@ class III:
438
438
  )
439
439
  elif msg_type == MessageType.REGISTER_TRIGGER.value:
440
440
  asyncio.create_task(self._handle_trigger_registration(data))
441
+ elif msg_type == MessageType.TRIGGER_REGISTRATION_RESULT.value:
442
+ self._handle_trigger_registration_result(data)
441
443
  elif msg_type == MessageType.WORKER_REGISTERED.value:
442
444
  worker_id = data.get("worker_id", "")
443
445
  self._worker_id = worker_id
@@ -701,6 +703,21 @@ class III:
701
703
  }
702
704
  )
703
705
 
706
+ def _handle_trigger_registration_result(self, data: dict[str, Any]) -> None:
707
+ error = data.get("error")
708
+ if not error:
709
+ return
710
+
711
+ trigger_id = data.get("id", "")
712
+ trigger_type = data.get("trigger_type", "")
713
+ message = error.get("message", "")
714
+ log.error(
715
+ "[iii] Trigger registration failed for %r (%s): %s",
716
+ trigger_id,
717
+ trigger_type,
718
+ message,
719
+ )
720
+
704
721
  # Connection state management
705
722
 
706
723
  def _set_connection_state(self, state: IIIConnectionState) -> None:
@@ -0,0 +1,57 @@
1
+ """Tests for engine-reported trigger registration errors."""
2
+
3
+ import json
4
+
5
+ from unittest.mock import AsyncMock, patch
6
+
7
+ from iii.iii import III, InitOptions
8
+
9
+
10
+ def _send_message(client: III, payload: dict) -> None:
11
+ with patch.object(client, "_send", new_callable=AsyncMock):
12
+ client._run_on_loop(client._handle_message(json.dumps(payload)))
13
+
14
+
15
+ def test_trigger_registration_result_error_is_logged(caplog):
16
+ client = III(address="ws://localhost:9999", options=InitOptions(worker_name="test"))
17
+ caplog.set_level("ERROR", logger="iii")
18
+
19
+ _send_message(
20
+ client,
21
+ {
22
+ "type": "triggerregistrationresult",
23
+ "id": "trig-1",
24
+ "trigger_type": "http",
25
+ "function_id": "fn-1",
26
+ "error": {
27
+ "code": "trigger_type_not_found",
28
+ "message": 'Trigger type "http" not found — worker iii-http is missing. Run: iii worker add iii-http',
29
+ },
30
+ },
31
+ )
32
+
33
+ messages = [record.getMessage() for record in caplog.records]
34
+ assert any("iii worker add iii-http" in m for m in messages), messages
35
+ assert any("trig-1" in m for m in messages), messages
36
+
37
+ client.shutdown()
38
+
39
+
40
+ def test_trigger_registration_result_success_does_not_log(caplog):
41
+ client = III(address="ws://localhost:9999", options=InitOptions(worker_name="test"))
42
+ caplog.set_level("ERROR", logger="iii")
43
+
44
+ _send_message(
45
+ client,
46
+ {
47
+ "type": "triggerregistrationresult",
48
+ "id": "trig-2",
49
+ "trigger_type": "http",
50
+ "function_id": "fn-2",
51
+ },
52
+ )
53
+
54
+ messages = [record.getMessage() for record in caplog.records]
55
+ assert not any("Trigger registration" in m for m in messages), messages
56
+
57
+ client.shutdown()
File without changes
File without changes
File without changes