iris-pex-embedded-python 4.0.0b14__tar.gz → 4.0.1b1__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.1b1}/PKG-INFO +1 -1
  2. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/agents-template.md +19 -0
  3. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/ai-coding.md +7 -6
  4. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/command-line.md +6 -1
  5. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/add-polling-service.md +4 -2
  6. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/code-index.md +17 -0
  7. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/hello-world-production.md +2 -1
  8. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/index.md +5 -1
  9. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/getting-started/first-steps.md +5 -0
  10. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/getting-started/register-component.md +5 -0
  11. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/production-graph.md +2 -1
  12. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/python-api.md +2 -1
  13. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/settings.md +34 -1
  14. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/pyproject.toml +1 -1
  15. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/__init__.py +137 -24
  16. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/business_host.py +43 -26
  17. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/business_operation.py +25 -10
  18. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/business_process.py +109 -47
  19. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/business_service.py +25 -4
  20. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/common.py +30 -4
  21. iris_pex_embedded_python-4.0.1b1/src/iop/components/polling_business_service.py +48 -0
  22. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/decorators.py +4 -0
  23. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/utils.py +27 -1
  24. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/model.py +29 -9
  25. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/types.py +26 -4
  26. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1/src/iris_pex_embedded_python.egg-info}/PKG-INFO +1 -1
  27. iris_pex_embedded_python-4.0.0b14/src/iop/components/polling_business_service.py +0 -28
  28. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/AGENTS.md +0 -0
  29. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/LICENSE +0 -0
  30. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/MANIFEST.in +0 -0
  31. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/README.md +0 -0
  32. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/benchmarks.md +0 -0
  33. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/changelog.md +0 -0
  34. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/code-of-conduct.md +0 -0
  35. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/component-interaction.md +0 -0
  36. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/contributing.md +0 -0
  37. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/add-business-operation.md +0 -0
  38. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/add-business-process.md +0 -0
  39. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/fhir-submission-python-client.md +0 -0
  40. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/hl7v2-native-input.md +0 -0
  41. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/hl7v2-to-fhir-with-fhir-converter.md +0 -0
  42. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/production-settings-and-targets.md +0 -0
  43. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/remote-migration.md +0 -0
  44. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/credits.md +0 -0
  45. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/debug.md +0 -0
  46. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/dtl.md +0 -0
  47. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/example.md +0 -0
  48. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/getting-started/installation.md +0 -0
  49. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/healthcare-ai-coding.md +0 -0
  50. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/index.md +0 -0
  51. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/logging.md +0 -0
  52. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/prod-settings.md +0 -0
  53. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/production-change-workflow.md +0 -0
  54. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/rest-api.md +0 -0
  55. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/useful-links.md +0 -0
  56. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/venv.md +0 -0
  57. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/wrapper.md +0 -0
  58. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/mkdocs.yml +0 -0
  59. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/setup.cfg +0 -0
  60. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/__main__.py +0 -0
  61. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/__init__.py +0 -0
  62. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/formatting.py +0 -0
  63. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/main.py +0 -0
  64. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/parser.py +0 -0
  65. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/types.py +0 -0
  66. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/BusinessOperation.cls +0 -0
  67. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/BusinessProcess.cls +0 -0
  68. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/BusinessService.cls +0 -0
  69. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Common.cls +0 -0
  70. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Director.cls +0 -0
  71. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Duplex/Operation.cls +0 -0
  72. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Duplex/Process.cls +0 -0
  73. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Duplex/Service.cls +0 -0
  74. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/Ack.cls +0 -0
  75. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/Poll.cls +0 -0
  76. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/Start.cls +0 -0
  77. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/StartPickle.cls +0 -0
  78. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/Stop.cls +0 -0
  79. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/InboundAdapter.cls +0 -0
  80. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Message/JSONSchema.cls +0 -0
  81. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Message.cls +0 -0
  82. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/OutboundAdapter.cls +0 -0
  83. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PickleMessage.cls +0 -0
  84. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Duplex.cls +0 -0
  85. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Message/Ack.cls +0 -0
  86. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Message/Poll.cls +0 -0
  87. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Message/Start.cls +0 -0
  88. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Message/Stop.cls +0 -0
  89. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Projection.cls +0 -0
  90. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Service/Remote/Handler.cls +0 -0
  91. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Service/Remote/Rest/v1.cls +0 -0
  92. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Test.cls +0 -0
  93. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Utils.cls +0 -0
  94. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Wrapper.cls +0 -0
  95. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/__init__.py +0 -0
  96. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/async_request.py +0 -0
  97. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/debugpy.py +0 -0
  98. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/generator_request.py +0 -0
  99. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/inbound_adapter.py +0 -0
  100. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/log_manager.py +0 -0
  101. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/outbound_adapter.py +0 -0
  102. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/private_session_duplex.py +0 -0
  103. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/private_session_process.py +0 -0
  104. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/settings.py +0 -0
  105. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/__init__.py +0 -0
  106. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/base.py +0 -0
  107. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/dispatch.py +0 -0
  108. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/persistent.py +0 -0
  109. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/serialization.py +0 -0
  110. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/validation.py +0 -0
  111. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/__init__.py +0 -0
  112. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/io.py +0 -0
  113. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/manifest.py +0 -0
  114. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/plans.py +0 -0
  115. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/__init__.py +0 -0
  116. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/actions.py +0 -0
  117. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/common.py +0 -0
  118. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/component.py +0 -0
  119. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/declarations.py +0 -0
  120. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/declarative.py +0 -0
  121. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/diff.py +0 -0
  122. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/import_.py +0 -0
  123. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/inspection.py +0 -0
  124. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/planning.py +0 -0
  125. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/reconstruction.py +0 -0
  126. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/rendering.py +0 -0
  127. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/runtime.py +0 -0
  128. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/source_inference.py +0 -0
  129. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/validation.py +0 -0
  130. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/__init__.py +0 -0
  131. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/director.py +0 -0
  132. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/environment.py +0 -0
  133. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/iris.py +0 -0
  134. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/local.py +0 -0
  135. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/protocol.py +0 -0
  136. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/__init__.py +0 -0
  137. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/client.py +0 -0
  138. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/director.py +0 -0
  139. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/migration.py +0 -0
  140. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/settings.py +0 -0
  141. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/setup.py +0 -0
  142. {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/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.1b1}/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.1b1}/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.1b1}/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.1b1}/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.1b1
4
4
  Summary: Iris Interoperability based on Embedded Python
5
5
  Author-email: grongier <guillaume.rongier@intersystems.com>
6
6
  License: MIT License
@@ -53,6 +53,21 @@ Update this list for the local project:
53
53
  - `tests/`: local test suite.
54
54
  - `data/` or `samples/`: example payloads.
55
55
 
56
+ ## settings.py Import Rules
57
+
58
+ - Treat the directory containing `settings.py` as the project import root for
59
+ migration.
60
+ - Import production graph, message, and component modules from paths reachable
61
+ relative to `settings.py`.
62
+ - If `production.py` is next to `settings.py`, use
63
+ `from production import prod`.
64
+ - If the application is packaged under a directory next to `settings.py`, use
65
+ package imports such as `from myapp.production import prod`.
66
+ - Do not ask users to set `PYTHONPATH` to make migration imports work.
67
+ - Do not patch `os.environ["PYTHONPATH"]` or global `sys.path` in application
68
+ code to hide import problems.
69
+ - Fix import errors by changing the project layout or import statements.
70
+
56
71
  ## IoP Rules
57
72
 
58
73
  - Prefer a Python `Production` object exported through `PRODUCTIONS`.
@@ -115,6 +130,10 @@ iop --migrate settings.py --dry-run
115
130
  iop --migrate settings.py
116
131
  ```
117
132
 
133
+ Do not use `iop --test` as the normal way to test Business Services. Test
134
+ services through the runtime director or production runtime API so the deployed
135
+ production context, component settings, and configured targets are used.
136
+
118
137
  If this repository uses Docker or Compose, add the exact command here:
119
138
 
120
139
  ```bash
@@ -10,7 +10,7 @@ Ask the tool to read the project guidance before it writes code:
10
10
  ```text
11
11
  You are helping me build an IoP application.
12
12
  Read these files first:
13
- - AGENTS.md
13
+ - local AGENTS.md, if this application repository has one
14
14
  - docs/ai-coding.md
15
15
  - docs/cookbooks/index.md
16
16
  - docs/getting-started/first-steps.md
@@ -19,15 +19,16 @@ Read these files first:
19
19
 
20
20
  Use the Python Production graph workflow for new applications.
21
21
  Do not put component startup logic in __init__(); use on_init().
22
+ Treat the directory containing settings.py as the project import root.
23
+ Import production modules relative to settings.py; do not modify PYTHONPATH.
24
+ Do not use iop --test to test Business Services; use the runtime director.
22
25
  Use the relevant cookbook for the task.
23
26
  Show the migration and verification commands.
24
27
  ```
25
28
 
26
- On the published docs site, open
27
- [AGENTS.md](https://github.com/grongierisc/interoperability-embedded-python/blob/master/AGENTS.md)
28
- from the repository root.
29
-
30
- For your own IoP application repository, copy the
29
+ The IoP framework repository root `AGENTS.md` is for framework source
30
+ development, not application guidance. For your own IoP application repository,
31
+ copy the
31
32
  [reusable AGENTS.md template](agents-template.md) into the project root and
32
33
  adapt it to the local production. For healthcare projects, also read
33
34
  [Healthcare AI-assisted coding](healthcare-ai-coding.md).
@@ -377,7 +377,12 @@ python3 -m pip install "iris-persistence>=0.1.0"
377
377
 
378
378
  ## test
379
379
 
380
- The test command allows testing IoP components. You can optionally specify a test name, classname, and body.
380
+ The test command is a low-level helper for testing IoP components. You can
381
+ optionally specify a test name, classname, and body.
382
+
383
+ Do not use `iop --test` as the normal way to test Business Services. Test
384
+ services through the runtime director or production runtime API so the deployed
385
+ production context, component settings, and configured targets are used.
381
386
 
382
387
  Basic test:
383
388
  ```bash
@@ -31,6 +31,8 @@ Implementation requirements:
31
31
  - Do not put startup code in __init__(); use on_init() only if required.
32
32
  - Update settings.py to add the service and connect service.Output to the
33
33
  destination component.
34
+ - Do not use iop --test to test the service; use the runtime director or
35
+ production runtime API for service tests.
34
36
  - Include migration dry-run and verification commands.
35
37
  ```
36
38
 
@@ -68,7 +70,8 @@ iop --migrate settings.py
68
70
  - Dry-run migration shows the service, target setting, and destination
69
71
  component.
70
72
  - Unit tests cover any pure Python polling decisions or message construction.
71
- - Runtime verification confirms `on_poll()` emits the expected message.
73
+ - Runtime verification confirms `on_poll()` emits the expected message through
74
+ the deployed production context.
72
75
 
73
76
  ## Common Mistakes
74
77
 
@@ -76,4 +79,3 @@ iop --migrate settings.py
76
79
  services.
77
80
  - Forgetting to connect `service.Output` to the destination.
78
81
  - Putting long-lived connection setup in `__init__()` instead of `on_init()`.
79
-
@@ -70,6 +70,23 @@ When starting from source code, build applications through public imports from
70
70
  `iop` and a `Production` graph. Do not copy internal runtime classes such as
71
71
  `_BusinessHost` into application code; use them only to understand behavior.
72
72
 
73
+ ## settings.py Import Quick Reference
74
+
75
+ Treat the directory containing `settings.py` as the project import root for
76
+ migration. Import the production graph, messages, and components from modules
77
+ reachable relative to that file, such as `from production import prod` or
78
+ `from myapp.production import prod`.
79
+
80
+ Do not set `PYTHONPATH`, patch `os.environ["PYTHONPATH"]`, or mutate global
81
+ `sys.path` in application code to make migration imports pass. Fix the package
82
+ layout or import statements instead.
83
+
84
+ ## Runtime Test Quick Reference
85
+
86
+ Do not use `iop --test` as the normal way to test Business Services. Test
87
+ services through the runtime director or production runtime API so the deployed
88
+ production context, component settings, and configured targets are used.
89
+
73
90
  ## Healthcare Add-on
74
91
 
75
92
  If the code or task mentions HL7v2, FHIR, Health Connect, FHIR bundles, MLLP,
@@ -28,6 +28,8 @@ Requirements:
28
28
  the operation.
29
29
  - Export PRODUCTIONS = [prod].
30
30
  - Do not use __init__() for component startup.
31
+ - Do not use iop --test to test HelloService; use the runtime director or
32
+ production runtime API for service tests.
31
33
  - Show the migration dry-run command and the command to run the production
32
34
  migration.
33
35
  ```
@@ -99,4 +101,3 @@ iop --migrate settings.py
99
101
  `Production` graph.
100
102
  - Calling `HelloOperation` directly from `HelloService` instead of sending a
101
103
  message through the production target.
102
-
@@ -7,9 +7,13 @@ Before using a cookbook, give the assistant this context:
7
7
 
8
8
  ```text
9
9
  You are helping me build an IoP application.
10
- Read AGENTS.md, settings.py, and the relevant cookbook before changing code.
10
+ Read local AGENTS.md if this application has one, settings.py, and the
11
+ relevant cookbook before changing code.
11
12
  Use the Python Production graph workflow for new applications.
12
13
  Do not put component startup logic in __init__(); use on_init().
14
+ Treat the directory containing settings.py as the project import root.
15
+ Import production modules relative to settings.py; do not modify PYTHONPATH.
16
+ Do not use iop --test to test Business Services; use the runtime director.
13
17
  Show the migration and verification commands.
14
18
  ```
15
19
 
@@ -151,4 +151,9 @@ iop --migrate settings.py
151
151
 
152
152
  This command creates the IRIS proxy classes for the Python components and registers `HelloWorld.Production`.
153
153
 
154
+ When you need to test `HelloService` at runtime, do not use `iop --test`.
155
+ Business Service tests should go through the runtime director or production
156
+ runtime API so the deployed production context, component settings, and
157
+ configured targets are used.
158
+
154
159
  More information about registering components can be found [here](register-component.md).
@@ -58,6 +58,11 @@ Migration registers the generated IRIS proxy classes for `FileService` and
58
58
  class. `prod.connect(file.Output, orders)` sets that setting to the destination
59
59
  component and records the production graph edge.
60
60
 
61
+ When you need to test `FileService` at runtime, do not use `iop --test`.
62
+ Business Service tests should go through the runtime director or production
63
+ runtime API so the deployed production context, component settings, and
64
+ configured targets are used.
65
+
61
66
  ## Settings File Sections
62
67
 
63
68
  A migration file can define these sections:
@@ -79,7 +79,8 @@ object graph. It does not silently fall back to IRIS export. Existing deployed
79
79
  productions should be reconstructed explicitly with `Production.from_iris(...)`
80
80
  before testing by target setting path. Runtime status checks fail closed when the
81
81
  current production cannot be verified. `prod.test(...)` remains a compatibility
82
- alias.
82
+ alias. For Business Services, use this production/director runtime path instead
83
+ of `iop --test`.
83
84
 
84
85
  `ComponentRef` exposes convenience methods that delegate to its owning
85
86
  production: `inspect()`, `start()`, `stop()`, `restart()`, and `test(...)`.
@@ -798,7 +798,8 @@ the reconstruction quality or route origin.
798
798
  `Production` object graph only. For an already deployed production, first build
799
799
  an operational reconstruction with `Production.from_iris(...)`, then call
800
800
  `test_component()` on that object. `prod.test(...)` remains as a compatibility
801
- alias.
801
+ alias. For Business Services, use this production/director runtime path instead
802
+ of `iop --test`.
802
803
 
803
804
  Lifecycle helpers such as `prod.stop()`, `prod.restart()`, `prod.kill()`, and
804
805
  `prod.update()` verify that IRIS currently points at the same production before
@@ -44,6 +44,38 @@ binding with:
44
44
  iop --unbind Python.MyBusinessOperation
45
45
  ```
46
46
 
47
+ ## Import Behavior
48
+
49
+ IoP loads the migration file as a file-based Python module. The directory
50
+ containing that file is temporarily placed first on `sys.path` while the file
51
+ is imported. Treat the directory containing `settings.py` or `demo.py` as the
52
+ project import root for migration.
53
+
54
+ Keep production code in modules or packages reachable from that directory and
55
+ import it normally:
56
+
57
+ ```python
58
+ # settings.py next to production.py
59
+ from production import prod
60
+
61
+ PRODUCTIONS = [prod]
62
+ ```
63
+
64
+ For a packaged application, keep the package next to the migration file and use
65
+ package imports:
66
+
67
+ ```python
68
+ # settings.py next to myapp/
69
+ from myapp.production import prod
70
+
71
+ PRODUCTIONS = [prod]
72
+ ```
73
+
74
+ Do not require users or agents to set `PYTHONPATH` to make migration imports
75
+ work. Do not patch `os.environ["PYTHONPATH"]` or global `sys.path` in
76
+ application code to hide import problems. Fix imports by changing the project
77
+ layout or import statements relative to the migration file location.
78
+
47
79
  ## Configuration Sections
48
80
 
49
81
  The migration file supports four main sections:
@@ -355,7 +387,8 @@ from runtime `OnGetConnections`, or inferred from Host settings.
355
387
  `Production` object graph only. If you want to test a production that already
356
388
  exists in IRIS, use `Production.from_iris(...)` first and call
357
389
  `test_component()` on the imported operational reconstruction. `prod.test(...)`
358
- remains available as a compatibility alias.
390
+ remains available as a compatibility alias. For Business Services, use this
391
+ production/director runtime path instead of `iop --test`.
359
392
 
360
393
  Lifecycle methods are scoped to the production object. `prod.stop()`,
361
394
  `prod.restart()`, `prod.kill()`, and `prod.update()` verify that IRIS currently
@@ -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.1b1"
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(); "