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.
- {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
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/agents-template.md +19 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/ai-coding.md +7 -6
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/command-line.md +6 -1
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/add-polling-service.md +4 -2
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/code-index.md +17 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/hello-world-production.md +2 -1
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/index.md +5 -1
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/getting-started/first-steps.md +5 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/getting-started/register-component.md +5 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/production-graph.md +2 -1
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/python-api.md +2 -1
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/settings.md +34 -1
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/pyproject.toml +1 -1
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/__init__.py +137 -24
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/business_host.py +43 -26
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/business_operation.py +25 -10
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/business_process.py +109 -47
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/business_service.py +25 -4
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/common.py +30 -4
- iris_pex_embedded_python-4.0.1b1/src/iop/components/polling_business_service.py +48 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/decorators.py +4 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/utils.py +27 -1
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/model.py +29 -9
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/types.py +26 -4
- {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
- iris_pex_embedded_python-4.0.0b14/src/iop/components/polling_business_service.py +0 -28
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/AGENTS.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/LICENSE +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/MANIFEST.in +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/README.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/benchmarks.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/changelog.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/code-of-conduct.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/component-interaction.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/contributing.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/add-business-operation.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/add-business-process.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/fhir-submission-python-client.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/hl7v2-native-input.md +0 -0
- {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
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/production-settings-and-targets.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/remote-migration.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/credits.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/debug.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/dtl.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/example.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/getting-started/installation.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/healthcare-ai-coding.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/index.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/logging.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/prod-settings.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/production-change-workflow.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/rest-api.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/useful-links.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/venv.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/wrapper.md +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/mkdocs.yml +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/setup.cfg +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/__main__.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/formatting.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/main.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/parser.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cli/types.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/BusinessOperation.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/BusinessProcess.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/BusinessService.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Common.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Director.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Duplex/Operation.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Duplex/Process.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Duplex/Service.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/Ack.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/Poll.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/Start.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/StartPickle.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Generator/Message/Stop.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/InboundAdapter.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Message/JSONSchema.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Message.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/OutboundAdapter.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PickleMessage.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Duplex.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Message/Ack.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Message/Poll.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Message/Start.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/PrivateSession/Message/Stop.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Projection.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Service/Remote/Handler.cls +0 -0
- {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
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Test.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Utils.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/cls/IOP/Wrapper.cls +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/async_request.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/debugpy.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/generator_request.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/inbound_adapter.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/log_manager.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/outbound_adapter.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/private_session_duplex.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/private_session_process.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/components/settings.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/base.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/dispatch.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/persistent.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/serialization.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/messages/validation.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/io.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/manifest.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/migration/plans.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/actions.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/common.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/component.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/declarations.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/declarative.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/diff.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/import_.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/inspection.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/planning.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/reconstruction.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/rendering.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/runtime.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/source_inference.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/production/validation.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/director.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/environment.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/iris.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/local.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/protocol.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/client.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/director.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/migration.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/settings.py +0 -0
- {iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/src/iop/runtime/remote/setup.py +0 -0
- {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
- {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
- {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
- {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
- {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
{iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/agents-template.md
RENAMED
|
@@ -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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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
|
-
|
{iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/code-index.md
RENAMED
|
@@ -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
|
-
|
{iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/cookbooks/index.md
RENAMED
|
@@ -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
|
|
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:
|
{iris_pex_embedded_python-4.0.0b14 → iris_pex_embedded_python-4.0.1b1}/docs/production-graph.md
RENAMED
|
@@ -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
|
|
@@ -117,46 +117,137 @@ class OutboundAdapter(_OutboundAdapter):
|
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
class BusinessService(_BusinessService):
|
|
120
|
-
"""
|
|
120
|
+
"""Purpose:
|
|
121
|
+
Inbound production entry point for messages entering an IoP production.
|
|
121
122
|
|
|
122
|
-
Use
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
"""
|
|
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
|
-
|
|
135
|
-
|
|
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
|
-
"""
|
|
189
|
+
"""Purpose:
|
|
190
|
+
Outbound side-effect boundary for production messages.
|
|
144
191
|
|
|
145
|
-
Use
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
"""
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
"""
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
"""
|
|
111
|
+
"""Purpose:
|
|
112
|
+
Send a message to a target component and wait for the response.
|
|
112
113
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
docs/cookbooks/add-business-process.md.
|
|
114
|
+
Use when:
|
|
115
|
+
The caller needs the target response before continuing.
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
"""
|
|
148
|
+
"""Purpose:
|
|
149
|
+
Send a message to a target component without waiting for a response.
|
|
142
150
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
docs/cookbooks/add-polling-service.md.
|
|
151
|
+
Use when:
|
|
152
|
+
A service or operation should enqueue downstream work and continue.
|
|
146
153
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
"""
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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(); "
|