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.
Files changed (146) hide show
  1. iris_pex_embedded_python-4.0.0b13/AGENTS.md +101 -0
  2. iris_pex_embedded_python-4.0.0b13/MANIFEST.in +5 -0
  3. {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
  4. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/README.md +7 -0
  5. iris_pex_embedded_python-4.0.0b13/docs/agents-template.md +151 -0
  6. iris_pex_embedded_python-4.0.0b13/docs/ai-coding.md +83 -0
  7. iris_pex_embedded_python-4.0.0b13/docs/benchmarks.md +27 -0
  8. iris_pex_embedded_python-4.0.0b13/docs/changelog.md +1 -0
  9. iris_pex_embedded_python-4.0.0b13/docs/code-of-conduct.md +3 -0
  10. iris_pex_embedded_python-4.0.0b13/docs/command-line.md +722 -0
  11. iris_pex_embedded_python-4.0.0b13/docs/component-interaction.md +314 -0
  12. iris_pex_embedded_python-4.0.0b13/docs/contributing.md +58 -0
  13. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/add-business-operation.md +125 -0
  14. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/add-business-process.md +116 -0
  15. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/add-polling-service.md +79 -0
  16. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/code-index.md +81 -0
  17. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/fhir-submission-python-client.md +83 -0
  18. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/hello-world-production.md +102 -0
  19. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/hl7v2-native-input.md +70 -0
  20. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/hl7v2-to-fhir-with-fhir-converter.md +82 -0
  21. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/index.md +42 -0
  22. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/production-settings-and-targets.md +76 -0
  23. iris_pex_embedded_python-4.0.0b13/docs/cookbooks/remote-migration.md +72 -0
  24. iris_pex_embedded_python-4.0.0b13/docs/credits.md +3 -0
  25. iris_pex_embedded_python-4.0.0b13/docs/debug.md +222 -0
  26. iris_pex_embedded_python-4.0.0b13/docs/dtl.md +217 -0
  27. iris_pex_embedded_python-4.0.0b13/docs/example.md +267 -0
  28. iris_pex_embedded_python-4.0.0b13/docs/getting-started/first-steps.md +154 -0
  29. iris_pex_embedded_python-4.0.0b13/docs/getting-started/installation.md +36 -0
  30. iris_pex_embedded_python-4.0.0b13/docs/getting-started/register-component.md +269 -0
  31. iris_pex_embedded_python-4.0.0b13/docs/healthcare-ai-coding.md +204 -0
  32. iris_pex_embedded_python-4.0.0b13/docs/index.md +58 -0
  33. iris_pex_embedded_python-4.0.0b13/docs/logging.md +63 -0
  34. iris_pex_embedded_python-4.0.0b13/docs/prod-settings.md +232 -0
  35. iris_pex_embedded_python-4.0.0b13/docs/production-change-workflow.md +192 -0
  36. iris_pex_embedded_python-4.0.0b13/docs/production-graph.md +323 -0
  37. iris_pex_embedded_python-4.0.0b13/docs/python-api.md +962 -0
  38. iris_pex_embedded_python-4.0.0b13/docs/rest-api.md +590 -0
  39. iris_pex_embedded_python-4.0.0b13/docs/settings.md +564 -0
  40. iris_pex_embedded_python-4.0.0b13/docs/useful-links.md +35 -0
  41. iris_pex_embedded_python-4.0.0b13/docs/venv.md +81 -0
  42. iris_pex_embedded_python-4.0.0b13/docs/wrapper.md +75 -0
  43. iris_pex_embedded_python-4.0.0b13/mkdocs.yml +55 -0
  44. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/pyproject.toml +1 -1
  45. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/__init__.py +64 -0
  46. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/business_host.py +52 -30
  47. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/settings.py +12 -1
  48. iris_pex_embedded_python-4.0.0b13/src/iop/messages/base.py +61 -0
  49. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/dispatch.py +6 -0
  50. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/persistent.py +8 -0
  51. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/model.py +17 -0
  52. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/types.py +6 -1
  53. {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
  54. {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
  55. iris_pex_embedded_python-4.0.0b11/src/iop/messages/base.py +0 -45
  56. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/LICENSE +0 -0
  57. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/setup.cfg +0 -0
  58. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/__main__.py +0 -0
  59. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/__init__.py +0 -0
  60. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/formatting.py +0 -0
  61. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/main.py +0 -0
  62. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/parser.py +0 -0
  63. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cli/types.py +0 -0
  64. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/BusinessOperation.cls +0 -0
  65. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/BusinessProcess.cls +0 -0
  66. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/BusinessService.cls +0 -0
  67. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Common.cls +0 -0
  68. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Director.cls +0 -0
  69. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Duplex/Operation.cls +0 -0
  70. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Duplex/Process.cls +0 -0
  71. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Duplex/Service.cls +0 -0
  72. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/Ack.cls +0 -0
  73. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/Poll.cls +0 -0
  74. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/Start.cls +0 -0
  75. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/StartPickle.cls +0 -0
  76. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Generator/Message/Stop.cls +0 -0
  77. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/InboundAdapter.cls +0 -0
  78. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Message/JSONSchema.cls +0 -0
  79. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Message.cls +0 -0
  80. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/OutboundAdapter.cls +0 -0
  81. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PickleMessage.cls +0 -0
  82. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Duplex.cls +0 -0
  83. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Message/Ack.cls +0 -0
  84. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Message/Poll.cls +0 -0
  85. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Message/Start.cls +0 -0
  86. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/PrivateSession/Message/Stop.cls +0 -0
  87. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Projection.cls +0 -0
  88. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Service/Remote/Handler.cls +0 -0
  89. {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
  90. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Test.cls +0 -0
  91. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Utils.cls +0 -0
  92. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/cls/IOP/Wrapper.cls +0 -0
  93. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/__init__.py +0 -0
  94. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/async_request.py +0 -0
  95. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/business_operation.py +0 -0
  96. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/business_process.py +0 -0
  97. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/business_service.py +0 -0
  98. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/common.py +0 -0
  99. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/debugpy.py +0 -0
  100. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/generator_request.py +0 -0
  101. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/inbound_adapter.py +0 -0
  102. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/log_manager.py +0 -0
  103. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/outbound_adapter.py +0 -0
  104. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/polling_business_service.py +0 -0
  105. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/private_session_duplex.py +0 -0
  106. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/components/private_session_process.py +0 -0
  107. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/__init__.py +0 -0
  108. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/decorators.py +0 -0
  109. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/serialization.py +0 -0
  110. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/messages/validation.py +0 -0
  111. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/__init__.py +0 -0
  112. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/io.py +0 -0
  113. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/manifest.py +0 -0
  114. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/plans.py +0 -0
  115. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/migration/utils.py +0 -0
  116. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/__init__.py +0 -0
  117. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/actions.py +0 -0
  118. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/common.py +0 -0
  119. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/component.py +0 -0
  120. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/declarations.py +0 -0
  121. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/declarative.py +0 -0
  122. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/diff.py +0 -0
  123. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/import_.py +0 -0
  124. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/inspection.py +0 -0
  125. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/planning.py +0 -0
  126. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/reconstruction.py +0 -0
  127. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/rendering.py +0 -0
  128. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/runtime.py +0 -0
  129. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/source_inference.py +0 -0
  130. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/production/validation.py +0 -0
  131. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/__init__.py +0 -0
  132. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/director.py +0 -0
  133. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/environment.py +0 -0
  134. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/iris.py +0 -0
  135. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/local.py +0 -0
  136. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/protocol.py +0 -0
  137. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/__init__.py +0 -0
  138. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/client.py +0 -0
  139. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/director.py +0 -0
  140. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/migration.py +0 -0
  141. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/settings.py +0 -0
  142. {iris_pex_embedded_python-4.0.0b11 → iris_pex_embedded_python-4.0.0b13}/src/iop/runtime/remote/setup.py +0 -0
  143. {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
  144. {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
  145. {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
  146. {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.
@@ -0,0 +1,5 @@
1
+ include README.md
2
+ include LICENSE
3
+ include AGENTS.md
4
+ include mkdocs.yml
5
+ recursive-include docs *.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iris_pex_embedded_python
3
- Version: 4.0.0b11
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"
@@ -0,0 +1,3 @@
1
+ # Code of conduct
2
+
3
+ TODO