iris-pex-embedded-python 3.1.1b2__py3-none-any.whl → 3.1.1b4__py3-none-any.whl

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.

Potentially problematic release.


This version of iris-pex-embedded-python might be problematic. Click here for more details.

iop/_business_host.py CHANGED
@@ -34,15 +34,14 @@ class _BusinessHost(_Common):
34
34
  :param fonction: the function that will be decorated
35
35
  :return: The function dispatch_serializer is being returned.
36
36
  """
37
- def dispatch_serializer(self,*params, **param2):
38
- # Handle positional arguments
39
- serialized=[]
40
- for param in params:
41
- serialized.append(self._dispatch_serializer(param))
42
- # Handle keyword arguments
43
- for key, value in param2.items():
44
- param2[key] = self._dispatch_serializer(value)
45
- return fonction(self,*serialized, **param2)
37
+ def dispatch_serializer(self, *params, **param2):
38
+ # Handle positional arguments using list comprehension
39
+ serialized = [self._dispatch_serializer(param) for param in params]
40
+
41
+ # Handle keyword arguments using dictionary comprehension
42
+ param2 = {key: self._dispatch_serializer(value) for key, value in param2.items()}
43
+
44
+ return fonction(self, *serialized, **param2)
46
45
  return dispatch_serializer
47
46
 
48
47
  def input_serialzer_param(position:int,name:str):
@@ -55,19 +54,20 @@ class _BusinessHost(_Common):
55
54
  """
56
55
  def input_serialzer_param(fonction):
57
56
  @wraps(fonction)
58
- def dispatch_serializer(self,*params, **param2):
59
- # Handle positional arguments
60
- serialized=[]
61
- for i,param in enumerate(params):
62
- if i == position:
63
- serialized.append(self._dispatch_serializer(param))
64
- else:
65
- serialized.append(param)
66
- # Handle keyword arguments
67
- for key, value in param2.items():
68
- if key == name:
69
- param2[key] = self._dispatch_serializer(value)
70
- return fonction(self,*serialized, **param2)
57
+ def dispatch_serializer(self, *params, **param2):
58
+ # Handle positional arguments using list comprehension
59
+ serialized = [
60
+ self._dispatch_serializer(param) if i == position else param
61
+ for i, param in enumerate(params)
62
+ ]
63
+
64
+ # Handle keyword arguments using dictionary comprehension
65
+ param2 = {
66
+ key: self._dispatch_serializer(value) if key == name else value
67
+ for key, value in param2.items()
68
+ }
69
+
70
+ return fonction(self, *serialized, **param2)
71
71
  return dispatch_serializer
72
72
  return input_serialzer_param
73
73
 
@@ -93,15 +93,14 @@ class _BusinessHost(_Common):
93
93
  :param fonction: the function that will be decorated
94
94
  :return: The function dispatch_deserializer is being returned.
95
95
  """
96
- def dispatch_deserializer(self,*params, **param2):
97
- # Handle positional arguments
98
- serialized=[]
99
- for param in params:
100
- serialized.append(self._dispatch_deserializer(param))
101
- # Handle keyword arguments
102
- for key, value in param2.items():
103
- param2[key] = self._dispatch_deserializer(value)
104
- return fonction(self,*serialized, **param2)
96
+ def dispatch_deserializer(self, *params, **param2):
97
+ # Handle positional arguments using list comprehension
98
+ serialized = [self._dispatch_deserializer(param) for param in params]
99
+
100
+ # Handle keyword arguments using dictionary comprehension
101
+ param2 = {key: self._dispatch_deserializer(value) for key, value in param2.items()}
102
+
103
+ return fonction(self, *serialized, **param2)
105
104
  return dispatch_deserializer
106
105
 
107
106
  def output_serialzer(fonction):
@@ -236,18 +235,20 @@ class _BusinessHost(_Common):
236
235
  :param message: The message to be serialized
237
236
  :return: The serialized message
238
237
  """
239
- if (message is not None and self._is_message_instance(message)):
240
- return self._serialize_message(message)
241
- elif (message is not None and self._is_pickle_message_instance(message)):
242
- return self._serialize_pickle_message(message)
243
- elif (message is not None and self._is_iris_object_instance(message)):
244
- return message
245
- elif (message is None or message == ""):
238
+ if message is not None:
239
+ if self._is_message_instance(message):
240
+ return self._serialize_message(message)
241
+ elif self._is_pickle_message_instance(message):
242
+ return self._serialize_pickle_message(message)
243
+ elif self._is_iris_object_instance(message):
244
+ return message
245
+
246
+ if message == "" or message is None:
246
247
  return message
247
- else:
248
- # todo : decorator takes care of all the parameters, so this should never happen
249
- # return message
250
- raise TypeError("The message must be an instance of a class that is a subclass of Message or IRISObject %Persistent class.")
248
+
249
+ # todo : decorator takes care of all the parameters, so this should never happen
250
+ # return message
251
+ raise TypeError("The message must be an instance of a class that is a subclass of Message or IRISObject %Persistent class.")
251
252
 
252
253
  def _serialize_message(self,message):
253
254
  """ Converts a python dataclass message into an iris iop.message.
@@ -265,8 +266,8 @@ class _BusinessHost(_Common):
265
266
  msg = iris.cls('IOP.Message')._New()
266
267
  msg.classname = module + "." + classname
267
268
 
268
- if hasattr(message, 'buffer') and len(json_string) > msg.buffer:
269
- msg.json = _Utils.string_to_stream(json_string)
269
+ if hasattr(msg, 'buffer') and len(json_string) > msg.buffer:
270
+ msg.json = _Utils.string_to_stream(json_string,msg.buffer)
270
271
  else:
271
272
  msg.json = json_string
272
273
 
@@ -291,16 +292,22 @@ class _BusinessHost(_Common):
291
292
  :return: The return value is a tuple of the form (serial, serial_type)
292
293
  """
293
294
  if (
294
- (serial is not None and type(serial).__module__.find('iris') == 0)
295
- and
296
- (serial._IsA("IOP.Message") or serial._IsA("Grongier.PEX.Message"))
297
- ):
295
+ serial is not None
296
+ and type(serial).__module__.startswith('iris')
297
+ and (
298
+ serial._IsA("IOP.Message")
299
+ or serial._IsA("Grongier.PEX.Message")
300
+ )
301
+ ):
298
302
  return self._deserialize_message(serial)
299
303
  elif (
300
- (serial is not None and type(serial).__module__.find('iris') == 0)
301
- and
302
- (serial._IsA("IOP.PickleMessage") or serial._IsA("Grongier.PEX.PickleMessage"))
303
- ):
304
+ serial is not None
305
+ and type(serial).__module__.startswith('iris')
306
+ and (
307
+ serial._IsA("IOP.PickleMessage")
308
+ or serial._IsA("Grongier.PEX.PickleMessage")
309
+ )
310
+ ):
304
311
  return self._deserialize_pickle_message(serial)
305
312
  else:
306
313
  return serial
iop/_director.py CHANGED
@@ -258,9 +258,9 @@ class _Director():
258
258
  message = iris.cls("IOP.Message")._New()
259
259
  message.classname = classname
260
260
  if body:
261
- message.jstr = _Utils.string_to_stream(body)
261
+ message.json = _Utils.string_to_stream(body)
262
262
  else:
263
- message.jstr = _Utils.string_to_stream("{}")
263
+ message.json = _Utils.string_to_stream("{}")
264
264
  # serialize the message
265
265
  business_host = _BusinessHost()
266
266
  serial_message = business_host._dispatch_serializer(message)
iop/_utils.py CHANGED
@@ -1,9 +1,11 @@
1
1
  import os
2
+ import sys
2
3
  import ast
3
4
  import iris
4
5
  import inspect
5
6
  import xmltodict
6
7
  import pkg_resources
8
+ import importlib
7
9
 
8
10
  class _Utils():
9
11
  @staticmethod
@@ -186,20 +188,17 @@ class _Utils():
186
188
  * key: the name of the production
187
189
  * value: a dictionary containing the settings for the production
188
190
  """
189
- # try to load the settings file
190
- if filename:
191
- import sys
192
- path = None
193
- # check if the filename is absolute or relative
194
- if os.path.isabs(filename):
195
- path = os.path.dirname(filename)
191
+ try:
192
+ # if the filename is not provided
193
+ if filename is None:
194
+ settings = importlib.import_module('settings')
196
195
  else:
197
- raise ValueError("The filename must be absolute")
198
- # add the path to the system path
199
- sys.path.append(path)
200
- import settings
201
- # get the path of the settings file
202
- path = os.path.dirname(inspect.getfile(settings))
196
+ # import the settings file
197
+ settings = _Utils.import_module_from_path('settings',filename)
198
+ # get the path of the settings file
199
+ path = os.path.dirname(inspect.getfile(settings))
200
+ except ModuleNotFoundError as e:
201
+ raise ModuleNotFoundError("settings.py not found") from e
203
202
  try:
204
203
  # set the classes settings
205
204
  _Utils.set_classes_settings(settings.CLASSES,path)
@@ -211,7 +210,22 @@ class _Utils():
211
210
  except AttributeError:
212
211
  print("No productions to register")
213
212
 
214
-
213
+ @staticmethod
214
+ def import_module_from_path(module_name, file_path):
215
+ if not os.path.isabs(file_path):
216
+ file_path = os.path.abspath(file_path)
217
+ # check is a file is persent at the path
218
+ if not os.path.isfile(file_path):
219
+ # append settings.py to the path
220
+ file_path = os.path.join(file_path,'settings.py')
221
+
222
+ spec = importlib.util.spec_from_file_location(module_name, file_path)
223
+ if spec is None:
224
+ raise ImportError(f"Cannot find module named {module_name} at {file_path}")
225
+
226
+ module = importlib.util.module_from_spec(spec)
227
+ sys.modules[module_name] = module
228
+ return module
215
229
 
216
230
  @staticmethod
217
231
  def set_classes_settings(class_items,root_path=None):
@@ -360,17 +374,17 @@ class _Utils():
360
374
  return data
361
375
 
362
376
  @staticmethod
363
- def stream_to_string(stream)-> str:
377
+ def stream_to_string(stream,buffer=1000000)-> str:
364
378
  string = ""
365
379
  stream.Rewind()
366
380
  while not stream.AtEnd:
367
- string += stream.Read(4092)
381
+ string += stream.Read(buffer)
368
382
  return string
369
383
 
370
384
  @staticmethod
371
- def string_to_stream(string:str):
385
+ def string_to_stream(string:str,buffer=1000000):
372
386
  stream = iris.cls('%Stream.GlobalCharacter')._New()
373
- n = 4092
387
+ n = buffer
374
388
  chunks = [string[i:i+n] for i in range(0, len(string), n)]
375
389
  for chunk in chunks:
376
390
  stream.Write(chunk)
iop/cls/IOP/Message.cls CHANGED
@@ -5,7 +5,7 @@
5
5
  Class IOP.Message Extends (Ens.MessageBody, %CSP.Page, %XML.Adaptor)
6
6
  {
7
7
 
8
- Parameter BUFFER = 64000;
8
+ Parameter BUFFER = 1000000;
9
9
 
10
10
  Property buffer As %String(MAXLEN = "") [ Calculated, Transient ];
11
11
 
@@ -15,9 +15,9 @@ Property jsonObject As %DynamicObject(XMLPROJECTION = "None");
15
15
 
16
16
  Property json As %String(MAXLEN = "");
17
17
 
18
- Property jsonStream As %Stream.GlobalCharacter [ Internal, ReadOnly ];
18
+ Property jsonStream As %Stream.GlobalCharacter [ Internal, Private ];
19
19
 
20
- Property jsonString As %String(MAXLEN = 64000) [ Internal, ReadOnly ];
20
+ Property jsonString As %String(MAXLEN = 1000000) [ Internal, Private ];
21
21
 
22
22
  Property jstr As %Stream.GlobalCharacter [ Internal, Private ];
23
23
 
@@ -80,13 +80,25 @@ Method jsonSet(pInput) As %Status
80
80
  , :$$$NULLOREF)
81
81
  Quit:tOldStream=pInput $$$OK
82
82
  Do:..type'="" Clear() Set i%type=""
83
- If $ISOBJECT(pInput) && pInput.%Extends("%Stream.GlobalCharacter") {
84
- Set r%jsonStream=pInput, i%type="Stream"
85
- }
86
- If $IsObject(pInput) && 'pInput.%Extends("%Stream.GlobalCharacter") {
87
- Throw ##class(%Exception.General).%New("Invalid input type, must be a %Stream.GlobalCharacter")
83
+
84
+ If $ISOBJECT(pInput) {
85
+ if pInput.%Extends("%Stream.GlobalCharacter") {
86
+ Set ..jsonStream=pInput, i%type="Stream"
87
+ }
88
+ else {
89
+ Throw ##class(%Exception.General).%New("Invalid input type, must be a %Stream.GlobalCharacter or a %String")
90
+ }
88
91
  }
89
- Else {
92
+ Else {
93
+ if $LENGTH(pInput)>..#BUFFER {
94
+ // write in a stream
95
+ Set stream = ##class(%Stream.GlobalCharacter).%New()
96
+ for i=1:..#BUFFER:$LENGTH(pInput) {
97
+ Set sc = stream.Write($EXTRACT(pInput,i,(i+..#BUFFER)))
98
+ Quit:$$$ISERR(sc)
99
+ }
100
+ Set ..jsonStream=stream, i%type="Stream"
101
+ }
90
102
  Set i%jsonString=pInput, i%type="String"
91
103
  }
92
104
  Quit $$$OK
iop/cls/IOP/Test.cls CHANGED
@@ -3,7 +3,7 @@ Class IOP.Test Extends %Persistent
3
3
  {
4
4
 
5
5
  /// Description
6
- ClassMethod TEST() As %Status
6
+ ClassMethod TestJsonStringMessage() As %Status
7
7
  {
8
8
  set msg = ##class(IOP.Message).%New()
9
9
  set msg.classname = "IOP.Message"
@@ -13,6 +13,18 @@ ClassMethod TEST() As %Status
13
13
  QUIT $$$OK
14
14
  }
15
15
 
16
+ ClassMethod TestJsonStreamMessage() As %Status
17
+ {
18
+ set msg = ##class(IOP.Message).%New()
19
+ set msg.classname = "IOP.Message"
20
+ set stream = ##class(%Stream.GlobalCharacter).%New()
21
+ set sc = stream.Write("{""name"":""John""}")
22
+ set msg.json = stream
23
+ set tset = msg.json
24
+ set tst = msg.jstr
25
+ QUIT $$$OK
26
+ }
27
+
16
28
  /// Register
17
29
  ClassMethod Register() As %Status
18
30
  {
iop/cls/IOP/Utils.cls CHANGED
@@ -120,7 +120,7 @@ ClassMethod GetRemoteClassInfo(
120
120
  set onePath = $p(extraClasspaths,"|",i)
121
121
  set onePath = ##class(%File).NormalizeDirectory(onePath)
122
122
  if onePath?1"$$IRISHOME"1P.E set onePath = $e($system.Util.InstallDirectory(),1,*-1)_$e(onePath,11,*)
123
- if onePath'="" do sys.path.append(onePath)
123
+ if onePath'="" && '$FIND(sys.path,onePath) do sys.path.insert(0, onePath)
124
124
  }
125
125
  }
126
126
  ;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iris_pex_embedded_python
3
- Version: 3.1.1b2
3
+ Version: 3.1.1b4
4
4
  Summary: Iris Interoperability based on Embedded Python
5
5
  Author-email: grongier <guillaume.rongier@intersystems.com>
6
6
  License: MIT License
@@ -43,9 +43,9 @@ Classifier: Programming Language :: Python :: 3.11
43
43
  Classifier: Topic :: Utilities
44
44
  Description-Content-Type: text/markdown
45
45
  License-File: LICENSE
46
- Requires-Dist: dacite >=1.6.0
47
- Requires-Dist: xmltodict >=0.12.0
48
- Requires-Dist: iris-embedded-python-wrapper >=0.0.6
46
+ Requires-Dist: dacite>=1.6.0
47
+ Requires-Dist: xmltodict>=0.12.0
48
+ Requires-Dist: iris-embedded-python-wrapper>=0.0.6
49
49
 
50
50
  # 1. interoperability-embedded-python
51
51
 
@@ -92,31 +92,31 @@ intersystems_iris/pex/_OutboundAdapter.py,sha256=ao2Ubbta2DcrQGdzDUD_j1Zsk8bvUfc
92
92
  intersystems_iris/pex/__init__.py,sha256=l_I1dpnluWawbFrGMDC0GLHpuHwjbpd-nho8otFX6TE,1379
93
93
  iop/__init__.py,sha256=zHFF0Znipx1fwHYUEBZjNOYoZH1ro7z4IgYDU32kdn0,1067
94
94
  iop/__main__.py,sha256=pQzVtkDhAeI6dpNRC632dVk2SGZZIEDwDufdgZe8VWs,98
95
- iop/_business_host.py,sha256=Z0h9Yp-Q8u-Jh8n-h0R8M3tiDFPJdL2pDcgjeTEnvn4,28150
95
+ iop/_business_host.py,sha256=_U7f2Fy-7_qzBz4OQTAieVvEhBaT1Z0E77QoYPU0i-U,28244
96
96
  iop/_business_operation.py,sha256=P824IzO89LCKnoNHZk64OZBDHcomHpjhKmMT89bS6TI,3500
97
97
  iop/_business_process.py,sha256=F4NIQcwQ5u8yiAPpaN14OAXxbKJsRAGm5S4lrbgA3oI,13296
98
98
  iop/_business_service.py,sha256=sX8J-2-0Go6uIuPYa0A5N9Nn9rY5lV6a05v4q78qDC8,3726
99
99
  iop/_cli.py,sha256=yg4wv1FkhgjmoZuTMUr61Ff21PegJDH_cpZeHcF8hQE,6207
100
100
  iop/_common.py,sha256=uKJdfCSPOjVQOg8GVuUj4ywfAn_2sPB3C82HbWw_5bI,15384
101
- iop/_director.py,sha256=CSNQPS4JPB3O4mXzsBj5L0Dcdciu1dm8ZtoHtnZCBTY,11041
101
+ iop/_director.py,sha256=t4hBkYRUFwkNFNK6pCmrVVsPELlGYqvSsSNBPIJe1e8,11041
102
102
  iop/_inbound_adapter.py,sha256=PS5ToqhrYcXq9ZdLbCBqAfVp8kCeRACm_KF66pwBO9U,1652
103
103
  iop/_message.py,sha256=BmwBXriykU66bwAgRbdkMpjfJRVWoNRX2eDc9TXfXzA,325
104
104
  iop/_outbound_adapter.py,sha256=YTAhLrRf9chEAd53mV6KKbpaHOKNOKJHoGgj5wakRR0,726
105
105
  iop/_pickle_message.py,sha256=noKfc2VkXufV3fqjKvNHN_oANQ1YN9ffCaSV0XSTAIE,331
106
106
  iop/_private_session_duplex.py,sha256=klzWKwRRBoKUSz85D3DNYuCpDcZe_kWLNCWq5JtR0yc,5044
107
107
  iop/_private_session_process.py,sha256=pGjWFOQhWpQxUVpTtvNKTPvDxgzjfw0VC4Aqj3KUq8w,1704
108
- iop/_utils.py,sha256=3rhO33PLZ1ESJiboQFwfIGUvHV7RBSbq6A2CPyMaojA,16269
108
+ iop/_utils.py,sha256=dXrPfBIpS7dz2Zvui0em_1QaSDIxbg1kbcULHdnI6zY,16992
109
109
  iop/cls/IOP/BusinessOperation.cls,sha256=lrymqZ8wHl5kJjXwdjbQVs5sScV__yIWGh-oGbiB_X0,914
110
110
  iop/cls/IOP/BusinessProcess.cls,sha256=s3t38w1ykHqM26ETcbCYLt0ocjZyVVahm-_USZkuJ1E,2855
111
111
  iop/cls/IOP/BusinessService.cls,sha256=7ebn32J9PiZXUgXuh5Xxm_7X6zHBiqkJr9c_dWxbPO8,1021
112
112
  iop/cls/IOP/Common.cls,sha256=vYTnsL-ch-vTjpigBtwOHgrnOQMmuTkqXT9F-vWE650,11068
113
113
  iop/cls/IOP/Director.cls,sha256=DlxyFvsJjB1FVImFVNkRpQy7XXIMRoDZOLpEdMlwgOU,1885
114
114
  iop/cls/IOP/InboundAdapter.cls,sha256=GeoCm6q5HcLJ5e4VxgqXiErJXqolBbpKwpunaNzpvjU,610
115
- iop/cls/IOP/Message.cls,sha256=DXXYF57YS-IQAyru8MQiEBo9UE3vgn6518_yVl2BepE,9660
115
+ iop/cls/IOP/Message.cls,sha256=n0r0FslXdDfPcHIiAlW7n596DDsDSNlTX8UTPaMnSV8,9911
116
116
  iop/cls/IOP/OutboundAdapter.cls,sha256=9eOwy5ojwcTzwrHs6LNrFQvUD8aqcoNCZrILN1ycdDM,958
117
117
  iop/cls/IOP/PickleMessage.cls,sha256=S3y7AClQ8mAILjxPuHdCjGosBZYzGbUQ5WTv4mYPNMQ,1673
118
- iop/cls/IOP/Test.cls,sha256=I11dVr44_XKgg-i_JvgPq9AeHwNnlfD226bgM5MSx7E,1775
119
- iop/cls/IOP/Utils.cls,sha256=VwIeWxbeC6LkoDuBN0vhias-pkeLp7mbcC_4MPnzQ8g,13757
118
+ iop/cls/IOP/Test.cls,sha256=gAC9PEfMZsvAEWIa241-ug2FWAhITbN1SOispZzJPnI,2094
119
+ iop/cls/IOP/Utils.cls,sha256=9T4KR0Botlf45WgnNOJodHDF3djcy0Ow3MTy5_q_KeM,13788
120
120
  iop/cls/IOP/Duplex/Operation.cls,sha256=K_fmgeLjPZQbHgNrc0kd6DUQoW0fDn1VHQjJxHo95Zk,525
121
121
  iop/cls/IOP/Duplex/Process.cls,sha256=xbefZ4z84a_IUhavWN6P_gZBzqkdJ5XRTXxro6iDvAg,6986
122
122
  iop/cls/IOP/Duplex/Service.cls,sha256=sTMOQUCMBgVitmQkM8bbsrmrRtCdj91VlctJ3I7b8WU,161
@@ -135,9 +135,9 @@ iris/iris_ipm.pyi,sha256=j7CNUZcjeDu5sgeWUZJO_Qi4vQmHh6aD-jPWv8OdoUs,374
135
135
  iris/iris_utils.py,sha256=kg80O3yRpHIutM-mCyr4xCeTvKWPE-Kai-b6Dxw4vQ4,9882
136
136
  irisnative/_IRISNative.py,sha256=HQ4nBhc8t8_5OtxdMG-kx1aa-T1znf2I8obZOPLOPzg,665
137
137
  irisnative/__init__.py,sha256=6YmvBLQSURsCPKaNg7LK-xpo4ipDjrlhKuwdfdNb3Kg,341
138
- iris_pex_embedded_python-3.1.1b2.dist-info/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
139
- iris_pex_embedded_python-3.1.1b2.dist-info/METADATA,sha256=ntJ_H35hi4dL3SLkXgSaAzRN_pAX4l2KMpccSzd1Scs,49482
140
- iris_pex_embedded_python-3.1.1b2.dist-info/WHEEL,sha256=Rp8gFpivVLXx-k3U95ozHnQw8yDcPxmhOpn_Gx8d5nc,91
141
- iris_pex_embedded_python-3.1.1b2.dist-info/entry_points.txt,sha256=pj-i4LSDyiSP6xpHlVjMCbg1Pik7dC3_sdGY3Yp9Vhk,38
142
- iris_pex_embedded_python-3.1.1b2.dist-info/top_level.txt,sha256=jkWtvFKOp1Q-uO_VpGpfx5TcW7DS39z1liOAVp6zLig,47
143
- iris_pex_embedded_python-3.1.1b2.dist-info/RECORD,,
138
+ iris_pex_embedded_python-3.1.1b4.dist-info/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
139
+ iris_pex_embedded_python-3.1.1b4.dist-info/METADATA,sha256=HUeMihLWadeBDPUQn_2bP6IuIB9dsGQlwlY0hhwCaws,49479
140
+ iris_pex_embedded_python-3.1.1b4.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
141
+ iris_pex_embedded_python-3.1.1b4.dist-info/entry_points.txt,sha256=pj-i4LSDyiSP6xpHlVjMCbg1Pik7dC3_sdGY3Yp9Vhk,38
142
+ iris_pex_embedded_python-3.1.1b4.dist-info/top_level.txt,sha256=jkWtvFKOp1Q-uO_VpGpfx5TcW7DS39z1liOAVp6zLig,47
143
+ iris_pex_embedded_python-3.1.1b4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.0.0)
2
+ Generator: setuptools (72.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5