iris-pex-embedded-python 4.0.0b11__tar.gz → 4.0.0b13__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.0b13/AGENTS.md +101 -0
- iris_pex_embedded_python-4.0.0b13/MANIFEST.in +5 -0
- {iris_pex_embedded_python-4.0.0b11/src/iris_pex_embedded_python.egg-info → iris_pex_embedded_python-4.0.0b13}/PKG-INFO +8 -1
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/README.md +7 -0
- iris_pex_embedded_python-4.0.0b13/docs/agents-template.md +151 -0
- iris_pex_embedded_python-4.0.0b13/docs/ai-coding.md +83 -0
- iris_pex_embedded_python-4.0.0b13/docs/benchmarks.md +27 -0
- iris_pex_embedded_python-4.0.0b13/docs/changelog.md +1 -0
- iris_pex_embedded_python-4.0.0b13/docs/code-of-conduct.md +3 -0
- iris_pex_embedded_python-4.0.0b13/docs/command-line.md +722 -0
- iris_pex_embedded_python-4.0.0b13/docs/component-interaction.md +314 -0
- iris_pex_embedded_python-4.0.0b13/docs/contributing.md +58 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/add-business-operation.md +125 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/add-business-process.md +116 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/add-polling-service.md +79 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/code-index.md +81 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/fhir-submission-python-client.md +83 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/hello-world-production.md +102 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/hl7v2-native-input.md +70 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/hl7v2-to-fhir-with-fhir-converter.md +82 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/index.md +42 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/production-settings-and-targets.md +76 -0
- iris_pex_embedded_python-4.0.0b13/docs/cookbooks/remote-migration.md +72 -0
- iris_pex_embedded_python-4.0.0b13/docs/credits.md +3 -0
- iris_pex_embedded_python-4.0.0b13/docs/debug.md +222 -0
- iris_pex_embedded_python-4.0.0b13/docs/dtl.md +217 -0
- iris_pex_embedded_python-4.0.0b13/docs/example.md +267 -0
- iris_pex_embedded_python-4.0.0b13/docs/getting-started/first-steps.md +154 -0
- iris_pex_embedded_python-4.0.0b13/docs/getting-started/installation.md +36 -0
- iris_pex_embedded_python-4.0.0b13/docs/getting-started/register-component.md +269 -0
- iris_pex_embedded_python-4.0.0b13/docs/healthcare-ai-coding.md +204 -0
- iris_pex_embedded_python-4.0.0b13/docs/index.md +58 -0
- iris_pex_embedded_python-4.0.0b13/docs/logging.md +63 -0
- iris_pex_embedded_python-4.0.0b13/docs/prod-settings.md +232 -0
- iris_pex_embedded_python-4.0.0b13/docs/production-change-workflow.md +192 -0
- iris_pex_embedded_python-4.0.0b13/docs/production-graph.md +323 -0
- iris_pex_embedded_python-4.0.0b13/docs/python-api.md +962 -0
- iris_pex_embedded_python-4.0.0b13/docs/rest-api.md +590 -0
- iris_pex_embedded_python-4.0.0b13/docs/settings.md +564 -0
- iris_pex_embedded_python-4.0.0b13/docs/useful-links.md +35 -0
- iris_pex_embedded_python-4.0.0b13/docs/venv.md +81 -0
- iris_pex_embedded_python-4.0.0b13/docs/wrapper.md +75 -0
- iris_pex_embedded_python-4.0.0b13/mkdocs.yml +55 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/pyproject.toml +1 -1
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/__init__.py +64 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/business_host.py +52 -30
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/settings.py +12 -1
- iris_pex_embedded_python-4.0.0b13/src/iop/messages/base.py +61 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/dispatch.py +6 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/persistent.py +8 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/model.py +17 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/types.py +6 -1
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13/src/iris_pex_embedded_python.egg-info}/PKG-INFO +8 -1
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iris_pex_embedded_python.egg-info/SOURCES.txt +41 -0
- iris_pex_embedded_python-4.0.0b11/src/iop/messages/base.py +0 -45
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/LICENSE +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/setup.cfg +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/__main__.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/formatting.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/main.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/parser.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/types.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/BusinessOperation.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/BusinessProcess.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/BusinessService.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Common.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Director.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Duplex/Operation.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Duplex/Process.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Duplex/Service.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/Ack.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/Poll.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/Start.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/StartPickle.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/Stop.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/InboundAdapter.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Message/JSONSchema.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Message.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/OutboundAdapter.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PickleMessage.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Duplex.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Message/Ack.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Message/Poll.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Message/Start.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Message/Stop.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Projection.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Service/Remote/Handler.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Service/Remote/Rest/v1.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Test.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Utils.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Wrapper.cls +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/async_request.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/business_operation.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/business_process.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/business_service.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/common.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/debugpy.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/generator_request.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/inbound_adapter.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/log_manager.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/outbound_adapter.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/polling_business_service.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/private_session_duplex.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/private_session_process.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/decorators.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/serialization.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/validation.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/io.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/manifest.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/plans.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/utils.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/actions.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/common.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/component.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/declarations.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/declarative.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/diff.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/import_.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/inspection.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/planning.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/reconstruction.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/rendering.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/runtime.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/source_inference.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/validation.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/director.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/environment.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/iris.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/local.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/protocol.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/__init__.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/client.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/director.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/migration.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/settings.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/setup.py +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iris_pex_embedded_python.egg-info/dependency_links.txt +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iris_pex_embedded_python.egg-info/entry_points.txt +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iris_pex_embedded_python.egg-info/requires.txt +0 -0
- {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iris_pex_embedded_python.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# IoP Agent Guide
|
|
2
|
+
|
|
3
|
+
This repository contains IoP, Interoperability On Python. IoP lets developers
|
|
4
|
+
build InterSystems IRIS and Health Connect interoperability productions with
|
|
5
|
+
Python components, messages, and production graphs.
|
|
6
|
+
|
|
7
|
+
## Read First
|
|
8
|
+
|
|
9
|
+
Before changing code or examples, read:
|
|
10
|
+
|
|
11
|
+
- `README.md` for the package overview.
|
|
12
|
+
- `docs/ai-coding.md` for AI-assisted coding guidance.
|
|
13
|
+
- `docs/cookbooks/index.md` for task-specific app-building workflows.
|
|
14
|
+
- `docs/cookbooks/code-index.md` when starting from source code.
|
|
15
|
+
- `docs/getting-started/first-steps.md` for the preferred beginner workflow.
|
|
16
|
+
- `docs/getting-started/register-component.md` for migration file structure.
|
|
17
|
+
- `docs/production-graph.md` for Python-authored production definitions.
|
|
18
|
+
- `docs/production-change-workflow.md` before changing existing IRIS
|
|
19
|
+
productions.
|
|
20
|
+
|
|
21
|
+
## Project Map
|
|
22
|
+
|
|
23
|
+
- `src/iop/components`: component base classes and component settings helpers.
|
|
24
|
+
- `src/iop/messages`: message classes, serialization, validation, and dispatch.
|
|
25
|
+
- `src/iop/production`: production graph, validation, rendering, diff, and
|
|
26
|
+
planning.
|
|
27
|
+
- `src/iop/cli`: `iop` command-line parser, command dispatch, and formatting.
|
|
28
|
+
- `src/iop/migration`: migration file loading, IRIS registration, and
|
|
29
|
+
production import/export utilities.
|
|
30
|
+
- `src/iop/cls`: ObjectScript support classes packaged with IoP.
|
|
31
|
+
- `demo/python`: runnable examples for common production patterns.
|
|
32
|
+
- `src/tests/unit`: fast tests that should not require a live IRIS instance.
|
|
33
|
+
- `src/tests/e2e`: IRIS-backed local and remote integration tests.
|
|
34
|
+
|
|
35
|
+
## Coding Rules
|
|
36
|
+
|
|
37
|
+
- For new applications, prefer a Python `Production` object exported through
|
|
38
|
+
`PRODUCTIONS` in `settings.py`.
|
|
39
|
+
- Use `prod.service(...)`, `prod.process(...)`, `prod.operation(...)`, and
|
|
40
|
+
`prod.connect(...)` to declare topology.
|
|
41
|
+
- Use `target()` on component classes for configurable outbound targets, then
|
|
42
|
+
connect those targets in the production graph.
|
|
43
|
+
- Use `on_message(self, request)` as a simple fallback handler.
|
|
44
|
+
- Use typed one-argument methods or `@handler(MessageType)` to route by message
|
|
45
|
+
type.
|
|
46
|
+
- Do not put component startup logic in `__init__()`. IoP/IRIS allocates
|
|
47
|
+
components with `__new__()` and calls `on_init()` as the startup hook.
|
|
48
|
+
- Use `on_tear_down()` for cleanup when a component becomes inactive.
|
|
49
|
+
- Use `@dataclass` on regular `Message` classes. Do not decorate
|
|
50
|
+
`PydanticMessage` classes with `@dataclass`.
|
|
51
|
+
- Use `PersistentMessage` only when a native persistent IRIS message body is
|
|
52
|
+
required.
|
|
53
|
+
- Avoid raw `CLASSES` entries for new production components. Use `CLASSES` only
|
|
54
|
+
for standalone bindings or legacy migration files.
|
|
55
|
+
- Keep executable sample code behind `if __name__ == "__main__":` when it lives
|
|
56
|
+
in a migration file, so migration can import `PRODUCTIONS` safely.
|
|
57
|
+
- For app-building tasks, use the relevant cookbook in `docs/cookbooks/` before
|
|
58
|
+
writing code or examples.
|
|
59
|
+
|
|
60
|
+
## Verification Commands
|
|
61
|
+
|
|
62
|
+
Fast local checks:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
python -m pytest src/tests/unit
|
|
66
|
+
ruff check src
|
|
67
|
+
pyright
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Validate a migration file without writing to IRIS:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
iop --migrate /path/to/settings.py --dry-run
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Run the Docker-backed test suite:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
docker build -t pytest-iris -f dockerfile-ci .
|
|
80
|
+
docker run -i --rm pytest-iris
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Build documentation:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
mkdocs build
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## IoP Production Best Practices
|
|
90
|
+
|
|
91
|
+
- A production is a message graph.
|
|
92
|
+
- Business Services are inbound entry points or triggers. They may be Python IoP
|
|
93
|
+
services or native IRIS services.
|
|
94
|
+
- Business Processes orchestrate routing, decisions, transformations, and calls
|
|
95
|
+
to downstream components.
|
|
96
|
+
- Business Operations isolate outbound side effects such as external APIs,
|
|
97
|
+
database writes, files, TCP, HTTP, or FHIR endpoints.
|
|
98
|
+
- Components communicate through production messages and targets. Do not
|
|
99
|
+
instantiate another production component or call its methods directly.
|
|
100
|
+
- For healthcare transports and standards, prefer native IRIS or Health Connect
|
|
101
|
+
components when they exist, then use Python for project-specific logic.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: iris_pex_embedded_python
|
|
3
|
-
Version: 4.0.
|
|
3
|
+
Version: 4.0.0b13
|
|
4
4
|
Summary: Iris Interoperability based on Embedded Python
|
|
5
5
|
Author-email: grongier <guillaume.rongier@intersystems.com>
|
|
6
6
|
License: MIT License
|
|
@@ -63,6 +63,9 @@ Dynamic: license-file
|
|
|
63
63
|
Welcome to the **Interoperability On Python (IoP)** proof of concept! This project demonstrates how the **IRIS Interoperability Framework** can be utilized with a **Python-first approach**.
|
|
64
64
|
|
|
65
65
|
Documentation can be found [here](https://grongierisc.github.io/interoperability-embedded-python/).
|
|
66
|
+
For prompt-driven workflows, see [AI-assisted coding with IoP](https://grongierisc.github.io/interoperability-embedded-python/ai-coding/).
|
|
67
|
+
For task-oriented examples, see the [IoP cookbooks](https://grongierisc.github.io/interoperability-embedded-python/cookbooks/).
|
|
68
|
+
For application repositories, start from the [reusable AGENTS.md template](https://grongierisc.github.io/interoperability-embedded-python/agents-template/).
|
|
66
69
|
|
|
67
70
|
## Example
|
|
68
71
|
|
|
@@ -88,4 +91,8 @@ pip install iris-pex-embedded-python
|
|
|
88
91
|
|
|
89
92
|
If you're new to this project, begin by reading the [installation guide](https://grongierisc.github.io/interoperability-embedded-python/getting-started/installation). Then, follow the [first steps](https://grongierisc.github.io/interoperability-embedded-python/getting-started/first-steps) to create your first Python-authored production.
|
|
90
93
|
|
|
94
|
+
If you are using an AI coding assistant, start with [AI-assisted coding with IoP](https://grongierisc.github.io/interoperability-embedded-python/ai-coding/).
|
|
95
|
+
For concrete workflows, use the [IoP cookbooks](https://grongierisc.github.io/interoperability-embedded-python/cookbooks/).
|
|
96
|
+
For healthcare productions, also see [Healthcare AI-assisted coding](https://grongierisc.github.io/interoperability-embedded-python/healthcare-ai-coding/).
|
|
97
|
+
|
|
91
98
|
Happy coding!
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
Welcome to the **Interoperability On Python (IoP)** proof of concept! This project demonstrates how the **IRIS Interoperability Framework** can be utilized with a **Python-first approach**.
|
|
10
10
|
|
|
11
11
|
Documentation can be found [here](https://grongierisc.github.io/interoperability-embedded-python/).
|
|
12
|
+
For prompt-driven workflows, see [AI-assisted coding with IoP](https://grongierisc.github.io/interoperability-embedded-python/ai-coding/).
|
|
13
|
+
For task-oriented examples, see the [IoP cookbooks](https://grongierisc.github.io/interoperability-embedded-python/cookbooks/).
|
|
14
|
+
For application repositories, start from the [reusable AGENTS.md template](https://grongierisc.github.io/interoperability-embedded-python/agents-template/).
|
|
12
15
|
|
|
13
16
|
## Example
|
|
14
17
|
|
|
@@ -34,4 +37,8 @@ pip install iris-pex-embedded-python
|
|
|
34
37
|
|
|
35
38
|
If you're new to this project, begin by reading the [installation guide](https://grongierisc.github.io/interoperability-embedded-python/getting-started/installation). Then, follow the [first steps](https://grongierisc.github.io/interoperability-embedded-python/getting-started/first-steps) to create your first Python-authored production.
|
|
36
39
|
|
|
40
|
+
If you are using an AI coding assistant, start with [AI-assisted coding with IoP](https://grongierisc.github.io/interoperability-embedded-python/ai-coding/).
|
|
41
|
+
For concrete workflows, use the [IoP cookbooks](https://grongierisc.github.io/interoperability-embedded-python/cookbooks/).
|
|
42
|
+
For healthcare productions, also see [Healthcare AI-assisted coding](https://grongierisc.github.io/interoperability-embedded-python/healthcare-ai-coding/).
|
|
43
|
+
|
|
37
44
|
Happy coding!
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Reusable AGENTS.md For IoP Projects
|
|
2
|
+
|
|
3
|
+
Copy this template into the root of an application repository as `AGENTS.md`.
|
|
4
|
+
Keep it generic. Put project-specific details in the project README or in a
|
|
5
|
+
short project brief section.
|
|
6
|
+
|
|
7
|
+
````md
|
|
8
|
+
# Agent Guide
|
|
9
|
+
|
|
10
|
+
This project is an IoP application. IoP means Interoperability On Python: a
|
|
11
|
+
Python-first way to build InterSystems IRIS and Health Connect interoperability
|
|
12
|
+
productions.
|
|
13
|
+
|
|
14
|
+
## First Prompt Contract
|
|
15
|
+
|
|
16
|
+
Before major implementation, make sure the project goal is explicit. If any of
|
|
17
|
+
these details are missing, ask for them or infer only when the repository makes
|
|
18
|
+
the answer clear:
|
|
19
|
+
|
|
20
|
+
- Business goal:
|
|
21
|
+
- Inbound systems:
|
|
22
|
+
- Outbound systems:
|
|
23
|
+
- Data standards or protocols:
|
|
24
|
+
- Required routing or transformation behavior:
|
|
25
|
+
- Runtime constraints:
|
|
26
|
+
- Acceptance criteria:
|
|
27
|
+
|
|
28
|
+
## Read First
|
|
29
|
+
|
|
30
|
+
Before changing code, read:
|
|
31
|
+
|
|
32
|
+
- `README.md` for setup and project-specific workflow.
|
|
33
|
+
- `settings.py`, `production.py`, or `prod.py` for the IoP `Production` graph.
|
|
34
|
+
- the relevant IoP cookbook, if present in this repository.
|
|
35
|
+
- message definitions such as `messages.py` or `msg.py`.
|
|
36
|
+
- components such as `bs.py`, `bp.py`, `bo.py`, `services.py`, `processes.py`,
|
|
37
|
+
or `operations.py`.
|
|
38
|
+
- existing tests, fixtures, and sample payloads.
|
|
39
|
+
|
|
40
|
+
If this project does not include local cookbooks, use the public IoP cookbooks:
|
|
41
|
+
<https://grongierisc.github.io/interoperability-embedded-python/cookbooks/>
|
|
42
|
+
|
|
43
|
+
## Project Map
|
|
44
|
+
|
|
45
|
+
Update this list for the local project:
|
|
46
|
+
|
|
47
|
+
- `settings.py`: migration entrypoint with `PRODUCTIONS = [prod]`.
|
|
48
|
+
- `production.py` or `prod.py`: Python production graph definition.
|
|
49
|
+
- `messages.py` or `msg.py`: Python message classes.
|
|
50
|
+
- `bs.py` or `services.py`: Python Business Services.
|
|
51
|
+
- `bp.py` or `processes.py`: Python Business Processes.
|
|
52
|
+
- `bo.py` or `operations.py`: Python Business Operations.
|
|
53
|
+
- `tests/`: local test suite.
|
|
54
|
+
- `data/` or `samples/`: example payloads.
|
|
55
|
+
|
|
56
|
+
## IoP Rules
|
|
57
|
+
|
|
58
|
+
- Prefer a Python `Production` object exported through `PRODUCTIONS`.
|
|
59
|
+
- Use `prod.service(...)`, `prod.process(...)`, `prod.operation(...)`, and
|
|
60
|
+
`prod.connect(...)` to declare topology.
|
|
61
|
+
- Use `target()` on component classes for configurable outbound targets.
|
|
62
|
+
- Do not put component startup logic in `__init__()`. Use `on_init()`.
|
|
63
|
+
- Use `on_tear_down()` for cleanup when a component becomes inactive.
|
|
64
|
+
- Use `@dataclass` on regular `Message` classes. Do not decorate
|
|
65
|
+
`PydanticMessage` classes with `@dataclass`.
|
|
66
|
+
- Use `PersistentMessage` only when IRIS needs a native persistent message body.
|
|
67
|
+
- Avoid raw `CLASSES` entries for components already declared in the production
|
|
68
|
+
graph.
|
|
69
|
+
- Keep executable sample code behind `if __name__ == "__main__":` when it lives
|
|
70
|
+
in a migration file.
|
|
71
|
+
|
|
72
|
+
## Dispatch Rules
|
|
73
|
+
|
|
74
|
+
- Use `on_message(self, request)` as a simple fallback handler.
|
|
75
|
+
- Use typed one-argument methods to route by message type, for example
|
|
76
|
+
`submit_order(self, request: OrderRequest)`.
|
|
77
|
+
- Use `@handler(MessageType)` when the handler should be explicit or the type
|
|
78
|
+
annotation is not enough.
|
|
79
|
+
- Avoid duplicate handlers for the same message type unless the intended
|
|
80
|
+
precedence is clear.
|
|
81
|
+
|
|
82
|
+
## Production Design Rules
|
|
83
|
+
|
|
84
|
+
- A production is a message graph.
|
|
85
|
+
- Business Services are inbound entry points or triggers. They may be Python IoP
|
|
86
|
+
services or native IRIS services.
|
|
87
|
+
- Business Processes orchestrate routing, decisions, transformations, and calls
|
|
88
|
+
to downstream components.
|
|
89
|
+
- Business Operations isolate outbound side effects such as external APIs,
|
|
90
|
+
database writes, files, TCP, HTTP, or FHIR endpoints.
|
|
91
|
+
- Components communicate through production messages and targets. Do not
|
|
92
|
+
instantiate another production component or call its methods directly.
|
|
93
|
+
|
|
94
|
+
## Add-ons
|
|
95
|
+
|
|
96
|
+
Use add-ons only when the project needs them:
|
|
97
|
+
|
|
98
|
+
- Healthcare standards such as HL7v2 or FHIR:
|
|
99
|
+
<https://grongierisc.github.io/interoperability-embedded-python/healthcare-ai-coding/>
|
|
100
|
+
- HL7v2 native input:
|
|
101
|
+
<https://grongierisc.github.io/interoperability-embedded-python/cookbooks/hl7v2-native-input/>
|
|
102
|
+
- HL7v2 to FHIR with fhir-converter:
|
|
103
|
+
<https://grongierisc.github.io/interoperability-embedded-python/cookbooks/hl7v2-to-fhir-with-fhir-converter/>
|
|
104
|
+
- FHIR submission with a Python client:
|
|
105
|
+
<https://grongierisc.github.io/interoperability-embedded-python/cookbooks/fhir-submission-python-client/>
|
|
106
|
+
|
|
107
|
+
## Definition Of Done
|
|
108
|
+
|
|
109
|
+
A change is done when the fastest relevant checks pass and the expected
|
|
110
|
+
production behavior is observable. Adapt this list to the local project:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
python -m pytest
|
|
114
|
+
iop --migrate settings.py --dry-run
|
|
115
|
+
iop --migrate settings.py
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
If this repository uses Docker or Compose, add the exact command here:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
docker compose up --build
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
For production behavior, verify at least one of:
|
|
125
|
+
|
|
126
|
+
- production starts and reports running status
|
|
127
|
+
- expected output file, API call, database write, FHIR resource, or message is
|
|
128
|
+
observable
|
|
129
|
+
- logs show service/process/operation execution with no blocking errors
|
|
130
|
+
- Message Viewer or queue status shows the expected flow
|
|
131
|
+
|
|
132
|
+
## Troubleshooting Prompts
|
|
133
|
+
|
|
134
|
+
When diagnosing a failure, report:
|
|
135
|
+
|
|
136
|
+
- exact command that failed
|
|
137
|
+
- traceback or IRIS error
|
|
138
|
+
- files read before changing code
|
|
139
|
+
- smallest suspected failure boundary: Python, migration, IRIS runtime,
|
|
140
|
+
external dependency, or test data
|
|
141
|
+
|
|
142
|
+
## Expected AI Output
|
|
143
|
+
|
|
144
|
+
For every non-trivial change, include:
|
|
145
|
+
|
|
146
|
+
- updated files list
|
|
147
|
+
- short rationale for behavior change
|
|
148
|
+
- exact commands used to verify
|
|
149
|
+
- test results summary
|
|
150
|
+
- residual risk or follow-up item
|
|
151
|
+
````
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# AI-Assisted Coding With IoP
|
|
2
|
+
|
|
3
|
+
Use this guide when you want to vibe code with IoP while still getting
|
|
4
|
+
production-shaped, reviewable Python interoperability code.
|
|
5
|
+
|
|
6
|
+
## Start Here
|
|
7
|
+
|
|
8
|
+
Ask the tool to read the project guidance before it writes code:
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
You are helping me build an IoP application.
|
|
12
|
+
Read these files first:
|
|
13
|
+
- AGENTS.md
|
|
14
|
+
- docs/ai-coding.md
|
|
15
|
+
- docs/cookbooks/index.md
|
|
16
|
+
- docs/getting-started/first-steps.md
|
|
17
|
+
- docs/getting-started/register-component.md
|
|
18
|
+
- docs/production-graph.md
|
|
19
|
+
|
|
20
|
+
Use the Python Production graph workflow for new applications.
|
|
21
|
+
Do not put component startup logic in __init__(); use on_init().
|
|
22
|
+
Use the relevant cookbook for the task.
|
|
23
|
+
Show the migration and verification commands.
|
|
24
|
+
```
|
|
25
|
+
|
|
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
|
|
31
|
+
[reusable AGENTS.md template](agents-template.md) into the project root and
|
|
32
|
+
adapt it to the local production. For healthcare projects, also read
|
|
33
|
+
[Healthcare AI-assisted coding](healthcare-ai-coding.md).
|
|
34
|
+
|
|
35
|
+
## Cookbooks
|
|
36
|
+
|
|
37
|
+
Use the [IoP cookbooks](cookbooks/index.md) for task-specific prompts and
|
|
38
|
+
checklists:
|
|
39
|
+
|
|
40
|
+
- [Hello-world production](cookbooks/hello-world-production.md)
|
|
41
|
+
- [Code index for agents](cookbooks/code-index.md)
|
|
42
|
+
- [Add a BusinessOperation](cookbooks/add-business-operation.md)
|
|
43
|
+
- [Add a BusinessProcess](cookbooks/add-business-process.md)
|
|
44
|
+
- [Add a PollingBusinessService](cookbooks/add-polling-service.md)
|
|
45
|
+
- [Production settings and targets](cookbooks/production-settings-and-targets.md)
|
|
46
|
+
- [Remote migration](cookbooks/remote-migration.md)
|
|
47
|
+
- [HL7v2 native input](cookbooks/hl7v2-native-input.md)
|
|
48
|
+
- [HL7v2 to FHIR with fhir-converter](cookbooks/hl7v2-to-fhir-with-fhir-converter.md)
|
|
49
|
+
- [FHIR submission with a Python client](cookbooks/fhir-submission-python-client.md)
|
|
50
|
+
|
|
51
|
+
## Good Output Expectations
|
|
52
|
+
|
|
53
|
+
For a new IoP application, generated code should include:
|
|
54
|
+
|
|
55
|
+
- a `settings.py` file with a `Production` object
|
|
56
|
+
- `PRODUCTIONS = [prod]`
|
|
57
|
+
- clear component names such as `FileService`, `RouteProcess`, or
|
|
58
|
+
`OrderOperation`
|
|
59
|
+
- message classes for data exchanged between components
|
|
60
|
+
- `target()` settings for configurable outbound routing
|
|
61
|
+
- `prod.connect(...)` calls that wire services, processes, and operations
|
|
62
|
+
- sample payloads or tests when behavior changes
|
|
63
|
+
- migration and verification commands
|
|
64
|
+
|
|
65
|
+
## Useful Commands
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Fast pure-Python checks
|
|
69
|
+
python -m pytest src/tests/unit
|
|
70
|
+
|
|
71
|
+
# Validate a migration file without writing to IRIS
|
|
72
|
+
iop --migrate settings.py --dry-run
|
|
73
|
+
|
|
74
|
+
# Migrate a production
|
|
75
|
+
iop --migrate settings.py
|
|
76
|
+
|
|
77
|
+
# Build the documentation
|
|
78
|
+
mkdocs build
|
|
79
|
+
|
|
80
|
+
# Run the Docker-backed suite
|
|
81
|
+
docker build -t pytest-iris -f dockerfile-ci .
|
|
82
|
+
docker run -i --rm pytest-iris
|
|
83
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Benchmarks
|
|
2
|
+
|
|
3
|
+
24 scenarios with these parameters:
|
|
4
|
+
- 100 messages
|
|
5
|
+
- body: simple string `test`
|
|
6
|
+
|
|
7
|
+
The benchmark matrix covers these routes:
|
|
8
|
+
- Python BP to Python BO
|
|
9
|
+
- Python BP to ObjectScript BO
|
|
10
|
+
- ObjectScript BP to Python BO
|
|
11
|
+
- ObjectScript BP to ObjectScript BO
|
|
12
|
+
|
|
13
|
+
Each route is tested with these message types:
|
|
14
|
+
- IRIS `Ens.StringRequest`
|
|
15
|
+
- `Message`
|
|
16
|
+
- `PydanticMessage`
|
|
17
|
+
- `PersistentMessage`
|
|
18
|
+
- `PickleMessage`
|
|
19
|
+
- `PydanticPickleMessage`
|
|
20
|
+
|
|
21
|
+
The test writes current timing results to `src/tests/e2e/local/bench/result.txt`.
|
|
22
|
+
|
|
23
|
+
Benchmarks can be run in the unit test with the following command :
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
PYTHONPATH=src pytest src/tests/e2e/local/test_bench.py
|
|
27
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
--8<-- "CHANGELOG.md"
|