iris-pex-embedded-python 4.0.0b14__tar.gz → 4.0.0b15__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 (146) hide show
  1. {iris_pex_embedded_python-4.0.0b14/src/iris_pex_embedded_python.egg-info → iris_pex_embedded_python-4.0.0b15}/PKG-INFO +1 -1
  2. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/pyproject.toml +1 -1
  3. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/__init__.py +137 -24
  4. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/business_host.py +43 -26
  5. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/business_operation.py +25 -10
  6. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/business_process.py +109 -47
  7. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/business_service.py +25 -4
  8. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/common.py +30 -4
  9. iris_pex_embedded_python-4.0.0b15/src/iop/components/polling_business_service.py +48 -0
  10. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/messages/decorators.py +4 -0
  11. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/model.py +29 -9
  12. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/types.py +26 -4
  13. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15/src/iris_pex_embedded_python.egg-info}/PKG-INFO +1 -1
  14. iris_pex_embedded_python-4.0.0b14/src/iop/components/polling_business_service.py +0 -28
  15. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/AGENTS.md +0 -0
  16. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/LICENSE +0 -0
  17. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/MANIFEST.in +0 -0
  18. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/README.md +0 -0
  19. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/agents-template.md +0 -0
  20. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/ai-coding.md +0 -0
  21. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/benchmarks.md +0 -0
  22. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/changelog.md +0 -0
  23. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/code-of-conduct.md +0 -0
  24. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/command-line.md +0 -0
  25. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/component-interaction.md +0 -0
  26. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/contributing.md +0 -0
  27. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/add-business-operation.md +0 -0
  28. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/add-business-process.md +0 -0
  29. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/add-polling-service.md +0 -0
  30. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/code-index.md +0 -0
  31. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/fhir-submission-python-client.md +0 -0
  32. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/hello-world-production.md +0 -0
  33. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/hl7v2-native-input.md +0 -0
  34. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/hl7v2-to-fhir-with-fhir-converter.md +0 -0
  35. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/index.md +0 -0
  36. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/production-settings-and-targets.md +0 -0
  37. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/cookbooks/remote-migration.md +0 -0
  38. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/credits.md +0 -0
  39. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/debug.md +0 -0
  40. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/dtl.md +0 -0
  41. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/example.md +0 -0
  42. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/getting-started/first-steps.md +0 -0
  43. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/getting-started/installation.md +0 -0
  44. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/getting-started/register-component.md +0 -0
  45. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/healthcare-ai-coding.md +0 -0
  46. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/index.md +0 -0
  47. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/logging.md +0 -0
  48. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/prod-settings.md +0 -0
  49. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/production-change-workflow.md +0 -0
  50. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/production-graph.md +0 -0
  51. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/python-api.md +0 -0
  52. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/rest-api.md +0 -0
  53. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/settings.md +0 -0
  54. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/useful-links.md +0 -0
  55. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/venv.md +0 -0
  56. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/docs/wrapper.md +0 -0
  57. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/mkdocs.yml +0 -0
  58. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/setup.cfg +0 -0
  59. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/__main__.py +0 -0
  60. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cli/__init__.py +0 -0
  61. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cli/formatting.py +0 -0
  62. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cli/main.py +0 -0
  63. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cli/parser.py +0 -0
  64. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cli/types.py +0 -0
  65. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/BusinessOperation.cls +0 -0
  66. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/BusinessProcess.cls +0 -0
  67. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/BusinessService.cls +0 -0
  68. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Common.cls +0 -0
  69. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Director.cls +0 -0
  70. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Duplex/Operation.cls +0 -0
  71. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Duplex/Process.cls +0 -0
  72. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Duplex/Service.cls +0 -0
  73. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Generator/Message/Ack.cls +0 -0
  74. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Generator/Message/Poll.cls +0 -0
  75. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Generator/Message/Start.cls +0 -0
  76. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Generator/Message/StartPickle.cls +0 -0
  77. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Generator/Message/Stop.cls +0 -0
  78. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/InboundAdapter.cls +0 -0
  79. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Message/JSONSchema.cls +0 -0
  80. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Message.cls +0 -0
  81. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/OutboundAdapter.cls +0 -0
  82. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/PickleMessage.cls +0 -0
  83. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/PrivateSession/Duplex.cls +0 -0
  84. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/PrivateSession/Message/Ack.cls +0 -0
  85. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/PrivateSession/Message/Poll.cls +0 -0
  86. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/PrivateSession/Message/Start.cls +0 -0
  87. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/PrivateSession/Message/Stop.cls +0 -0
  88. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Projection.cls +0 -0
  89. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Service/Remote/Handler.cls +0 -0
  90. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Service/Remote/Rest/v1.cls +0 -0
  91. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Test.cls +0 -0
  92. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Utils.cls +0 -0
  93. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/cls/IOP/Wrapper.cls +0 -0
  94. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/__init__.py +0 -0
  95. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/async_request.py +0 -0
  96. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/debugpy.py +0 -0
  97. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/generator_request.py +0 -0
  98. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/inbound_adapter.py +0 -0
  99. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/log_manager.py +0 -0
  100. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/outbound_adapter.py +0 -0
  101. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/private_session_duplex.py +0 -0
  102. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/private_session_process.py +0 -0
  103. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/components/settings.py +0 -0
  104. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/messages/__init__.py +0 -0
  105. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/messages/base.py +0 -0
  106. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/messages/dispatch.py +0 -0
  107. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/messages/persistent.py +0 -0
  108. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/messages/serialization.py +0 -0
  109. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/messages/validation.py +0 -0
  110. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/migration/__init__.py +0 -0
  111. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/migration/io.py +0 -0
  112. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/migration/manifest.py +0 -0
  113. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/migration/plans.py +0 -0
  114. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/migration/utils.py +0 -0
  115. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/__init__.py +0 -0
  116. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/actions.py +0 -0
  117. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/common.py +0 -0
  118. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/component.py +0 -0
  119. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/declarations.py +0 -0
  120. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/declarative.py +0 -0
  121. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/diff.py +0 -0
  122. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/import_.py +0 -0
  123. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/inspection.py +0 -0
  124. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/planning.py +0 -0
  125. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/reconstruction.py +0 -0
  126. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/rendering.py +0 -0
  127. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/runtime.py +0 -0
  128. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/source_inference.py +0 -0
  129. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/production/validation.py +0 -0
  130. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/__init__.py +0 -0
  131. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/director.py +0 -0
  132. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/environment.py +0 -0
  133. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/iris.py +0 -0
  134. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/local.py +0 -0
  135. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/protocol.py +0 -0
  136. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/remote/__init__.py +0 -0
  137. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/remote/client.py +0 -0
  138. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/remote/director.py +0 -0
  139. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/remote/migration.py +0 -0
  140. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/remote/settings.py +0 -0
  141. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iop/runtime/remote/setup.py +0 -0
  142. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iris_pex_embedded_python.egg-info/SOURCES.txt +0 -0
  143. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iris_pex_embedded_python.egg-info/dependency_links.txt +0 -0
  144. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iris_pex_embedded_python.egg-info/entry_points.txt +0 -0
  145. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iris_pex_embedded_python.egg-info/requires.txt +0 -0
  146. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.0b15}/src/iris_pex_embedded_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iris_pex_embedded_python
3
- Version: 4.0.0b14
3
+ Version: 4.0.0b15
4
4
  Summary: Iris Interoperability based on Embedded Python
5
5
  Author-email: grongier <guillaume.rongier@intersystems.com>
6
6
  License: MIT License
@@ -3,7 +3,7 @@ requires = ["setuptools", "wheel"]
3
3
 
4
4
  [project]
5
5
  name = "iris_pex_embedded_python"
6
- version = "4.0.0b14"
6
+ version = "4.0.0b15"
7
7
  description = "Iris Interoperability based on Embedded Python"
8
8
  readme = "README.md"
9
9
  requires-python = ">=3.10"
@@ -117,46 +117,137 @@ class OutboundAdapter(_OutboundAdapter):
117
117
 
118
118
 
119
119
  class BusinessService(_BusinessService):
120
- """Inbound production entry point.
120
+ """Purpose:
121
+ Inbound production entry point for messages entering an IoP production.
121
122
 
122
- Use for message-driven services or Python services that receive data and
123
- send messages into a production. For polling services, prefer
124
- PollingBusinessService. For task recipes, see
125
- docs/cookbooks/add-polling-service.md and docs/cookbooks/hl7v2-native-input.md.
123
+ Use when:
124
+ External data, an adapter, or custom code must send a message into the
125
+ production graph.
126
+
127
+ Lifecycle:
128
+ IRIS calls on_process_input(); the default implementation delegates to
129
+ on_process_input(request).
130
+
131
+ Best practices:
132
+ Declare outbound routes with target() and wire them in a Production
133
+ graph. Use PollingBusinessService for scheduled Python polling.
134
+
135
+ Common mistakes:
136
+ Do not put startup work in __init__(); use on_init(). Do not instantiate
137
+ downstream components directly.
138
+
139
+ Minimal example:
140
+ class FileIn(BusinessService):
141
+ Output = target()
142
+
143
+ def on_process_input(self, request):
144
+ self.send_request_async(self.Output, request)
145
+
146
+ Related:
147
+ docs/cookbooks/add-polling-service.md,
148
+ docs/cookbooks/hl7v2-native-input.md
126
149
  """
127
150
 
128
151
  pass
129
152
 
130
153
 
131
154
  class PollingBusinessService(_PollingBusinessServiceMixin, BusinessService):
132
- """Scheduled inbound service called by the default IRIS inbound adapter.
155
+ """Purpose:
156
+ Scheduled Python service called by the default IRIS inbound adapter.
157
+
158
+ Use when:
159
+ A production must poll an API, directory, queue, database, or other
160
+ source from Python.
161
+
162
+ Lifecycle:
163
+ IRIS calls on_process_input(); the mixin delegates that call to
164
+ on_poll().
165
+
166
+ Best practices:
167
+ Put one polling cycle in on_poll(). Declare outbound routes with
168
+ target() and send messages with send_request_async(...).
169
+
170
+ Common mistakes:
171
+ Do not block forever inside on_poll(). Do not put startup work in
172
+ __init__(); use on_init().
173
+
174
+ Minimal example:
175
+ class ApiPoller(PollingBusinessService):
176
+ Output = target()
177
+
178
+ def on_poll(self):
179
+ self.send_request_async(self.Output, MyRequest())
133
180
 
134
- Declare outbound routes with target() and send messages with
135
- send_request_async(...). Do not put startup work in __init__(); use
136
- on_init(). See docs/cookbooks/add-polling-service.md.
181
+ Related:
182
+ docs/cookbooks/add-polling-service.md
137
183
  """
138
184
 
139
185
  pass
140
186
 
141
187
 
142
188
  class BusinessOperation(_BusinessOperation):
143
- """Outbound side-effect boundary for production messages.
189
+ """Purpose:
190
+ Outbound side-effect boundary for production messages.
144
191
 
145
- Use operations for external APIs, file writes, database writes, FHIR
146
- submission, and other side effects. Dispatch can use on_message(), typed
147
- one-argument methods, or @handler(MessageType). See
148
- docs/cookbooks/add-business-operation.md.
192
+ Use when:
193
+ A production must call an external API, write a file, update a database,
194
+ submit FHIR resources, or perform another side effect.
195
+
196
+ Lifecycle:
197
+ IRIS calls on_message(request). IoP can dispatch to @handler methods,
198
+ typed one-argument methods, or the on_message fallback.
199
+
200
+ Best practices:
201
+ Keep external-system code here. Return a response message when callers
202
+ expect synchronous results.
203
+
204
+ Common mistakes:
205
+ Do not put routing orchestration in an operation when a BusinessProcess
206
+ should own the decision.
207
+
208
+ Minimal example:
209
+ class SubmitOrder(BusinessOperation):
210
+ def on_message(self, request):
211
+ return SubmitResult(ok=True)
212
+
213
+ Related:
214
+ docs/cookbooks/add-business-operation.md
149
215
  """
150
216
 
151
217
  pass
152
218
 
153
219
 
154
220
  class BusinessProcess(_BusinessProcess):
155
- """Routing, orchestration, decision, and transformation component.
221
+ """Purpose:
222
+ Routing, orchestration, decision, and transformation component.
223
+
224
+ Use when:
225
+ A production needs branching, enrichment, transformation, fan-out,
226
+ request/reply orchestration, or response aggregation.
156
227
 
157
- Declare outbound routes with target() and connect them in a Production
158
- graph. Dispatch can use on_message(), typed one-argument methods, or
159
- @handler(MessageType). See docs/cookbooks/add-business-process.md.
228
+ Lifecycle:
229
+ IRIS calls on_message(request). For async requests, IRIS can later call
230
+ on_response(...) and on_complete(...).
231
+
232
+ Best practices:
233
+ Declare outbound routes with target() and wire them with
234
+ Production.connect(...). Use @handler(MessageType) or typed methods for
235
+ multiple message types.
236
+
237
+ Common mistakes:
238
+ Do not hard-code target component names when target() can expose a
239
+ configurable route.
240
+
241
+ Minimal example:
242
+ class Router(BusinessProcess):
243
+ Accepted = target()
244
+
245
+ def on_message(self, request):
246
+ return self.send_request_sync(self.Accepted, request)
247
+
248
+ Related:
249
+ docs/cookbooks/add-business-process.md,
250
+ docs/cookbooks/production-settings-and-targets.md
160
251
  """
161
252
 
162
253
  pass
@@ -175,12 +266,34 @@ class DuplexProcess(_PrivateSessionProcess):
175
266
 
176
267
 
177
268
  class Message(_Message):
178
- """Python-only JSON-serialized message contract.
179
-
180
- Use @dataclass for ordinary app messages between IoP components. Prefer
181
- PersistentMessage only when IRIS needs a native persistent message body. See
182
- docs/cookbooks/add-business-process.md and
183
- docs/cookbooks/add-business-operation.md.
269
+ """Purpose:
270
+ Python-only JSON-serialized message contract.
271
+
272
+ Use when:
273
+ IoP components exchange structured Python data and IRIS does not need a
274
+ native persistent message body.
275
+
276
+ Lifecycle:
277
+ IoP serializes dataclass fields into IOP.Message and restores the Python
278
+ class on receipt.
279
+
280
+ Best practices:
281
+ Decorate subclasses with @dataclass. Use PydanticMessage when runtime
282
+ validation is more important.
283
+
284
+ Common mistakes:
285
+ Do not use Message without @dataclass. Do not register Message classes
286
+ in CLASSES; use PersistentMessage for native IRIS message bodies.
287
+
288
+ Minimal example:
289
+ @dataclass
290
+ class OrderRequest(Message):
291
+ order_id: str
292
+
293
+ Related:
294
+ docs/cookbooks/add-business-process.md,
295
+ docs/cookbooks/add-business-operation.md,
296
+ docs/getting-started/register-component.md
184
297
  """
185
298
 
186
299
  pass
@@ -108,23 +108,30 @@ class _BusinessHost(_Common):
108
108
  timeout: int = -1,
109
109
  description: str | None = None,
110
110
  ) -> Any:
111
- """Send message synchronously to target component.
111
+ """Purpose:
112
+ Send a message to a target component and wait for the response.
112
113
 
113
- Prefer a target() attribute such as self.Output for configurable
114
- routing. BusinessProcess examples are in
115
- docs/cookbooks/add-business-process.md.
114
+ Use when:
115
+ The caller needs the target response before continuing.
116
116
 
117
- Args:
118
- target: Name of target component
119
- request: Message to send
120
- timeout: Timeout in seconds, -1 means wait forever
121
- description: Optional description for logging
122
-
123
- Returns:
124
- Response from target component
125
-
126
- Raises:
127
- TypeError: If request is invalid type
117
+ Lifecycle:
118
+ IoP serializes request, calls the IRIS synchronous dispatch API, and
119
+ deserializes the response before returning.
120
+
121
+ Best practices:
122
+ Pass a target() attribute such as self.Output so the route is
123
+ configurable in the Production graph.
124
+
125
+ Common mistakes:
126
+ Do not use synchronous calls for long-running work unless the caller
127
+ really must block.
128
+
129
+ Minimal example:
130
+ response = self.send_request_sync(self.Output, request)
131
+
132
+ Related:
133
+ docs/cookbooks/add-business-process.md,
134
+ docs/cookbooks/production-settings-and-targets.md
128
135
  """
129
136
  target = resolve_target(target)
130
137
  return self.iris_handle.dispatchSendRequestSync(
@@ -138,19 +145,29 @@ class _BusinessHost(_Common):
138
145
  request: Message | Any,
139
146
  description: str | None = None,
140
147
  ) -> None:
141
- """Send message asynchronously to target component.
148
+ """Purpose:
149
+ Send a message to a target component without waiting for a response.
142
150
 
143
- Prefer a target() attribute such as self.Output for configurable
144
- routing. Polling service examples are in
145
- docs/cookbooks/add-polling-service.md.
151
+ Use when:
152
+ A service or operation should enqueue downstream work and continue.
146
153
 
147
- Args:
148
- target: Name of target component
149
- request: Message to send
150
- description: Optional description for logging
151
-
152
- Raises:
153
- TypeError: If request is invalid type
154
+ Lifecycle:
155
+ IoP serializes request and calls the IRIS asynchronous dispatch API.
156
+
157
+ Best practices:
158
+ Pass a target() attribute such as self.Output so the route is
159
+ configurable in the Production graph.
160
+
161
+ Common mistakes:
162
+ Do not use this helper when the caller requires a response; use
163
+ send_request_sync(...) or the BusinessProcess async response flow.
164
+
165
+ Minimal example:
166
+ self.send_request_async(self.Output, request)
167
+
168
+ Related:
169
+ docs/cookbooks/add-polling-service.md,
170
+ docs/cookbooks/production-settings-and-targets.md
154
171
  """
155
172
  target = resolve_target(target)
156
173
  return self.iris_handle.dispatchSendRequestAsync(target, request, description)
@@ -19,16 +19,31 @@ class _BusinessOperation(_BusinessHost):
19
19
  adapter: Any = None
20
20
 
21
21
  def on_message(self, request: Any) -> Any:
22
- """Handle incoming messages.
23
-
24
- Process messages received from other production components and either
25
- send to external system or forward to another component.
26
-
27
- Args:
28
- request: The incoming message
29
-
30
- Returns:
31
- Response message
22
+ """Purpose:
23
+ Handle an incoming message sent to a BusinessOperation.
24
+
25
+ Use when:
26
+ The operation must perform an outbound side effect or submit data to
27
+ an external system.
28
+
29
+ Lifecycle:
30
+ IRIS invokes this hook for operation requests unless dispatch routes
31
+ the message to a @handler or typed one-argument method first.
32
+
33
+ Best practices:
34
+ Keep side effects isolated here. Return a response message when the
35
+ caller uses send_request_sync(...).
36
+
37
+ Common mistakes:
38
+ Do not put routing decisions here when a BusinessProcess should
39
+ orchestrate them.
40
+
41
+ Minimal example:
42
+ def on_message(self, request):
43
+ return SubmitResult(ok=True)
44
+
45
+ Related:
46
+ docs/cookbooks/add-business-operation.md
32
47
  """
33
48
  warnings.warn(
34
49
  f"{self.__class__.__name__} did not override on_message(); "
@@ -20,16 +20,35 @@ class _BusinessProcess(_BusinessHost):
20
20
  DISPATCH: list[tuple] = []
21
21
  PERSISTENT_PROPERTY_LIST: list[str] | None = None
22
22
 
23
- def on_message(self, request: Any) -> Any:
24
- """Handle incoming messages.
25
-
26
- Args:
27
- request: The incoming message
28
-
29
- Returns:
30
- Response message
31
- """
32
- return self.on_request(request)
23
+ def on_message(self, request: Any) -> Any:
24
+ """Purpose:
25
+ Handle an incoming message sent to a BusinessProcess.
26
+
27
+ Use when:
28
+ The process owns routing, orchestration, transformation, or
29
+ decisions for a request.
30
+
31
+ Lifecycle:
32
+ IRIS invokes this hook for process requests unless dispatch routes
33
+ the message to a @handler or typed one-argument method first. The
34
+ default implementation delegates to on_request(request).
35
+
36
+ Best practices:
37
+ Declare outbound routes with target() and call
38
+ send_request_sync(...) or send_request_async(...).
39
+
40
+ Common mistakes:
41
+ Do not hide routing in raw strings when target() can make routes
42
+ configurable in the production graph.
43
+
44
+ Minimal example:
45
+ def on_message(self, request):
46
+ return self.send_request_sync(self.Output, request)
47
+
48
+ Related:
49
+ docs/cookbooks/add-business-process.md
50
+ """
51
+ return self.on_request(request)
33
52
 
34
53
  def on_request(self, request: Any) -> Any:
35
54
  """Process initial requests sent to this component.
@@ -42,38 +61,67 @@ class _BusinessProcess(_BusinessHost):
42
61
  """
43
62
  return None
44
63
 
45
- def on_response(
64
+ def on_response(
46
65
  self,
47
66
  request: Any,
48
67
  response: Any,
49
68
  call_request: Any,
50
69
  call_response: Any,
51
70
  completion_key: str,
52
- ) -> Any:
53
- """Handle responses to messages sent by this component.
54
-
55
- Args:
56
- request: The initial request message
57
- response: The response message
58
- call_request: The request sent to the target
59
- call_response: The incoming response
60
- completion_key: The completion key specified in the outgoing SendAsync() method
61
-
62
- Returns:
63
- Response message
64
- """
71
+ ) -> Any:
72
+ """Purpose:
73
+ Handle one async response received by a BusinessProcess.
74
+
75
+ Use when:
76
+ The process sends async requests and needs to merge, inspect, or
77
+ transform each returned response.
78
+
79
+ Lifecycle:
80
+ IRIS calls on_response(...) after an async target response arrives.
81
+ on_complete(...) can run after all expected responses complete.
82
+
83
+ Best practices:
84
+ Use completion_key to identify which async call returned. Return
85
+ the accumulated or transformed response state.
86
+
87
+ Common mistakes:
88
+ Do not assume responses arrive in request order.
89
+
90
+ Minimal example:
91
+ def on_response(self, request, response, call_request, call_response, completion_key):
92
+ return call_response
93
+
94
+ Related:
95
+ docs/cookbooks/add-business-process.md
96
+ """
65
97
  return response
66
98
 
67
- def on_complete(self, request: Any, response: Any) -> Any:
68
- """Called after all responses to requests sent by this component have been handled.
69
-
70
- Args:
71
- request: The initial request message
72
- response: The response message
73
-
74
- Returns:
75
- Response message
76
- """
99
+ def on_complete(self, request: Any, response: Any) -> Any:
100
+ """Purpose:
101
+ Finish async request orchestration for a BusinessProcess.
102
+
103
+ Use when:
104
+ The process must return or finalize an aggregate response after
105
+ async sends, timers, or response handling.
106
+
107
+ Lifecycle:
108
+ IRIS calls on_complete(request, response) after expected async
109
+ responses have been handled or the completion path is reached.
110
+
111
+ Best practices:
112
+ Return the final response message expected by the original caller.
113
+
114
+ Common mistakes:
115
+ Do not put per-response logic here; use on_response(...) for each
116
+ individual async response.
117
+
118
+ Minimal example:
119
+ def on_complete(self, request, response):
120
+ return response
121
+
122
+ Related:
123
+ docs/cookbooks/add-business-process.md
124
+ """
77
125
  return response
78
126
 
79
127
  @input_serializer_param(0, "response")
@@ -93,19 +141,33 @@ class _BusinessProcess(_BusinessHost):
93
141
  description: str | None = None,
94
142
  completion_key: str | None = None,
95
143
  response_required: bool = True,
96
- ) -> None:
97
- """Send the specified message to the target business process or business operation asynchronously.
98
-
99
- Args:
100
- target: The name of the business process or operation to receive the request
101
- request: The message to send to the target
102
- description: An optional description property in the message header
103
- completion_key: A string that will be returned with the response if the maximum time is exceeded
104
- response_required: Whether a response is required
105
-
106
- Raises:
107
- TypeError: If request is not of type Message or IRISObject
108
- """
144
+ ) -> None:
145
+ """Purpose:
146
+ Send a message asynchronously from a BusinessProcess.
147
+
148
+ Use when:
149
+ The process should continue without blocking for a target response,
150
+ or when responses will be handled later by on_response(...).
151
+
152
+ Lifecycle:
153
+ IoP serializes request before dispatching to IRIS. IRIS can call
154
+ on_response(...) and on_complete(...) when response_required is true.
155
+
156
+ Best practices:
157
+ Pass a target() attribute such as self.Output. Use completion_key
158
+ for fan-out or multiple async calls.
159
+
160
+ Common mistakes:
161
+ Do not pass an unresolved component instance or a hard-coded route
162
+ when the route should be configurable.
163
+
164
+ Minimal example:
165
+ self.send_request_async(self.Output, request, completion_key="out")
166
+
167
+ Related:
168
+ docs/cookbooks/add-business-process.md,
169
+ docs/cookbooks/production-settings-and-targets.md
170
+ """
109
171
  # Convert boolean to int for Iris API
110
172
  if response_required:
111
173
  response_required = 1 # type: ignore
@@ -42,11 +42,32 @@ class _BusinessService(_BusinessHost):
42
42
  return
43
43
 
44
44
  def on_message(self, request=None):
45
- """Handle a message received by the business service.
45
+ """Purpose:
46
+ Handle a message received by a BusinessService.
46
47
 
47
- Override this for message-driven services. Adapter-driven services may
48
- still override on_process_input() directly when they need the lower
49
- level IRIS ProcessInput hook.
48
+ Use when:
49
+ A service receives data from an adapter, Director API call, or
50
+ custom entry point and should send work into the production graph.
51
+
52
+ Lifecycle:
53
+ The default on_process_input(message_input) implementation delegates
54
+ to on_message(message_input).
55
+
56
+ Best practices:
57
+ Validate or normalize inbound data, then send a Message to a target
58
+ declared with target().
59
+
60
+ Common mistakes:
61
+ Do not call downstream component methods directly. Use
62
+ send_request_async(...) or send_request_sync(...).
63
+
64
+ Minimal example:
65
+ def on_message(self, request):
66
+ self.send_request_async(self.Output, request)
67
+
68
+ Related:
69
+ docs/cookbooks/add-polling-service.md,
70
+ docs/cookbooks/hl7v2-native-input.md
50
71
  """
51
72
  warnings.warn(
52
73
  f"{self.__class__.__name__} did not override on_message() or "
@@ -223,10 +223,36 @@ class _Common:
223
223
  self._log_to_console = value
224
224
  self.logger = LogManager.get_logger(self.__class__.__name__, value)
225
225
 
226
- # Lifecycle methods
227
- def on_init(self) -> None:
228
- """Initialize component when started."""
229
- pass
226
+ # Lifecycle methods
227
+ def on_init(self) -> None:
228
+ """Purpose:
229
+ Component startup hook.
230
+
231
+ Use when:
232
+ A component needs to initialize clients, caches, credentials,
233
+ counters, or other runtime state after IRIS creates the host.
234
+
235
+ Lifecycle:
236
+ IoP calls on_init() from the internal dispatch startup path. IRIS
237
+ may allocate the Python object without calling __init__().
238
+
239
+ Best practices:
240
+ Keep initialization idempotent and quick. Read production settings
241
+ from self inside this method.
242
+
243
+ Common mistakes:
244
+ Do not put component startup work in __init__(); it may not run in
245
+ the IRIS component lifecycle.
246
+
247
+ Minimal example:
248
+ def on_init(self):
249
+ self.client = make_client(self.Endpoint)
250
+
251
+ Related:
252
+ docs/ai-coding.md,
253
+ docs/cookbooks/index.md
254
+ """
255
+ pass
230
256
 
231
257
  def on_tear_down(self) -> None:
232
258
  """Clean up component before termination."""
@@ -0,0 +1,48 @@
1
+ import warnings
2
+
3
+
4
+ class _PollingBusinessServiceMixin:
5
+ """Mixin for services polled by the default IRIS inbound adapter."""
6
+
7
+ @staticmethod
8
+ def get_adapter_type() -> str:
9
+ return "Ens.InboundAdapter"
10
+
11
+ def on_poll(self):
12
+ """Purpose:
13
+ Run one scheduled polling cycle.
14
+
15
+ Use when:
16
+ A PollingBusinessService fetches or discovers new work from Python.
17
+
18
+ Lifecycle:
19
+ The default IRIS inbound adapter calls on_process_input(), and this
20
+ mixin delegates that call to on_poll().
21
+
22
+ Best practices:
23
+ Do a bounded unit of work, then return. Send produced messages with
24
+ send_request_async(self.Output, message).
25
+
26
+ Common mistakes:
27
+ Do not create an infinite loop inside on_poll(); use the production
28
+ schedule or call interval for repeated execution.
29
+
30
+ Minimal example:
31
+ def on_poll(self):
32
+ self.send_request_async(self.Output, PollRequest())
33
+
34
+ Related:
35
+ docs/cookbooks/add-polling-service.md
36
+ """
37
+ warnings.warn(
38
+ f"{self.__class__.__name__} did not override on_poll() or "
39
+ "on_process_input(); the scheduled poll was ignored. "
40
+ "This default no-op handler will raise NotImplementedError in v5.0.",
41
+ RuntimeWarning,
42
+ stacklevel=2,
43
+ )
44
+ return None
45
+
46
+ def on_process_input(self, message_input=None):
47
+ """Compatibility hook called by IRIS ProcessInput."""
48
+ return self.on_poll()