iris-pex-embedded-python 3.4.1b8__py3-none-any.whl → 3.4.1b10__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_service.py CHANGED
@@ -16,6 +16,12 @@ class _BusinessService(_BusinessHost):
16
16
  Adapter = adapter = None
17
17
  _wait_for_next_call_interval = False
18
18
 
19
+ def _dispatch_on_init(self, host_object) -> None:
20
+ """For internal use only."""
21
+ self.on_init()
22
+
23
+ return
24
+
19
25
  def on_process_input(self, message_input):
20
26
  """ Receives the message from the inbond adapter via the PRocessInput method and is responsible for forwarding it to target business processes or operations.
21
27
  If the business service does not specify an adapter, then the default adapter calls this method with no message
iop/_common.py CHANGED
@@ -1,12 +1,15 @@
1
1
  import abc
2
2
  import inspect
3
3
  import traceback
4
+
4
5
  from typing import Any, ClassVar, List, Optional, Tuple
5
6
 
6
7
  from . import _iris
7
8
 
8
9
  from iop._log_manager import LogManager, logging
9
10
 
11
+ from iop._debugpy import debugpython
12
+
10
13
  class _Common(metaclass=abc.ABCMeta):
11
14
  """Base class that defines common methods for all component types.
12
15
 
@@ -57,6 +60,7 @@ class _Common(metaclass=abc.ABCMeta):
57
60
  self.on_connected()
58
61
 
59
62
  def _dispatch_on_init(self, host_object: Any) -> None:
63
+ """Initialize component when started."""
60
64
  self.on_init()
61
65
 
62
66
  def _dispatch_on_tear_down(self, host_object: Any) -> None:
@@ -66,6 +70,11 @@ class _Common(metaclass=abc.ABCMeta):
66
70
  """Internal method to set IRIS handles."""
67
71
  pass
68
72
 
73
+ def _debugpy(self, host) -> None:
74
+ """Set up debugpy for debugging."""
75
+ if debugpython is not None:
76
+ debugpython(self=self, host_object=host)
77
+
69
78
  # Component information methods
70
79
  @classmethod
71
80
  def _get_info(cls) -> List[str]:
iop/_debugpy.py ADDED
@@ -0,0 +1,145 @@
1
+
2
+ import threading
3
+ import time
4
+ import contextlib
5
+ import socket
6
+ import os
7
+ import sys
8
+ from contextlib import closing
9
+ from typing import Optional, cast, Any, Dict
10
+
11
+ def find_free_port(start: Optional[int] = None, end: Optional[int] = None) -> int:
12
+ port = start
13
+ if port is None:
14
+ port = 0
15
+ if end is None:
16
+ end = port
17
+
18
+ try:
19
+ with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
20
+ with contextlib.suppress(Exception):
21
+ s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
22
+
23
+ s.bind(("0.0.0.0", port))
24
+
25
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
26
+ return cast(int, s.getsockname()[1])
27
+ except (SystemExit, KeyboardInterrupt):
28
+ raise
29
+ except BaseException:
30
+ if port and end > port:
31
+ return find_free_port(port + 1, end)
32
+ if start and start > 0:
33
+ return find_free_port(None)
34
+ raise
35
+
36
+ def is_debugpy_installed() -> bool:
37
+ try:
38
+ __import__("debugpy")
39
+ return True
40
+ except ImportError:
41
+ return False
42
+
43
+ def _get_python_interpreter_path(install_dir: Optional[str]) -> Optional[str]:
44
+ """Get the path to the Python interpreter."""
45
+ if not install_dir:
46
+ return None
47
+
48
+ python_exe = 'irispython.exe' if sys.platform == 'win32' else 'irispython'
49
+ python_path = os.path.join(install_dir, 'bin', python_exe)
50
+
51
+ return python_path if os.path.exists(python_path) else None
52
+
53
+ def _get_debugpy_config(python_path: str) -> Dict[str, str]:
54
+ """Get the debugpy configuration."""
55
+ return {"python": python_path}
56
+
57
+ def configure_debugpy(self, python_path: Optional[str] = None) -> bool:
58
+ """Configure debugpy with the appropriate Python interpreter."""
59
+ import debugpy
60
+
61
+ if not python_path:
62
+ install_dir = os.environ.get('IRISINSTALLDIR') or os.environ.get('ISC_PACKAGE_INSTALLDIR')
63
+ python_path = _get_python_interpreter_path(install_dir)
64
+
65
+ if not python_path:
66
+ self.log_alert("Could not determine Python interpreter path")
67
+ return False
68
+
69
+ try:
70
+ debugpy.configure(_get_debugpy_config(python_path))
71
+ self.log_info(f"Debugpy configured with Python interpreter: {python_path}")
72
+ return True
73
+ except Exception as e:
74
+ self.log_alert(f"Failed to configure debugpy: {e}")
75
+ return False
76
+
77
+ def wait_for_debugpy_connected(timeout: float = 30, port: int = 0) -> bool:
78
+ """Wait for debugpy client to connect."""
79
+ import debugpy
80
+
81
+ if not is_debugpy_installed():
82
+ return False
83
+
84
+ def timeout_handler():
85
+ time.sleep(timeout)
86
+ debugpy.wait_for_client.cancel()
87
+
88
+ threading.Thread(target=timeout_handler, daemon=True).start()
89
+
90
+ try:
91
+ debugpy.wait_for_client()
92
+ return debugpy.is_client_connected()
93
+ except Exception:
94
+ import pydevd # type: ignore
95
+ pydevd.stoptrace()
96
+ return False
97
+
98
+ def enable_debugpy(port: int, address: str = "0.0.0.0") -> None:
99
+ """Enable debugpy server on specified port and address."""
100
+ import debugpy
101
+ debugpy.listen((address, port))
102
+
103
+ def debugpython(self, host_object: Any) -> None:
104
+ """Enable and configure debugpy for debugging purposes."""
105
+ # hack to set __file__ for os module in debugpy
106
+ # This is a workaround for the issue where debugpy cannot find the __file__ attribute of the os module.
107
+ if not hasattr(os, '__file__'):
108
+ setattr(os, '__file__', __file__)
109
+
110
+
111
+ if host_object is None:
112
+ self.log_alert("No host object found, cannot enable debugpy.")
113
+ return
114
+
115
+ if host_object.enable != 1:
116
+ self.log_info("Debugpy is not enabled.")
117
+ return
118
+
119
+ if not is_debugpy_installed():
120
+ self.log_alert("Debugpy is not installed.")
121
+ return
122
+
123
+ # Configure Python interpreter
124
+ if host_object.PythonInterpreterPath != '':
125
+ success = configure_debugpy(self, host_object.PythonInterpreterPath)
126
+ else:
127
+ success = configure_debugpy(self)
128
+
129
+ if not success:
130
+ return
131
+
132
+ # Setup debugging server
133
+ port = host_object.port if host_object.port and host_object.port > 0 else find_free_port()
134
+
135
+ try:
136
+ enable_debugpy(port=port)
137
+ self.log_info(f"Debugpy enabled on port {port}")
138
+
139
+ self.trace(f"Waiting {host_object.timeout} seconds for debugpy connection...")
140
+ if wait_for_debugpy_connected(timeout=host_object.timeout, port=port):
141
+ self.log_info("Debugpy connected successfully")
142
+ else:
143
+ self.log_alert(f"Debugpy connection timed out after {host_object.timeout} seconds")
144
+ except Exception as e:
145
+ self.log_alert(f"Error enabling debugpy: {e}")
iop/cls/IOP/Common.cls CHANGED
@@ -40,7 +40,9 @@ Method GetModule() As %String
40
40
  Method %OnNew(pConfigName As %String) As %Status
41
41
  {
42
42
  $$$ThrowOnError(..Connect())
43
- Quit $method($this,"initConfig",.pConfigName) ; call subclass
43
+ $$$ThrowOnError($method($this,"initConfig",.pConfigName)) ; call subclass
44
+ do ..%class."_debugpy"($this)
45
+ Quit $$$OK
44
46
  }
45
47
 
46
48
  Method OnInit() As %Status
iop/cls/IOP/Utils.cls CHANGED
@@ -61,7 +61,7 @@ ClassMethod DeleteComponentProxy(pClassname As %String = "") As %Status
61
61
  {
62
62
  #dim tSC As %Status = $$$OK
63
63
  #dim ex As %Exception.AbstractException
64
- #dim tIsPEX As %Boolean = 0
64
+ #dim tIsIOP As %Boolean = 0
65
65
  #dim tClass As %Dictionary.CompiledClass
66
66
 
67
67
  Quit:(""=pClassname) $$$ERROR($$$EnsErrGeneral,"Remote class name must be specified.")
@@ -79,16 +79,16 @@ ClassMethod DeleteComponentProxy(pClassname As %String = "") As %Status
79
79
  Set tSC = $$$ERROR($$$EnsErrGeneral,$$$FormatText("Proxy class for remote class '%1' could not be opened.",pClassname))
80
80
  Quit
81
81
  }
82
- Set tIsPEX = ("IOP.Utils" = tClass.GeneratedBy)
82
+ Set tIsIOP = ("IOP.Utils" = tClass.GeneratedBy)
83
83
  }
84
- If tIsPEX {
84
+ If tIsIOP {
85
85
  Set tSC = ##class(%Dictionary.ClassDefinition).%DeleteId(pClassname)
86
86
  If $$$ISERR(tSC) {
87
87
  Set tSC = $$$ERROR($$$EnsErrGeneral,$$$FormatText("Unable to delete proxy class for remote class '%1' : '%2'.",pClassname,$System.Status.GetErrorText(tSC)))
88
88
  Quit
89
89
  }
90
90
  } Else {
91
- Set tSC = $$$ERROR($$$EnsErrGeneral,$$$FormatText("Cannot delete class '%1' because it is not a PEX proxy class.",pClassname))
91
+ Set tSC = $$$ERROR($$$EnsErrGeneral,$$$FormatText("Cannot delete class '%1' because it is not a IOP proxy class.",pClassname))
92
92
  Quit
93
93
  }
94
94
 
@@ -179,23 +179,23 @@ ClassMethod GenerateProxyClass(
179
179
  Set tSC = $$$ERROR($$$EnsErrGeneral,$$$FormatText("Proxy class '%1' already exists.",pClassname))
180
180
  Quit
181
181
  } Else {
182
- #dim tIsPEX As %Boolean = 0
182
+ #dim tIsIOP As %Boolean = 0
183
183
  If $classmethod(pClassname,"%Extends","IOP.Common") {
184
184
  #dim tClass As %Dictionary.CompiledClass = ##class(%Dictionary.CompiledClass).%OpenId(pClassname)
185
185
  If '$IsObject(tClass) {
186
186
  Set tSC = $$$ERROR($$$EnsErrGeneral,"Class not found")
187
187
  Quit
188
188
  }
189
- Set tIsPEX = ("IOP.Utils" = tClass.GeneratedBy)
189
+ Set tIsIOP = ("IOP.Utils" = tClass.GeneratedBy)
190
190
  }
191
- If tIsPEX {
191
+ If tIsIOP {
192
192
  Set tSC = ##class(%Dictionary.ClassDefinition).%DeleteId(pClassname)
193
193
  If $$$ISERR(tSC) {
194
194
  Set tSC = $$$ERROR($$$EnsErrGeneral,$$$FormatText("Unable to delete existing proxy class '%1' : '%2'.",pClassname,$System.Status.GetErrorText(tSC)))
195
195
  Quit
196
196
  }
197
197
  } Else {
198
- Set tSC = $$$ERROR($$$EnsErrGeneral,$$$FormatText("Cannot overwrite class '%1' because it is not a PEX proxy class.",pClassname))
198
+ Set tSC = $$$ERROR($$$EnsErrGeneral,$$$FormatText("Cannot overwrite class '%1' because it is not a IOP proxy class.",pClassname))
199
199
  Quit
200
200
  }
201
201
  }
@@ -208,7 +208,7 @@ ClassMethod GenerateProxyClass(
208
208
 
209
209
  #dim tSuperClass As %String = pClassDetails."__getitem__"(0)
210
210
  If (""=tSuperClass) {
211
- Set tSC = $$$ERROR($$$EnsErrGeneral,"No PEX superclass found.")
211
+ Set tSC = $$$ERROR($$$EnsErrGeneral,"No IOP superclass found.")
212
212
  Quit
213
213
  }
214
214
  If '$Case($P(tSuperClass,".",*),"DuplexProcess":1,"DuplexService":1,"DuplexOperation":1,"InboundAdapter":1,"OutboundAdapter":1,"BusinessService":1,"BusinessProcess":1,"BusinessOperation":1,:0) {
@@ -323,6 +323,56 @@ ClassMethod GenerateProxyClass(
323
323
  }
324
324
  Quit:$$$ISERR(tSC)
325
325
 
326
+ #; Add debug settings, three settings are always available debug a boolean, port an integer and a timeout an integer
327
+ Set tPropCat = "Python Debug"
328
+ #; Debug property
329
+ Set tPropDebug = ##class(%Dictionary.PropertyDefinition).%New()
330
+ Set tPropDebug.Name = "enable"
331
+ Set tPropDebug.Type = "%Boolean"
332
+ Set tPropDebug.InitialExpression = $$$quote(0)
333
+ Set tPropDebug.Description = "Enable or disable debug"
334
+
335
+ Set tSC = tCOSClass.Properties.Insert(tPropDebug)
336
+ Quit:$$$ISERR(tSC)
337
+
338
+ #; Add the settings parameter
339
+ Set tSETTINGSParamValue = tSETTINGSParamValue_",enable:"_tPropCat
340
+
341
+ #; Port property
342
+ Set tPropPort = ##class(%Dictionary.PropertyDefinition).%New()
343
+ Set tPropPort.Name = "port"
344
+ Set tPropPort.Type = "%Integer"
345
+ Set tPropPort.InitialExpression = $$$quote(0)
346
+ Set tPropPort.Description = "Port to use for the debug connection, if 0 an random port will be used"
347
+ Set tSC = tCOSClass.Properties.Insert(tPropPort)
348
+ Quit:$$$ISERR(tSC)
349
+
350
+ #; Add the settings parameter
351
+ Set tSETTINGSParamValue = tSETTINGSParamValue_",port:"_tPropCat
352
+
353
+ #; Timeout property
354
+ Set tPropTimeout = ##class(%Dictionary.PropertyDefinition).%New()
355
+ Set tPropTimeout.Name = "timeout"
356
+ Set tPropTimeout.Type = "%Integer"
357
+ Set tPropTimeout.InitialExpression = $$$quote(30)
358
+ Set tSC = tCOSClass.Properties.Insert(tPropTimeout)
359
+ Quit:$$$ISERR(tSC)
360
+
361
+ #; Add the settings parameter
362
+ Set tSETTINGSParamValue = tSETTINGSParamValue_",timeout:"_tPropCat
363
+
364
+ #; PythonInterpreterPath property
365
+ Set tPropInterpre = ##class(%Dictionary.PropertyDefinition).%New()
366
+ Set tPropInterpre.Name = "PythonInterpreterPath"
367
+ Set tPropInterpre.Type = "%String"
368
+ Set tPropInterpre.Description = "Path to the Python interpreter, if not set the default one will be used"
369
+ Do tPropInterpre.Parameters.SetAt("255","MAXLEN")
370
+ Set tSC = tCOSClass.Properties.Insert(tPropInterpre)
371
+ Quit:$$$ISERR(tSC)
372
+
373
+ #; Add the settings parameter
374
+ Set tSETTINGSParamValue = tSETTINGSParamValue_",PythonInterpreterPath:"_tPropCat
375
+
326
376
  #dim tSETTINGSParam As %Dictionary.ParameterDefinition = ##class(%Dictionary.ParameterDefinition).%New()
327
377
  Set tSETTINGSParam.Name = "SETTINGS"
328
378
  Set tSETTINGSParam.Default = tSETTINGSParamValue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iris_pex_embedded_python
3
- Version: 3.4.1b8
3
+ Version: 3.4.1b10
4
4
  Summary: Iris Interoperability based on Embedded Python
5
5
  Author-email: grongier <guillaume.rongier@intersystems.com>
6
6
  License: MIT License
@@ -49,6 +49,7 @@ Requires-Dist: xmltodict>=0.12.0
49
49
  Requires-Dist: iris-embedded-python-wrapper>=0.0.6
50
50
  Requires-Dist: setuptools>=40.8.0
51
51
  Requires-Dist: jsonpath-ng>=1.7.0
52
+ Requires-Dist: debugpy>=1.8.0
52
53
  Dynamic: license-file
53
54
 
54
55
  # IoP (Interoperability On Python)
@@ -33,9 +33,10 @@ iop/_async_request.py,sha256=ae950UFSlOHjmXGifbjHV4SFiJAMefrTVLs6lGEkgXE,2242
33
33
  iop/_business_host.py,sha256=x9wMNfs_IXBczEeGHsrnAo8mgFrlAhwtrWkSC-W9vqA,9699
34
34
  iop/_business_operation.py,sha256=ml4BIn1BfrGx8AUGISFR71DZIUCP8vZ2yn9SQjaSzTM,3038
35
35
  iop/_business_process.py,sha256=hj6nDIP5Mz5UYbm0vDjvs9lPSEYVQxGJl6tQRcDGTBk,8548
36
- iop/_business_service.py,sha256=lPTp3_tcLTOWvHlE_YwrcImLGf1PJBUgIOrV-8ctFLw,3851
36
+ iop/_business_service.py,sha256=wdhEKkqNHWt09XYGrvIpSuDDI4MyCGm2rKdvGQJ93EI,3988
37
37
  iop/_cli.py,sha256=fhaUpq3rTb4P2QPuuqoeatsphMLBPj9xtbvFPJv-2Mo,7941
38
- iop/_common.py,sha256=NaNEeAt_A1JRLDRvMDAHPWoNgwIt3xyg5X4aL0KSXMM,13485
38
+ iop/_common.py,sha256=YJrEAsf0xT-nGsCYPARwg4jrSGTYuMfMe56A8GJ46oA,13754
39
+ iop/_debugpy.py,sha256=HAZOBuYGsVi4bQ8cV1Bas0dbH9stcs_dGDSVJJ2QqfE,4702
39
40
  iop/_decorators.py,sha256=ZpgEETLdKWv58AoSMfXnm3_mA-6qPphIegjG-npDgwg,2324
40
41
  iop/_director.py,sha256=d1XXJn8T8VF9rmT-joJdz_ElS2UR6myRaXaMFC_2brA,11498
41
42
  iop/_dispatch.py,sha256=I3TAhvTuk8j4VcROI9vAitJ0a7Nk1BYAWKRrLeNsjr0,3203
@@ -52,14 +53,14 @@ iop/_utils.py,sha256=zguWjvZQkzAScHXl4OomZr2ZtPljDqVAs1CFllQZn5g,20092
52
53
  iop/cls/IOP/BusinessOperation.cls,sha256=lrymqZ8wHl5kJjXwdjbQVs5sScV__yIWGh-oGbiB_X0,914
53
54
  iop/cls/IOP/BusinessProcess.cls,sha256=s3t38w1ykHqM26ETcbCYLt0ocjZyVVahm-_USZkuJ1E,2855
54
55
  iop/cls/IOP/BusinessService.cls,sha256=7ebn32J9PiZXUgXuh5Xxm_7X6zHBiqkJr9c_dWxbPO8,1021
55
- iop/cls/IOP/Common.cls,sha256=vrS9yo4aUgMiLwfhBFJvj7hG6zYQfcSIiu5o1hdppuU,11355
56
+ iop/cls/IOP/Common.cls,sha256=yq3HskJOuX-jMtU6UW2EwhU9ur1m-v9ZLtTYu4lp5zw,11416
56
57
  iop/cls/IOP/Director.cls,sha256=M43LoTb6lwSr0J81RFxi1YLW1mwda09wQ7Xqr3nBtxo,2008
57
58
  iop/cls/IOP/InboundAdapter.cls,sha256=GeoCm6q5HcLJ5e4VxgqXiErJXqolBbpKwpunaNzpvjU,610
58
59
  iop/cls/IOP/Message.cls,sha256=ZrYQHosgfTG9wv7i-WQ8j71YXZMmL4_mN16xtIDwcRg,25180
59
60
  iop/cls/IOP/OutboundAdapter.cls,sha256=9eOwy5ojwcTzwrHs6LNrFQvUD8aqcoNCZrILN1ycdDM,958
60
61
  iop/cls/IOP/PickleMessage.cls,sha256=S3y7AClQ8mAILjxPuHdCjGosBZYzGbUQ5WTv4mYPNMQ,1673
61
62
  iop/cls/IOP/Test.cls,sha256=gAC9PEfMZsvAEWIa241-ug2FWAhITbN1SOispZzJPnI,2094
62
- iop/cls/IOP/Utils.cls,sha256=gQBp0lC4F7FWkv1JEDe45qsaLcVlg995t2th46nDGx8,15745
63
+ iop/cls/IOP/Utils.cls,sha256=_6d1qRNVbWH8GMrjA7xHudCJWw28ZXdRhVeEOcvCsRc,17744
63
64
  iop/cls/IOP/Duplex/Operation.cls,sha256=K_fmgeLjPZQbHgNrc0kd6DUQoW0fDn1VHQjJxHo95Zk,525
64
65
  iop/cls/IOP/Duplex/Process.cls,sha256=xbefZ4z84a_IUhavWN6P_gZBzqkdJ5XRTXxro6iDvAg,6986
65
66
  iop/cls/IOP/Duplex/Service.cls,sha256=sTMOQUCMBgVitmQkM8bbsrmrRtCdj91VlctJ3I7b8WU,161
@@ -71,9 +72,9 @@ iop/cls/IOP/PrivateSession/Message/Start.cls,sha256=uk-WTe66GicCshgmVy3F5ugHiAyP
71
72
  iop/cls/IOP/PrivateSession/Message/Stop.cls,sha256=7g3gKFUjNg0WXBLuWnj-VnCs5G6hSE09YTzGEp0zbGc,1390
72
73
  iop/cls/IOP/Service/WSGI.cls,sha256=VLNCXEwmHW9dBnE51uGE1nvGX6T4HjhqePT3LVhsjAE,10440
73
74
  iop/wsgi/handlers.py,sha256=NrFLo_YbAh-x_PlWhAiWkQnUUN2Ss9HoEm63dDWCBpQ,2947
74
- iris_pex_embedded_python-3.4.1b8.dist-info/licenses/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
75
- iris_pex_embedded_python-3.4.1b8.dist-info/METADATA,sha256=lFLaHao_B-wbo5qVsRM1IT3GAI5_BcOjN4hcE9fLsuc,4419
76
- iris_pex_embedded_python-3.4.1b8.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
77
- iris_pex_embedded_python-3.4.1b8.dist-info/entry_points.txt,sha256=pj-i4LSDyiSP6xpHlVjMCbg1Pik7dC3_sdGY3Yp9Vhk,38
78
- iris_pex_embedded_python-3.4.1b8.dist-info/top_level.txt,sha256=4p0q6hCATmYIVMVi3I8hOUcJE1kwzyBeHygWv_rGvrU,13
79
- iris_pex_embedded_python-3.4.1b8.dist-info/RECORD,,
75
+ iris_pex_embedded_python-3.4.1b10.dist-info/licenses/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
76
+ iris_pex_embedded_python-3.4.1b10.dist-info/METADATA,sha256=xAROmR0PjkqsXOs1dRxgkdyI5XLLQedXpCXzgsUfmYY,4450
77
+ iris_pex_embedded_python-3.4.1b10.dist-info/WHEEL,sha256=ooBFpIzZCPdw3uqIQsOo4qqbA4ZRPxHnOH7peeONza0,91
78
+ iris_pex_embedded_python-3.4.1b10.dist-info/entry_points.txt,sha256=pj-i4LSDyiSP6xpHlVjMCbg1Pik7dC3_sdGY3Yp9Vhk,38
79
+ iris_pex_embedded_python-3.4.1b10.dist-info/top_level.txt,sha256=4p0q6hCATmYIVMVi3I8hOUcJE1kwzyBeHygWv_rGvrU,13
80
+ iris_pex_embedded_python-3.4.1b10.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5