mq-bridge-py-basic 0.3.1__tar.gz → 0.3.3__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 (211) hide show
  1. mq_bridge_py_basic-0.3.3/.github/workflows/benchmark.yml +254 -0
  2. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/ci.yml +88 -39
  3. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/ibm-mq.yml +16 -5
  4. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/node.yml +23 -1
  5. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/publish-node.yml +18 -4
  6. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/publish-python.yml +60 -2
  7. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/CONFIGURATION.md +21 -3
  8. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/Cargo.lock +84 -4
  9. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/Cargo.toml +33 -5
  10. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/PKG-INFO +93 -6
  11. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/README.md +5 -2
  12. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/benches/performance_bench.rs +80 -32
  13. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/bindings-common/Cargo.toml +2 -0
  14. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/bindings-common/src/lib.rs +2 -0
  15. mq_bridge_py_basic-0.3.3/bindings-common/src/logging.rs +234 -0
  16. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq-bridge.schema.json +183 -12
  17. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/__init__.py +2 -0
  18. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/__init__.pyi +40 -1
  19. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/config.py +4 -0
  20. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/config.pyi +31 -2
  21. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/pyproject.toml +1 -1
  22. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/Cargo.toml +20 -6
  23. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/README.md +91 -4
  24. mq_bridge_py_basic-0.3.3/python/mq-bridge-py/examples/dlt_source.py +112 -0
  25. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/pyproject-basic.toml +1 -1
  26. mq_bridge_py_basic-0.3.3/python/mq-bridge-py/pyproject-reduced.toml +65 -0
  27. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/src/lib.rs +266 -47
  28. mq_bridge_py_basic-0.3.3/python/mq-bridge-py/tests/test_logging.py +113 -0
  29. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_public_api.py +2 -0
  30. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_routes.py +86 -0
  31. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/debug_ibm_mq_tls.rs +6 -5
  32. mq_bridge_py_basic-0.3.3/scripts/ci/format_bench_output.sh +11 -0
  33. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/canonical_message.rs +105 -0
  34. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/amqp.rs +28 -0
  35. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/aws.rs +3 -0
  36. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/file.rs +6 -1
  37. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/grpc.rs +5 -2
  38. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/http.rs +4 -0
  39. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/ibm_mq.rs +213 -29
  40. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/kafka.rs +29 -0
  41. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/mod.rs +90 -5
  42. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/mongodb.rs +25 -0
  43. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/mqtt.rs +332 -20
  44. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/nats.rs +83 -1
  45. mq_bridge_py_basic-0.3.3/src/endpoints/redis_streams.rs +644 -0
  46. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/sled.rs +6 -2
  47. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/zeromq.rs +73 -11
  48. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/models.rs +195 -7
  49. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/test_utils.rs +205 -15
  50. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/armature_integration.rs +39 -33
  51. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/kafka.yml +1 -0
  52. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mq_init.mqsc +4 -0
  53. mq_bridge_py_basic-0.3.3/tests/integration/docker-compose/redis.yml +11 -0
  54. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/grpc.rs +4 -4
  55. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/http.rs +2 -2
  56. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/ibm_mq.rs +38 -7
  57. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/ibm_mq_tls.rs +9 -1
  58. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/kafka.rs +96 -4
  59. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mariadb.rs +10 -4
  60. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mod.rs +4 -2
  61. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mongodb.rs +2 -2
  62. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mysql.rs +5 -4
  63. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/nats.rs +2 -2
  64. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/postgres.rs +10 -4
  65. mq_bridge_py_basic-0.3.3/tests/integration/redis_streams.rs +147 -0
  66. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/sqlite.rs +2 -2
  67. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/tls_helpers.rs +3 -3
  68. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration_test.rs +46 -10
  69. mq_bridge_py_basic-0.3.1/.github/workflows/benchmark.yml +0 -106
  70. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  71. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  72. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  73. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/python.yml +0 -0
  74. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/release.yml +0 -0
  75. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/test-matrix.yml +0 -0
  76. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.gitignore +0 -0
  77. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/ARCHITECTURE.md +0 -0
  78. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/CONTRIBUTING.md +0 -0
  79. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/LICENSE +0 -0
  80. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/LICENSE.python +0 -0
  81. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/benches/router_bench.rs +0 -0
  82. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/build.rs +0 -0
  83. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/claude.md +0 -0
  84. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/examples/ipc_worker_queue.yaml +0 -0
  85. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/py.typed +0 -0
  86. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/package-lock.json +0 -0
  87. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/LICENSE.python +0 -0
  88. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
  89. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/example.py +0 -0
  90. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/bench_memory.py +0 -0
  91. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
  92. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/consume_pull.py +0 -0
  93. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/json_route.py +0 -0
  94. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/memory.yaml +0 -0
  95. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/raw_route.py +0 -0
  96. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
  97. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_config_types.py +0 -0
  98. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_packaging.py +0 -0
  99. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
  100. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/uv.lock +0 -0
  101. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/HTTP_STREAM_ENDPOINT_PLAN.md +0 -0
  102. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/benches/metadata_bench.rs +0 -0
  103. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
  104. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/http_flamegraph.py +0 -0
  105. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
  106. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/run_http_ladder.sh +0 -0
  107. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/httparena/README.md +0 -0
  108. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
  109. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
  110. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
  111. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
  112. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
  113. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
  114. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
  115. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/README.md +0 -0
  116. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/postgres.yml +0 -0
  117. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/seed.sql +0 -0
  118. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/verify.sh +0 -0
  119. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/README.md +0 -0
  120. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
  121. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
  122. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
  123. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/command_handler.rs +0 -0
  124. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/connection_registry.rs +0 -0
  125. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/fanout.rs +0 -0
  126. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/grpc.proto +0 -0
  127. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/http_stream.rs +0 -0
  128. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/endpoint.rs +0 -0
  129. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/ipc_unix.rs +0 -0
  130. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/ipc_windows.rs +0 -0
  131. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/memory_transport.rs +0 -0
  132. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/mod.rs +0 -0
  133. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/transport.rs +0 -0
  134. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/null.rs +0 -0
  135. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/reader.rs +0 -0
  136. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/response.rs +0 -0
  137. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/sqlx.rs +0 -0
  138. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/static_endpoint.rs +0 -0
  139. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/stream_buffer.rs +0 -0
  140. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/switch.rs +0 -0
  141. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/websocket.rs +0 -0
  142. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/errors.rs +0 -0
  143. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/event_handler.rs +0 -0
  144. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/event_store.rs +0 -0
  145. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/extensions.rs +0 -0
  146. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/lib.rs +0 -0
  147. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/buffer.rs +0 -0
  148. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/cookie_jar.rs +0 -0
  149. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/deduplication.rs +0 -0
  150. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/delay.rs +0 -0
  151. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/dlq.rs +0 -0
  152. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/limiter.rs +0 -0
  153. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/metrics.rs +0 -0
  154. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/mod.rs +0 -0
  155. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/random_panic.rs +0 -0
  156. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/retry.rs +0 -0
  157. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/weak_join.rs +0 -0
  158. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/outcomes.rs +0 -0
  159. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/publisher.rs +0 -0
  160. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/response.rs +0 -0
  161. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/route.rs +0 -0
  162. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/traits.rs +0 -0
  163. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/type_handler.rs +0 -0
  164. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/README.md +0 -0
  165. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/amqp.rs +0 -0
  166. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/aws.rs +0 -0
  167. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/config.toml +0 -0
  168. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/amqp.yml +0 -0
  169. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/aws.yml +0 -0
  170. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
  171. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
  172. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
  173. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
  174. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
  175. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm_mq.yml +0 -0
  176. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
  177. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/kafka-tls.yml +0 -0
  178. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mariadb.yml +0 -0
  179. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
  180. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
  181. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mongodb.yml +0 -0
  182. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mosquitto.conf +0 -0
  183. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
  184. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
  185. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
  186. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mqtt.yml +0 -0
  187. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
  188. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mysql.yml +0 -0
  189. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/nats.yml +0 -0
  190. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/postgres.yml +0 -0
  191. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/file.rs +0 -0
  192. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/grpc_tls.rs +0 -0
  193. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/http_tls.rs +0 -0
  194. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/ipc.rs +0 -0
  195. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/kafka_tls.rs +0 -0
  196. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/logic_test.rs +0 -0
  197. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/memory.rs +0 -0
  198. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mongodb_raw.rs +0 -0
  199. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mongodb_tls.rs +0 -0
  200. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mqtt.rs +0 -0
  201. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/performance_static.rs +0 -0
  202. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/route.rs +0 -0
  203. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/scripts/gen_certs.sh +0 -0
  204. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/websocket.rs +0 -0
  205. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/zeromq.rs +0 -0
  206. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/memory_leak_test.rs +0 -0
  207. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/ref_test.rs +0 -0
  208. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/sqlite_test.rs +0 -0
  209. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/tls_example.rs +0 -0
  210. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/unit_tests.md +0 -0
  211. {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/websocket_test.rs +0 -0
@@ -0,0 +1,254 @@
1
+ name: Benchmark
2
+
3
+ on:
4
+ push:
5
+ branches: [main, dev]
6
+ schedule:
7
+ # Nightly full benchmark run (04:00 UTC)
8
+ - cron: '0 4 * * *'
9
+ workflow_dispatch:
10
+
11
+ env:
12
+ CARGO_TERM_COLOR: always
13
+
14
+ jobs:
15
+ # Compile the bench binary once (release, --features full) and hand the
16
+ # executable to the shard jobs below so none of them need to recompile.
17
+ benchmark-build:
18
+ name: Build Benchmark Binary
19
+ runs-on: ubuntu-latest
20
+ permissions:
21
+ contents: read
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ with:
25
+ persist-credentials: false
26
+
27
+ - name: Install Rust toolchain
28
+ uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
29
+
30
+ - name: Cache cargo build
31
+ uses: Swatinem/rust-cache@v2
32
+ with:
33
+ shared-key: release-full
34
+
35
+ - name: Build bench binary
36
+ run: |
37
+ set -o pipefail
38
+ cargo bench --bench performance_bench --features full --no-run --message-format=json | tee build-output.json
39
+ BIN_PATH=$(jq -r 'select(.reason == "compiler-artifact" and (.target.kind // [] | index("bench")) and .executable != null) | .executable' build-output.json | tail -n1)
40
+ if [ -z "$BIN_PATH" ]; then
41
+ echo "Could not locate performance_bench executable in cargo build output" >&2
42
+ exit 1
43
+ fi
44
+ cp "$BIN_PATH" ./performance_bench_bin
45
+
46
+ - name: Upload bench binary
47
+ uses: actions/upload-artifact@v4
48
+ with:
49
+ name: performance-bench-bin
50
+ path: performance_bench_bin
51
+ retention-days: 1
52
+
53
+ # Three independent shards of the same binary, filtered via the
54
+ # MQB_TEST_BACKEND env var that test_utils::should_run_benchmark() already
55
+ # supports. Each only pre-pulls the Docker images it actually needs.
56
+ benchmark-streams:
57
+ name: Benchmark (streams)
58
+ needs: benchmark-build
59
+ runs-on: ubuntu-latest
60
+ permissions:
61
+ contents: read
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ with:
65
+ persist-credentials: false
66
+
67
+ - name: Download bench binary
68
+ uses: actions/download-artifact@v4
69
+ with:
70
+ name: performance-bench-bin
71
+
72
+ - name: Pre-pull docker images
73
+ run: |
74
+ for f in aws kafka amqp nats mqtt_performance; do
75
+ docker compose -f "tests/integration/docker-compose/${f}.yml" pull -q
76
+ done
77
+
78
+ - name: Run benchmarks
79
+ shell: bash
80
+ env:
81
+ MQB_TEST_BACKEND: "aws,kafka,amqp,nats,mqtt,ibm-mq"
82
+ run: |
83
+ set -o pipefail
84
+ chmod +x ./performance_bench_bin
85
+ export CARGO_TERM_COLOR=never
86
+ ./performance_bench_bin --bench --output-format bencher | tee raw_output_streams.txt
87
+ ./scripts/ci/format_bench_output.sh raw_output_streams.txt output_streams.txt
88
+
89
+ - name: Upload shard output
90
+ uses: actions/upload-artifact@v4
91
+ with:
92
+ name: bench-output-streams
93
+ path: |
94
+ raw_output_streams.txt
95
+ output_streams.txt
96
+ retention-days: 1
97
+
98
+ benchmark-database:
99
+ name: Benchmark (database)
100
+ needs: benchmark-build
101
+ runs-on: ubuntu-latest
102
+ permissions:
103
+ contents: read
104
+ steps:
105
+ - uses: actions/checkout@v4
106
+ with:
107
+ persist-credentials: false
108
+
109
+ - name: Download bench binary
110
+ uses: actions/download-artifact@v4
111
+ with:
112
+ name: performance-bench-bin
113
+
114
+ - name: Pre-pull docker images
115
+ run: |
116
+ for f in mongodb postgres; do
117
+ docker compose -f "tests/integration/docker-compose/${f}.yml" pull -q
118
+ done
119
+
120
+ - name: Run benchmarks
121
+ shell: bash
122
+ env:
123
+ MQB_TEST_BACKEND: "mongodb,postgres"
124
+ run: |
125
+ set -o pipefail
126
+ chmod +x ./performance_bench_bin
127
+ export CARGO_TERM_COLOR=never
128
+ ./performance_bench_bin --bench --output-format bencher | tee raw_output_database.txt
129
+ ./scripts/ci/format_bench_output.sh raw_output_database.txt output_database.txt
130
+
131
+ - name: Upload shard output
132
+ uses: actions/upload-artifact@v4
133
+ with:
134
+ name: bench-output-database
135
+ path: |
136
+ raw_output_database.txt
137
+ output_database.txt
138
+ retention-days: 1
139
+
140
+ benchmark-dockerless:
141
+ name: Benchmark (dockerless)
142
+ needs: benchmark-build
143
+ runs-on: ubuntu-latest
144
+ permissions:
145
+ contents: read
146
+ steps:
147
+ - uses: actions/checkout@v4
148
+ with:
149
+ persist-credentials: false
150
+
151
+ - name: Download bench binary
152
+ uses: actions/download-artifact@v4
153
+ with:
154
+ name: performance-bench-bin
155
+
156
+ - name: Run benchmarks
157
+ shell: bash
158
+ env:
159
+ MQB_TEST_BACKEND: "zeromq,memory,file,http,websocket,grpc"
160
+ run: |
161
+ set -o pipefail
162
+ chmod +x ./performance_bench_bin
163
+ export CARGO_TERM_COLOR=never
164
+ ./performance_bench_bin --bench --output-format bencher | tee raw_output_dockerless.txt
165
+ ./scripts/ci/format_bench_output.sh raw_output_dockerless.txt output_dockerless.txt
166
+
167
+ - name: Upload shard output
168
+ uses: actions/upload-artifact@v4
169
+ with:
170
+ name: bench-output-dockerless
171
+ path: |
172
+ raw_output_dockerless.txt
173
+ output_dockerless.txt
174
+ retention-days: 1
175
+
176
+ # Merge the three shard outputs back into the single combined report the
177
+ # gh-pages benchmark history / dashboard has always tracked.
178
+ benchmark-collect:
179
+ name: Collect Benchmark Results
180
+ needs: [benchmark-streams, benchmark-database, benchmark-dockerless]
181
+ runs-on: ubuntu-latest
182
+ permissions:
183
+ contents: write
184
+ deployments: write
185
+ steps:
186
+ - uses: actions/checkout@v4
187
+
188
+ - name: Download shard outputs
189
+ uses: actions/download-artifact@v4
190
+ with:
191
+ pattern: bench-output-*
192
+ merge-multiple: true
193
+ path: bench-outputs
194
+
195
+ - name: Merge shard outputs
196
+ run: |
197
+ cat bench-outputs/raw_output_*.txt > raw_output.txt
198
+ cat bench-outputs/output_*.txt > output.txt
199
+
200
+ - name: Generate Throughput Summary
201
+ run: |
202
+ python3 -c '
203
+ import re
204
+ import os
205
+
206
+ data = {}
207
+ try:
208
+ with open("raw_output.txt", "r") as f:
209
+ for line in f:
210
+ # Match lines like: "aws single_write: 1 iters, total time 1.48s, 673.75 msgs/sec"
211
+ m = re.search(r"^\s*(.*): .* ([\d\.]+) msgs/sec", line)
212
+ if m:
213
+ name = m.group(1).strip()
214
+ rate = float(m.group(2))
215
+ if name not in data:
216
+ data[name] = []
217
+ data[name].append(rate)
218
+
219
+ if data:
220
+ with open(os.environ["GITHUB_STEP_SUMMARY"], "a") as f:
221
+ f.write("### Benchmark Throughput Results\n")
222
+ f.write("| Test Case | Average msgs/sec | Samples |\n")
223
+ f.write("|-----------|------------------|---------|\n")
224
+ for name in sorted(data.keys()):
225
+ rates = data[name]
226
+ avg = sum(rates) / len(rates)
227
+ f.write(f"| {name} | {avg:,.2f} | {len(rates)} |\n")
228
+ except Exception as e:
229
+ print(f"Error generating summary: {e}")
230
+ '
231
+
232
+ - name: Create gh-pages branch if missing
233
+ run: |
234
+ git fetch origin gh-pages || {
235
+ git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
236
+ git config --global user.name "github-actions[bot]"
237
+ git checkout --orphan gh-pages
238
+ git rm -rf .
239
+ git commit --allow-empty -m "Initialize gh-pages branch"
240
+ git push origin gh-pages
241
+ git checkout ${{ github.sha }}
242
+ }
243
+
244
+ - name: Store benchmark result
245
+ uses: benchmark-action/github-action-benchmark@v1
246
+ with:
247
+ name: Rust Benchmark
248
+ tool: 'cargo'
249
+ output-file-path: output.txt
250
+ github-token: ${{ secrets.GITHUB_TOKEN }}
251
+ auto-push: true
252
+ alert-threshold: '40000%'
253
+ comment-on-alert: true
254
+ fail-on-alert: false
@@ -107,35 +107,74 @@ jobs:
107
107
  - name: Memory leak soak (route commit-task JoinSet)
108
108
  run: cargo test --test memory_leak_test --features=full -- --ignored --nocapture
109
109
 
110
- # Integration tests (requires Docker) split into parallel jobs
110
+ # Compile the integration test binaries ONCE (release, full,test-utils) and
111
+ # publish them as a nextest archive. The three run jobs below download this
112
+ # archive instead of each recompiling the same binaries.
113
+ integration-build:
114
+ name: Integration — Build
115
+ runs-on: ubuntu-latest
116
+ steps:
117
+ - uses: actions/checkout@v4
118
+
119
+ - name: Install Rust toolchain
120
+ uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
121
+
122
+ - name: Install cargo-nextest
123
+ uses: taiki-e/install-action@v2
124
+ with:
125
+ tool: nextest
126
+
127
+ - name: Cache cargo build
128
+ uses: Swatinem/rust-cache@v2
129
+ with:
130
+ # Shared with the benchmark job so the full-feature dependency compile
131
+ # is reused across jobs/runs.
132
+ shared-key: release-full
133
+
134
+ - name: Build nextest archive
135
+ run: |
136
+ cargo nextest archive \
137
+ --release --features full,test-utils \
138
+ --test integration_test --test armature_integration \
139
+ --archive-file nextest-archive.tar.zst
140
+
141
+ - name: Upload nextest archive
142
+ uses: actions/upload-artifact@v4
143
+ with:
144
+ name: integration-nextest-archive
145
+ path: nextest-archive.tar.zst
146
+ retention-days: 1
147
+
148
+ # Integration tests (requires Docker) split into parallel jobs. Each runs the
149
+ # prebuilt nextest archive from integration-build — no recompilation.
111
150
  integration-others:
112
151
  name: Integration — Others
113
152
  runs-on: ubuntu-latest
153
+ needs: integration-build
114
154
  services:
115
155
  docker:
116
156
  image: docker:dind
117
157
  options: --privileged
118
158
  steps:
119
159
  - uses: actions/checkout@v4
120
-
121
- - name: Install Rust toolchain
122
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
123
-
124
- - name: Cache cargo build
125
- uses: Swatinem/rust-cache@v2
160
+
161
+ - name: Install cargo-nextest
162
+ uses: taiki-e/install-action@v2
126
163
  with:
127
- # Differentiates the matrix `check` job per feature set; evaluates to an
128
- # empty string (no-op) in non-matrix jobs. rust-cache already keys on the
129
- # job id, OS, rustc version, and lockfiles automatically.
130
- key: ${{ matrix.features }}
131
-
164
+ tool: nextest
165
+
166
+ - name: Download nextest archive
167
+ uses: actions/download-artifact@v4
168
+ with:
169
+ name: integration-nextest-archive
170
+
132
171
  - name: Pre-pull docker images
133
172
  run: |
134
173
  find tests/integration/docker-compose -name "*.yml" | xargs -P 5 -I {} docker compose -f {} pull -q
135
- - name: Install JDK (for keytool)
174
+ - name: Install JRE (for keytool)
136
175
  run: |
137
176
  sudo apt-get update
138
- sudo apt-get install -y default-jdk
177
+ sudo apt-get install -y default-jre-headless
139
178
 
140
179
  - name: Generate TLS certs for integration services
141
180
  run: |
@@ -146,15 +185,20 @@ jobs:
146
185
 
147
186
  - name: Run chaos/stability tests
148
187
  run: |
149
- cargo test --test integration_test --release --features full,test-utils -- --ignored --nocapture --test-threads=1 --exact test_all_chaos
188
+ cargo nextest run --archive-file nextest-archive.tar.zst \
189
+ --run-ignored all --no-capture \
190
+ -E 'binary(integration_test) & test(=test_all_chaos)'
150
191
 
151
192
  - name: Run remaining integration tests (excluding chaos & performance)
152
193
  run: |
153
- cargo test --test integration_test --release --features full,test-utils -- --ignored --nocapture --test-threads=1 --skip test_all_chaos --skip test_all_performance_pipeline --skip test_all_performance_direct
194
+ cargo nextest run --archive-file nextest-archive.tar.zst \
195
+ --run-ignored all --no-capture \
196
+ -E 'binary(integration_test) & not test(=test_all_chaos) & not test(=test_all_performance_pipeline) & not test(=test_all_performance_direct)'
154
197
 
155
198
  integration-performance:
156
199
  name: Integration — Performance
157
200
  runs-on: ubuntu-latest
201
+ needs: integration-build
158
202
  services:
159
203
  docker:
160
204
  image: docker:dind
@@ -162,24 +206,23 @@ jobs:
162
206
  steps:
163
207
  - uses: actions/checkout@v4
164
208
 
165
- - name: Install Rust toolchain
166
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
209
+ - name: Install cargo-nextest
210
+ uses: taiki-e/install-action@v2
211
+ with:
212
+ tool: nextest
167
213
 
168
- - name: Cache cargo build
169
- uses: Swatinem/rust-cache@v2
214
+ - name: Download nextest archive
215
+ uses: actions/download-artifact@v4
170
216
  with:
171
- # Differentiates the matrix `check` job per feature set; evaluates to an
172
- # empty string (no-op) in non-matrix jobs. rust-cache already keys on the
173
- # job id, OS, rustc version, and lockfiles automatically.
174
- key: ${{ matrix.features }}
217
+ name: integration-nextest-archive
175
218
 
176
219
  - name: Pre-pull docker images
177
220
  run: |
178
221
  find tests/integration/docker-compose -name "*.yml" | xargs -P 5 -I {} docker compose -f {} pull -q
179
- - name: Install JDK (for keytool)
222
+ - name: Install JRE (for keytool)
180
223
  run: |
181
224
  sudo apt-get update
182
- sudo apt-get install -y default-jdk
225
+ sudo apt-get install -y default-jre-headless
183
226
 
184
227
  - name: Generate TLS certs for integration services
185
228
  run: |
@@ -190,15 +233,20 @@ jobs:
190
233
 
191
234
  - name: Run pipeline performance tests
192
235
  run: |
193
- cargo test --test integration_test --release --features full,test-utils -- --ignored --nocapture --test-threads=1 --exact test_all_performance_pipeline
236
+ cargo nextest run --archive-file nextest-archive.tar.zst \
237
+ --run-ignored all --no-capture \
238
+ -E 'binary(integration_test) & test(=test_all_performance_pipeline)'
194
239
 
195
240
  - name: Run other performance tests
196
241
  run: |
197
- cargo test --test integration_test --release --features full,test-utils -- --ignored --nocapture --test-threads=1 --exact test_all_performance_direct
242
+ cargo nextest run --archive-file nextest-archive.tar.zst \
243
+ --run-ignored all --no-capture \
244
+ -E 'binary(integration_test) & test(=test_all_performance_direct)'
198
245
 
199
246
  integration-armature:
200
247
  name: Integration — Armature
201
248
  runs-on: ubuntu-latest
249
+ needs: integration-build
202
250
  services:
203
251
  docker:
204
252
  image: docker:dind
@@ -206,24 +254,23 @@ jobs:
206
254
  steps:
207
255
  - uses: actions/checkout@v4
208
256
 
209
- - name: Install Rust toolchain
210
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
257
+ - name: Install cargo-nextest
258
+ uses: taiki-e/install-action@v2
259
+ with:
260
+ tool: nextest
211
261
 
212
- - name: Cache cargo build
213
- uses: Swatinem/rust-cache@v2
262
+ - name: Download nextest archive
263
+ uses: actions/download-artifact@v4
214
264
  with:
215
- # Differentiates the matrix `check` job per feature set; evaluates to an
216
- # empty string (no-op) in non-matrix jobs. rust-cache already keys on the
217
- # job id, OS, rustc version, and lockfiles automatically.
218
- key: ${{ matrix.features }}
265
+ name: integration-nextest-archive
219
266
 
220
267
  - name: Pre-pull docker images
221
268
  run: |
222
269
  find tests/integration/docker-compose -name "*.yml" | xargs -P 5 -I {} docker compose -f {} pull -q
223
- - name: Install JDK (for keytool)
270
+ - name: Install JRE (for keytool)
224
271
  run: |
225
272
  sudo apt-get update
226
- sudo apt-get install -y default-jdk
273
+ sudo apt-get install -y default-jre-headless
227
274
 
228
275
  - name: Generate TLS certs for integration services
229
276
  run: |
@@ -234,7 +281,9 @@ jobs:
234
281
 
235
282
  - name: Run armature integration tests
236
283
  run: |
237
- cargo test --test armature_integration --release --features full,test-utils -- --ignored --nocapture --test-threads=1
284
+ cargo nextest run --archive-file nextest-archive.tar.zst \
285
+ --run-ignored all --no-capture \
286
+ -E 'binary(armature_integration)'
238
287
 
239
288
  # Documentation
240
289
  docs:
@@ -82,10 +82,16 @@ jobs:
82
82
  ls -la /opt/mqm/lib64/ || echo "MQ lib64 directory not found"
83
83
  echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
84
84
 
85
- - name: Build with IBM MQ feature
85
+ # `ibm-mq` (dlopen) is the shipping path and needs no SDK at build; the
86
+ # redist install above only provides headers for the static compile-check.
87
+ - name: Build with IBM MQ feature (dlopen)
86
88
  if: steps.mqclient.outputs.available == 'true'
87
89
  run: cargo build --features ibm-mq
88
90
 
91
+ - name: Build with IBM MQ feature (static link)
92
+ if: steps.mqclient.outputs.available == 'true'
93
+ run: cargo build --features ibm-mq-static
94
+
89
95
  - name: Run clippy on IBM MQ code
90
96
  if: steps.mqclient.outputs.available == 'true'
91
97
  run: cargo clippy --features ibm-mq -- -D warnings
@@ -156,13 +162,18 @@ jobs:
156
162
 
157
163
  - name: Run IBM MQ integration tests
158
164
  if: steps.mqclient.outputs.available == 'true'
165
+ env:
166
+ MQB_TEST_BACKEND: ibm-mq
159
167
  run: |
168
+ # The test fns are named test_all_* (filtered to ibm-mq via
169
+ # MQB_TEST_BACKEND). The previous test_ibm_mq_* filters matched no
170
+ # test, so this job silently ran zero tests.
160
171
  cargo test --test integration_test --features ibm-mq,test-utils,rustls-ring -- \
161
172
  --ignored --nocapture --test-threads=1 \
162
- test_ibm_mq_subscriber_logic \
163
- test_ibm_mq_performance_pipeline \
164
- test_ibm_mq_chaos \
165
- test_ibm_mq_status
173
+ test_all_subscriber_logic \
174
+ test_all_performance_pipeline \
175
+ test_all_chaos \
176
+ test_all_status
166
177
 
167
178
  - name: Run IBM MQ TLS tests
168
179
  if: steps.mqclient.outputs.available == 'true'
@@ -2,7 +2,7 @@ name: Node
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [main]
5
+ branches: [main, dev]
6
6
  paths:
7
7
  - ".github/workflows/node.yml"
8
8
  - "node/mq-bridge-node/**"
@@ -23,6 +23,28 @@ env:
23
23
  CARGO_TERM_COLOR: always
24
24
 
25
25
  jobs:
26
+ # Fast guard: catches package.json/package-lock.json drift (e.g. a version
27
+ # bump that only half-updates the lock) before it reaches the publish flow,
28
+ # where `npm ci` fails after all the native builds have already run.
29
+ lock-sync:
30
+ name: package-lock in sync
31
+ runs-on: ubuntu-latest
32
+ steps:
33
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
34
+ with:
35
+ persist-credentials: false
36
+
37
+ - name: Set up Node
38
+ uses: actions/setup-node@v4
39
+ with:
40
+ node-version: "20"
41
+ cache: npm
42
+ cache-dependency-path: node/mq-bridge-node/package-lock.json
43
+
44
+ - name: Verify lock is in sync
45
+ working-directory: node/mq-bridge-node
46
+ run: npm ci --ignore-scripts
47
+
26
48
  test:
27
49
  name: Node binding smoke test
28
50
  runs-on: ubuntu-latest
@@ -59,6 +59,12 @@ jobs:
59
59
  curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal
60
60
  echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
61
61
 
62
+ # Regenerate package.json/lock from the Cargo workspace version (source of
63
+ # truth) BEFORE npm ci, so a drifted committed lock can't fail the build.
64
+ - name: Sync version from Cargo workspace
65
+ working-directory: node/mq-bridge-node
66
+ run: npm run sync-version
67
+
62
68
  - name: Install Node dependencies
63
69
  working-directory: node/mq-bridge-node
64
70
  run: npm ci
@@ -124,6 +130,12 @@ jobs:
124
130
  with:
125
131
  targets: ${{ matrix.target }}
126
132
 
133
+ # Regenerate package.json/lock from the Cargo workspace version (source of
134
+ # truth) BEFORE npm ci, so a drifted committed lock can't fail the build.
135
+ - name: Sync version from Cargo workspace
136
+ working-directory: node/mq-bridge-node
137
+ run: npm run sync-version
138
+
127
139
  - name: Install Node dependencies
128
140
  working-directory: node/mq-bridge-node
129
141
  run: npm ci
@@ -170,14 +182,16 @@ jobs:
170
182
  - name: Update npm
171
183
  run: npm install -g npm@11.5.1
172
184
 
173
- - name: Install Node dependencies
174
- working-directory: node/mq-bridge-node
175
- run: npm ci
176
-
185
+ # Regenerate package.json/lock from the Cargo workspace version (source of
186
+ # truth) BEFORE npm ci, so a drifted committed lock can't fail the publish.
177
187
  - name: Sync version from Cargo workspace
178
188
  working-directory: node/mq-bridge-node
179
189
  run: npm run sync-version
180
190
 
191
+ - name: Install Node dependencies
192
+ working-directory: node/mq-bridge-node
193
+ run: npm ci
194
+
181
195
  - name: Download loader into package root
182
196
  uses: actions/download-artifact@v4
183
197
  with:
@@ -39,6 +39,25 @@ jobs:
39
39
  os: linux
40
40
  target: aarch64
41
41
  args: --release --out dist --find-interpreter --no-default-features
42
+ # musl/Alpine wheels for the basic package. basic uses the aws-lc-sys
43
+ # crypto provider (amqp + aws pull it in, same as full); aws-lc-sys
44
+ # compiles its C natively under musl given cmake + gcc, which
45
+ # before-script-linux installs in the musllinux container. The full
46
+ # wheel has no musl build (rdkafka makes it a separate effort).
47
+ - package: mq-bridge-py-basic
48
+ pyproject: pyproject-basic.toml
49
+ runner: ubuntu-latest
50
+ os: linux
51
+ target: x86_64
52
+ manylinux: musllinux_1_2
53
+ args: --release --out dist --find-interpreter --no-default-features
54
+ - package: mq-bridge-py-basic
55
+ pyproject: pyproject-basic.toml
56
+ runner: ubuntu-24.04-arm
57
+ os: linux
58
+ target: aarch64
59
+ manylinux: musllinux_1_2
60
+ args: --release --out dist --find-interpreter --no-default-features
42
61
  - package: mq-bridge-py-basic
43
62
  pyproject: pyproject-basic.toml
44
63
  runner: macos-15-intel
@@ -75,6 +94,39 @@ jobs:
75
94
  os: linux
76
95
  target: aarch64
77
96
  args: --release --out dist --find-interpreter
97
+ # Reduced-feature wheels published UNDER THE `mq-bridge-py` NAME so that
98
+ # a single `pip install mq-bridge-py` resolves to the `full` wheel on
99
+ # glibc-Linux/macOS/Windows-x64 and to this `basic`-featured wheel on
100
+ # targets where the full C toolchain doesn't build (musl/Alpine,
101
+ # Windows arm64), picked automatically by platform tag.
102
+ # pyproject-reduced.toml keeps the `mq-bridge-py` project name but
103
+ # compiles the `basic` feature set (no Kafka/sqlx/grpc/IBM-MQ-static).
104
+ # Same aws-lc-sys-native setup as the mq-bridge-py-basic rows.
105
+ - package: mq-bridge-py
106
+ pyproject: pyproject-reduced.toml
107
+ runner: ubuntu-latest
108
+ os: linux
109
+ target: x86_64
110
+ manylinux: musllinux_1_2
111
+ args: --release --out dist --find-interpreter --no-default-features
112
+ - package: mq-bridge-py
113
+ pyproject: pyproject-reduced.toml
114
+ runner: ubuntu-24.04-arm
115
+ os: linux
116
+ target: aarch64
117
+ manylinux: musllinux_1_2
118
+ args: --release --out dist --find-interpreter --no-default-features
119
+ # Windows arm64 gets the reduced set too: `basic` still pulls aws-lc-sys
120
+ # (via amqp+aws), which compiles natively under MSVC on the native
121
+ # windows-11-arm runner. If aws-lc-sys ever fails to build here, drop
122
+ # amqp+aws from a Windows-arm-only feature set rather than reintroducing
123
+ # a cross-compile.
124
+ - package: mq-bridge-py
125
+ pyproject: pyproject-reduced.toml
126
+ runner: windows-11-arm
127
+ os: windows
128
+ target: aarch64
129
+ args: --release --out dist --find-interpreter --no-default-features
78
130
  - package: mq-bridge-py
79
131
  pyproject: pyproject.toml
80
132
  runner: macos-15-intel
@@ -126,12 +178,18 @@ jobs:
126
178
  target: ${{ matrix.target }}
127
179
  args: ${{ matrix.args }}
128
180
  sccache: "true"
129
- manylinux: auto
181
+ manylinux: ${{ matrix.manylinux || 'auto' }}
182
+ # amqp/aws (and full's kafka) pull aws-lc-sys, which compiles its C with
183
+ # cmake. manylinux containers already ship it; the musllinux (Alpine)
184
+ # container does not, so install it there. Guarded so it's a no-op
185
+ # wherever cmake is already present. Only runs for linux builds.
186
+ before-script-linux: |
187
+ command -v cmake >/dev/null 2>&1 || apk add --no-cache cmake gcc g++ make musl-dev perl
130
188
 
131
189
  - name: Upload wheels
132
190
  uses: actions/upload-artifact@v4
133
191
  with:
134
- name: wheels-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }}
192
+ name: wheels-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }}-${{ matrix.manylinux || 'auto' }}
135
193
  path: python/mq-bridge-py/dist
136
194
 
137
195
  build-sdists: