iris-pex-embedded-python 3.7.1b4__tar.gz → 3.7.1b5__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 (100) hide show
  1. {iris_pex_embedded_python-3.7.1b4/src/iris_pex_embedded_python.egg-info → iris_pex_embedded_python-3.7.1b5}/PKG-INFO +3 -3
  2. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/pyproject.toml +3 -3
  3. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_dispatch.py +33 -17
  4. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_persistent_message.py +47 -63
  5. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5/src/iris_pex_embedded_python.egg-info}/PKG-INFO +3 -3
  6. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iris_pex_embedded_python.egg-info/requires.txt +2 -2
  7. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/LICENSE +0 -0
  8. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/README.md +0 -0
  9. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/setup.cfg +0 -0
  10. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/setup.py +0 -0
  11. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/__init__.py +0 -0
  12. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/BusinessOperation.cls +0 -0
  13. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/BusinessProcess.cls +0 -0
  14. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/BusinessService.cls +0 -0
  15. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/Common.cls +0 -0
  16. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/Director.cls +0 -0
  17. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/Duplex/Operation.cls +0 -0
  18. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/Duplex/Process.cls +0 -0
  19. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/Duplex/Service.cls +0 -0
  20. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/InboundAdapter.cls +0 -0
  21. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/Message.cls +0 -0
  22. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/OutboundAdapter.cls +0 -0
  23. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/PickleMessage.cls +0 -0
  24. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/PrivateSession/Duplex.cls +0 -0
  25. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/PrivateSession/Message/Ack.cls +0 -0
  26. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/PrivateSession/Message/Poll.cls +0 -0
  27. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/PrivateSession/Message/Start.cls +0 -0
  28. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/PrivateSession/Message/Stop.cls +0 -0
  29. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/Test.cls +0 -0
  30. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/PEX/Utils.cls +0 -0
  31. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/cls/Grongier/Service/WSGI.cls +0 -0
  32. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/pex/__init__.py +0 -0
  33. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/pex/__main__.py +0 -0
  34. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/pex/_business_host.py +0 -0
  35. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/pex/_cli.py +0 -0
  36. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/pex/_common.py +0 -0
  37. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/pex/_director.py +0 -0
  38. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/pex/_utils.py +0 -0
  39. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/grongier/pex/wsgi/handlers.py +0 -0
  40. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/__init__.py +0 -0
  41. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/__main__.py +0 -0
  42. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_async_request.py +0 -0
  43. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_business_host.py +0 -0
  44. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_business_operation.py +0 -0
  45. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_business_process.py +0 -0
  46. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_business_service.py +0 -0
  47. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_cli.py +0 -0
  48. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_common.py +0 -0
  49. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_debugpy.py +0 -0
  50. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_decorators.py +0 -0
  51. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_director.py +0 -0
  52. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_director_protocol.py +0 -0
  53. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_generator_request.py +0 -0
  54. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_inbound_adapter.py +0 -0
  55. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_iris.py +0 -0
  56. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_local.py +0 -0
  57. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_log_manager.py +0 -0
  58. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_message.py +0 -0
  59. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_message_validator.py +0 -0
  60. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_outbound_adapter.py +0 -0
  61. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_private_session_duplex.py +0 -0
  62. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_private_session_process.py +0 -0
  63. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_remote.py +0 -0
  64. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_serialization.py +0 -0
  65. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/_utils.py +0 -0
  66. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/BusinessOperation.cls +0 -0
  67. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/BusinessProcess.cls +0 -0
  68. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/BusinessService.cls +0 -0
  69. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Common.cls +0 -0
  70. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Director.cls +0 -0
  71. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Duplex/Operation.cls +0 -0
  72. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Duplex/Process.cls +0 -0
  73. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Duplex/Service.cls +0 -0
  74. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Generator/Message/Ack.cls +0 -0
  75. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Generator/Message/Poll.cls +0 -0
  76. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Generator/Message/Start.cls +0 -0
  77. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Generator/Message/StartPickle.cls +0 -0
  78. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Generator/Message/Stop.cls +0 -0
  79. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/InboundAdapter.cls +0 -0
  80. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Message/JSONSchema.cls +0 -0
  81. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Message.cls +0 -0
  82. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/OutboundAdapter.cls +0 -0
  83. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/PickleMessage.cls +0 -0
  84. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/PrivateSession/Duplex.cls +0 -0
  85. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/PrivateSession/Message/Ack.cls +0 -0
  86. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/PrivateSession/Message/Poll.cls +0 -0
  87. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/PrivateSession/Message/Start.cls +0 -0
  88. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/PrivateSession/Message/Stop.cls +0 -0
  89. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Projection.cls +0 -0
  90. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Service/Remote/Handler.cls +0 -0
  91. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Service/Remote/Rest/v1.cls +0 -0
  92. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Service/WSGI.cls +0 -0
  93. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Test.cls +0 -0
  94. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Utils.cls +0 -0
  95. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/cls/IOP/Wrapper.cls +0 -0
  96. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iop/wsgi/handlers.py +0 -0
  97. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iris_pex_embedded_python.egg-info/SOURCES.txt +0 -0
  98. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iris_pex_embedded_python.egg-info/dependency_links.txt +0 -0
  99. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iris_pex_embedded_python.egg-info/entry_points.txt +0 -0
  100. {iris_pex_embedded_python-3.7.1b4 → iris_pex_embedded_python-3.7.1b5}/src/iris_pex_embedded_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iris_pex_embedded_python
3
- Version: 3.7.1b4
3
+ Version: 3.7.1b5
4
4
  Summary: Iris Interoperability based on Embedded Python
5
5
  Author-email: grongier <guillaume.rongier@intersystems.com>
6
6
  License: MIT License
@@ -43,8 +43,8 @@ Description-Content-Type: text/markdown
43
43
  License-File: LICENSE
44
44
  Requires-Dist: pydantic>=2.0.0
45
45
  Requires-Dist: xmltodict>=0.12.0
46
- Requires-Dist: iris-embedded-python-wrapper>=0.0.6
47
- Requires-Dist: iris-persistence>=0.1.0
46
+ Requires-Dist: iris-embedded-python-wrapper>=0.5.0
47
+ Requires-Dist: iris-persistence>=0.1.1
48
48
  Requires-Dist: jsonpath-ng>=1.7.0
49
49
  Requires-Dist: debugpy>=1.8.0
50
50
  Requires-Dist: requests>=2.24.0
@@ -3,7 +3,7 @@ requires = ["setuptools", "wheel"]
3
3
 
4
4
  [project]
5
5
  name = "iris_pex_embedded_python"
6
- version = "3.7.1b4"
6
+ version = "3.7.1b5"
7
7
  description = "Iris Interoperability based on Embedded Python"
8
8
  readme = "README.md"
9
9
  requires-python = ">=3.10"
@@ -26,8 +26,8 @@ classifiers = [
26
26
  dependencies = [
27
27
  "pydantic>=2.0.0",
28
28
  "xmltodict>=0.12.0",
29
- "iris-embedded-python-wrapper>=0.0.6",
30
- "iris-persistence>=0.1.0",
29
+ "iris-embedded-python-wrapper>=0.5.0",
30
+ "iris-persistence>=0.1.1",
31
31
  "jsonpath-ng>=1.7.0",
32
32
  "debugpy>=1.8.0",
33
33
  "requests>=2.24.0"
@@ -16,11 +16,24 @@ from ._message_validator import (
16
16
  )
17
17
  from ._persistent_message import (
18
18
  deserialize_persistent_message,
19
+ get_iris_object_classname,
19
20
  is_persistent_message_instance,
20
21
  serialize_persistent_message,
21
22
  )
22
23
 
23
24
 
25
+ _MESSAGE_CLASSES = {
26
+ "IOP.Message",
27
+ "Grongier.PEX.Message",
28
+ "IOP.Generator.Message.Start",
29
+ }
30
+ _PICKLE_MESSAGE_CLASSES = {
31
+ "IOP.PickleMessage",
32
+ "Grongier.PEX.PickleMessage",
33
+ "IOP.Generator.Message.StartPickle",
34
+ }
35
+
36
+
24
37
  def dispatch_serializer(message: Any, is_generator: bool = False) -> Any:
25
38
  """Serializes the message based on its type.
26
39
 
@@ -69,25 +82,28 @@ def dispatch_deserializer(serial: Any) -> Any:
69
82
  Returns:
70
83
  The deserialized message
71
84
  """
72
- if (
73
- serial is not None
74
- and type(serial).__module__.startswith("iris")
75
- and (serial._IsA("IOP.Message") or serial._IsA("Grongier.PEX.Message"))
76
- ):
85
+ if serial is None or not type(serial).__module__.startswith("iris"):
86
+ return serial
87
+
88
+ iris_classname = get_iris_object_classname(serial)
89
+
90
+ if iris_classname in _MESSAGE_CLASSES:
77
91
  return deserialize_message(serial)
78
- elif (
79
- serial is not None
80
- and type(serial).__module__.startswith("iris")
81
- and (
82
- serial._IsA("IOP.PickleMessage")
83
- or serial._IsA("Grongier.PEX.PickleMessage")
84
- )
85
- ):
92
+
93
+ if iris_classname in _PICKLE_MESSAGE_CLASSES:
86
94
  return deserialize_pickle_message(serial)
87
- elif is_iris_object_instance(serial):
88
- return deserialize_persistent_message(serial)
89
- else:
90
- return serial
95
+
96
+ deserialized = deserialize_persistent_message(serial, iris_classname=iris_classname)
97
+ if deserialized is not serial:
98
+ return deserialized
99
+
100
+ if serial._IsA("IOP.Message") or serial._IsA("Grongier.PEX.Message"):
101
+ return deserialize_message(serial)
102
+
103
+ if serial._IsA("IOP.PickleMessage") or serial._IsA("Grongier.PEX.PickleMessage"):
104
+ return deserialize_pickle_message(serial)
105
+
106
+ return serial
91
107
 
92
108
 
93
109
  def dispach_message(host: Any, request: Any) -> Any:
@@ -6,13 +6,10 @@ import os
6
6
  import sys
7
7
  from typing import Any, Optional
8
8
 
9
+ import iris_persistence
9
10
  from iris_persistence import Field as Field
10
11
  from iris_persistence import Model
11
12
  from iris_persistence.models import ModelMeta
12
- from iris_persistence.query import (
13
- _build_model_from_iris_obj,
14
- _materialize_related_value,
15
- )
16
13
  from iris_persistence.runtime import get_runtime
17
14
 
18
15
 
@@ -27,6 +24,7 @@ _PYTHON_TO_IRIS_CACHE: dict[str, str] = {}
27
24
  _IRIS_TO_PYTHON_CACHE: dict[str, str] = {}
28
25
  _IRIS_TO_PYTHON_CLASSPATH_CACHE: dict[str, str] = {}
29
26
  _IRIS_TO_PYTHON_STRICT_CACHE: dict[str, bool] = {}
27
+ _IRIS_TO_MESSAGE_CLASS_CACHE: dict[str, type] = {}
30
28
  _IRIS_PARAMETER_CACHE: dict[tuple[str, str], Optional[str]] = {}
31
29
  _AUTO_SYNCED: set[tuple[type, str]] = set()
32
30
 
@@ -177,6 +175,7 @@ def register_persistent_message_class(
177
175
 
178
176
  if sync_schema:
179
177
  msg_cls.sync_schema()
178
+ _AUTO_SYNCED.add((msg_cls, iris_classname))
180
179
 
181
180
 
182
181
  def serialize_persistent_message(
@@ -191,70 +190,55 @@ def serialize_persistent_message(
191
190
  iris_classname = resolve_iris_classname(msg_cls)
192
191
  _ensure_schema(msg_cls, iris_classname)
193
192
 
194
- runtime = get_runtime()
195
- iris_obj = message.__dict__.get("_iris_obj")
196
- if iris_obj is None:
197
- iris_obj = runtime.create_object(iris_classname)
198
-
199
- for field_name, model_field in msg_cls.__model_fields__.items():
200
- if field_name not in message.__dict__:
201
- continue
202
- value = getattr(message, field_name)
203
- materialized = _materialize_related_value(
204
- runtime, model_field.declared_type, value
205
- )
206
- runtime.inject_iris_value(
207
- iris_obj,
208
- field_name,
209
- materialized,
210
- field_meta=model_field.field_info,
211
- )
212
-
213
- message._iris_obj = iris_obj
214
- try:
215
- obj_id = runtime.get_object_id(iris_obj)
216
- if obj_id:
217
- message._pk = str(obj_id)
218
- except Exception:
219
- pass
193
+ iris_obj = iris_persistence.materialize(
194
+ message,
195
+ auto_sync=False,
196
+ validate=False,
197
+ )
220
198
  return iris_obj
221
199
 
222
200
 
223
- def deserialize_persistent_message(serial: Any) -> Any:
224
- iris_classname = get_iris_object_classname(serial)
201
+ def deserialize_persistent_message(
202
+ serial: Any,
203
+ iris_classname: Optional[str] = None,
204
+ ) -> Any:
205
+ iris_classname = iris_classname or get_iris_object_classname(serial)
225
206
  if not iris_classname:
226
207
  return serial
227
208
 
228
- python_classname, python_classpath, strict = _resolve_python_message_metadata(
229
- iris_classname
230
- )
231
- if not python_classname:
232
- return serial
233
-
234
- try:
235
- msg_cls = load_python_class(python_classname, python_classpath)
236
- except (AttributeError, ModuleNotFoundError, PersistentMessageError) as exc:
237
- if strict:
238
- raise PersistentMessageError(
239
- f"IRIS class {iris_classname!r} is marked as a PersistentMessage for "
240
- f"Python class {python_classname!r}, but that Python class could not "
241
- "be imported. Ensure the message class is importable, or register it "
242
- "through CLASSES so migration writes IOP_PYTHON_CLASSPATH."
243
- ) from exc
244
- return serial
245
-
246
- if not is_persistent_message_class(msg_cls):
247
- if strict:
248
- raise PersistentMessageError(
249
- f"IRIS class {iris_classname!r} maps to {python_classname!r}, "
250
- "but that class is not a PersistentMessage subclass."
251
- )
252
- return serial
209
+ msg_cls = _IRIS_TO_MESSAGE_CLASS_CACHE.get(iris_classname)
210
+ if msg_cls is None:
211
+ python_classname, python_classpath, strict = _resolve_python_message_metadata(
212
+ iris_classname
213
+ )
214
+ if not python_classname:
215
+ return serial
253
216
 
254
- _prepare_message_class(msg_cls, iris_classname, registered=False)
217
+ try:
218
+ msg_cls = load_python_class(python_classname, python_classpath)
219
+ except (AttributeError, ModuleNotFoundError, PersistentMessageError) as exc:
220
+ if strict:
221
+ raise PersistentMessageError(
222
+ f"IRIS class {iris_classname!r} is marked as a PersistentMessage for "
223
+ f"Python class {python_classname!r}, but that Python class could not "
224
+ "be imported. Ensure the message class is importable, or register it "
225
+ "through CLASSES so migration writes IOP_PYTHON_CLASSPATH."
226
+ ) from exc
227
+ return serial
228
+
229
+ if not is_persistent_message_class(msg_cls):
230
+ if strict:
231
+ raise PersistentMessageError(
232
+ f"IRIS class {iris_classname!r} maps to {python_classname!r}, "
233
+ "but that class is not a PersistentMessage subclass."
234
+ )
235
+ return serial
236
+
237
+ _prepare_message_class(msg_cls, iris_classname, registered=False)
238
+ _IRIS_TO_MESSAGE_CLASS_CACHE[iris_classname] = msg_cls
255
239
 
256
240
  known_pk = _safe_get_object_id(serial)
257
- return _build_model_from_iris_obj(msg_cls, serial, known_pk=known_pk or "")
241
+ return msg_cls.from_iris(serial, known_pk=known_pk or "")
258
242
 
259
243
 
260
244
  def resolve_iris_classname(msg_cls: type) -> str:
@@ -351,6 +335,9 @@ def _safe_get_object_id(obj: Any) -> Optional[str]:
351
335
 
352
336
 
353
337
  def _ensure_schema(msg_cls: type, iris_classname: str) -> None:
338
+ key = (msg_cls, iris_classname)
339
+ if key in _AUTO_SYNCED:
340
+ return
354
341
  if not getattr(msg_cls, "_auto_sync", False):
355
342
  return
356
343
  if getattr(msg_cls, "_sync_mode", DEFAULT_SYNC_MODE) != DEFAULT_SYNC_MODE:
@@ -360,10 +347,6 @@ def _ensure_schema(msg_cls: type, iris_classname: str) -> None:
360
347
  "with mode='extend'."
361
348
  )
362
349
 
363
- key = (msg_cls, iris_classname)
364
- if key in _AUTO_SYNCED:
365
- return
366
-
367
350
  _prepare_message_class(msg_cls, iris_classname, registered=False)
368
351
  msg_cls.sync_schema()
369
352
  _AUTO_SYNCED.add(key)
@@ -381,6 +364,7 @@ def _prepare_message_class(
381
364
  msg_cls._iop_registered_classname = iris_classname
382
365
  _set_message_parameters(msg_cls)
383
366
  _cache_mapping(get_python_classname(msg_cls), iris_classname)
367
+ _IRIS_TO_MESSAGE_CLASS_CACHE[iris_classname] = msg_cls
384
368
 
385
369
 
386
370
  def _set_message_parameters(msg_cls: type) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iris_pex_embedded_python
3
- Version: 3.7.1b4
3
+ Version: 3.7.1b5
4
4
  Summary: Iris Interoperability based on Embedded Python
5
5
  Author-email: grongier <guillaume.rongier@intersystems.com>
6
6
  License: MIT License
@@ -43,8 +43,8 @@ Description-Content-Type: text/markdown
43
43
  License-File: LICENSE
44
44
  Requires-Dist: pydantic>=2.0.0
45
45
  Requires-Dist: xmltodict>=0.12.0
46
- Requires-Dist: iris-embedded-python-wrapper>=0.0.6
47
- Requires-Dist: iris-persistence>=0.1.0
46
+ Requires-Dist: iris-embedded-python-wrapper>=0.5.0
47
+ Requires-Dist: iris-persistence>=0.1.1
48
48
  Requires-Dist: jsonpath-ng>=1.7.0
49
49
  Requires-Dist: debugpy>=1.8.0
50
50
  Requires-Dist: requests>=2.24.0
@@ -1,7 +1,7 @@
1
1
  pydantic>=2.0.0
2
2
  xmltodict>=0.12.0
3
- iris-embedded-python-wrapper>=0.0.6
4
- iris-persistence>=0.1.0
3
+ iris-embedded-python-wrapper>=0.5.0
4
+ iris-persistence>=0.1.1
5
5
  jsonpath-ng>=1.7.0
6
6
  debugpy>=1.8.0
7
7
  requests>=2.24.0