iris-pex-embedded-python 3.4.1b7__py3-none-any.whl → 3.4.1b9__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.

@@ -47,6 +47,7 @@ class _BusinessOperation(_BusinessHost):
47
47
 
48
48
  def _dispatch_on_init(self, host_object: Any) -> None:
49
49
  """For internal use only."""
50
+ self._debugpy(host_object=host_object)
50
51
  create_dispatch(self)
51
52
  self.on_init()
52
53
  return
iop/_business_process.py CHANGED
@@ -141,6 +141,7 @@ class _BusinessProcess(_BusinessHost):
141
141
  def _dispatch_on_init(self, host_object: Any) -> None:
142
142
  """For internal use only."""
143
143
  self._restore_persistent_properties(host_object)
144
+ self._debugpy(host_object=host_object)
144
145
  create_dispatch(self)
145
146
  self.on_init()
146
147
  self._save_persistent_properties(host_object)
iop/_business_service.py CHANGED
@@ -16,6 +16,15 @@ 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
+
22
+ self._debugpy(host_object=host_object)
23
+
24
+ self.on_init()
25
+
26
+ return
27
+
19
28
  def on_process_input(self, message_input):
20
29
  """ Receives the message from the inbond adapter via the PRocessInput method and is responsible for forwarding it to target business processes or operations.
21
30
  If the business service does not specify an adapter, then the default adapter calls this method with no message
iop/_common.py CHANGED
@@ -1,6 +1,7 @@
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
@@ -57,8 +58,79 @@ class _Common(metaclass=abc.ABCMeta):
57
58
  self.on_connected()
58
59
 
59
60
  def _dispatch_on_init(self, host_object: Any) -> None:
61
+ """Initialize component when started."""
62
+ self._debugpy(host_object)
60
63
  self.on_init()
61
64
 
65
+ def _debugpy(self, host_object: Any) -> None:
66
+ """Enable debugpy for debugging purposes."""
67
+ # iris.cls('%SYS.Python').Debugging(1)
68
+ from iop._debugpy import enable_debugpy, wait_for_debugpy_connected, find_free_port, is_debugpy_installed
69
+ import sys, os
70
+
71
+ # hack to set __file__ for os module in debugpy
72
+ # This is a workaround for the issue where debugpy cannot find the __file__ attribute of the os module.
73
+ if not hasattr(os, '__file__'):
74
+ setattr(os, '__file__', __file__)
75
+
76
+ if host_object is not None:
77
+ port = host_object.port
78
+ timeout = host_object.timeout
79
+ enabled = host_object.enable
80
+ python_interpreter_path = host_object.PythonInterpreterPath
81
+ else:
82
+ self.log_alert("No host object found, cannot enable debugpy.")
83
+ return
84
+
85
+ if python_interpreter_path != "":
86
+ # the user has set a specific python interpreter path, so we need to set the path to the python executable
87
+ # to the one that is running this script
88
+ if os.path.exists(python_interpreter_path):
89
+ sys.executable = python_interpreter_path
90
+ else:
91
+ self.log_alert(f"Python path {python_interpreter_path} does not exist, cannot set python path for debugpy.")
92
+ return
93
+ elif sys.executable.find('irisdb') > 0:
94
+ # the executable is the IRIS executable, so we need to set the path to the python executable
95
+ # to the one that is running this script
96
+ installdir = os.environ.get('IRISINSTALLDIR') or os.environ.get('ISC_PACKAGE_INSTALLDIR')
97
+ if installdir is not None:
98
+ if sys.platform == 'win32':
99
+ python_path = os.path.join(installdir, 'bin', 'irispython.exe')
100
+ else:
101
+ python_path = os.path.join(installdir, 'bin', 'irispython')
102
+ if os.path.exists(python_path):
103
+ sys.executable = python_path
104
+ else:
105
+ self.log_alert(f"Python path {python_path} does not exist, cannot set python path for debugpy.")
106
+ return
107
+ else:
108
+ self.log_alert("IRISINSTALLDIR or ISC_PACKAGE_INSTALLDIR not set, cannot set python path for debugpy.")
109
+ return
110
+
111
+ if enabled:
112
+ self.log_info(f"Debugpy is running in {sys.executable}.")
113
+ if is_debugpy_installed():
114
+ if port is None or port <= 0:
115
+ port = find_free_port()
116
+ self.log_info(f"Debugpy enabled.")
117
+ try:
118
+ enable_debugpy(port=port, address=None)
119
+ except Exception as e:
120
+ self.log_alert(f"Error enabling debugpy: {e}")
121
+ return
122
+
123
+ self.trace(f"Waiting for {timeout} sec to debugpy connection on port {port}...")
124
+ if wait_for_debugpy_connected(timeout=timeout, port=port):
125
+ self.log_info("Debugpy connected.")
126
+ else:
127
+ self.log_alert(f"Debugpy connection timed out after {timeout} seconds.")
128
+ else:
129
+ self.log_alert("Debugpy is not installed.")
130
+ else:
131
+ self.log_info("Debugpy is not enabled.")
132
+
133
+
62
134
  def _dispatch_on_tear_down(self, host_object: Any) -> None:
63
135
  self.on_tear_down()
64
136
 
iop/_debugpy.py ADDED
@@ -0,0 +1,69 @@
1
+
2
+ import threading
3
+ import time
4
+ import contextlib
5
+ import socket
6
+ from contextlib import closing
7
+
8
+ from typing import Optional, Tuple, Union, Sequence, cast, Callable, TypeVar, Dict, Any
9
+
10
+ def find_free_port(start: Optional[int] = None, end: Optional[int] = None) -> int:
11
+ port = start
12
+ if port is None:
13
+ port = 0
14
+ if end is None:
15
+ end = port
16
+
17
+ try:
18
+ with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
19
+ with contextlib.suppress(Exception):
20
+ s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
21
+
22
+ s.bind(("0.0.0.0", port))
23
+
24
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
25
+ return cast(int, s.getsockname()[1])
26
+ except (SystemExit, KeyboardInterrupt):
27
+ raise
28
+ except BaseException:
29
+ if port and end > port:
30
+ return find_free_port(port + 1, end)
31
+ if start and start > 0:
32
+ return find_free_port(None)
33
+ raise
34
+
35
+
36
+ def is_debugpy_installed() -> bool:
37
+ try:
38
+ __import__("debugpy")
39
+ except ImportError:
40
+ return False
41
+ return True
42
+
43
+
44
+ def wait_for_debugpy_connected(timeout: float = 30,port=0) -> bool:
45
+ import debugpy # noqa: T100
46
+
47
+ if not is_debugpy_installed():
48
+ return False
49
+
50
+ class T(threading.Thread):
51
+ daemon = True
52
+ def run(self):
53
+ time.sleep(timeout)
54
+ debugpy.wait_for_client.cancel()
55
+ T().start()
56
+ debugpy.wait_for_client()
57
+ if debugpy.is_client_connected():
58
+ return True
59
+
60
+ return False
61
+
62
+ def enable_debugpy(port: int, address = None) -> bool:
63
+
64
+ import debugpy # noqa: T100
65
+
66
+ if address is None:
67
+ address = "0.0.0.0"
68
+
69
+ debugpy.listen((address, port))
iop/_log_manager.py CHANGED
@@ -41,11 +41,11 @@ class IRISLogHandler(logging.Handler):
41
41
 
42
42
  # Map Python logging levels to IRIS logging methods
43
43
  self.level_map = {
44
- logging.DEBUG: _iris.get_iris().cls("Ens.Util.Log").LogTrace,
45
- logging.INFO: _iris.get_iris().cls("Ens.Util.Log").LogInfo,
46
- logging.WARNING: _iris.get_iris().cls("Ens.Util.Log").LogWarning,
47
- logging.ERROR: _iris.get_iris().cls("Ens.Util.Log").LogError,
48
- logging.CRITICAL: _iris.get_iris().cls("Ens.Util.Log").LogAlert,
44
+ logging.DEBUG: 5,
45
+ logging.INFO: 4,
46
+ logging.WARNING: 3,
47
+ logging.ERROR: 2,
48
+ logging.CRITICAL: 6,
49
49
  }
50
50
  # Map Python logging levels to IRIS logging Console level
51
51
  self.level_map_console = {
@@ -79,5 +79,5 @@ class IRISLogHandler(logging.Handler):
79
79
  _iris.get_iris().cls("%SYS.System").WriteToConsoleLog(self.format(record),
80
80
  0,self.level_map_console.get(record.levelno, 0),class_name+"."+method_name)
81
81
  else:
82
- log_func = self.level_map.get(record.levelno, _iris.get_iris().cls("Ens.Util.Log").LogInfo)
83
- log_func(class_name, method_name, self.format(record))
82
+ log_lvl = self.level_map.get(record.levelno, 4)
83
+ _iris.get_iris().cls("Ens.Util.Log").Log(log_lvl,class_name, method_name, self.format(record))
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.1b7
3
+ Version: 3.4.1b9
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)
@@ -31,17 +31,18 @@ iop/__init__.py,sha256=1C589HojSVK0yJf1KuTPA39ZjrOYO0QFLv45rqbZpA4,1183
31
31
  iop/__main__.py,sha256=pQzVtkDhAeI6dpNRC632dVk2SGZZIEDwDufdgZe8VWs,98
32
32
  iop/_async_request.py,sha256=ae950UFSlOHjmXGifbjHV4SFiJAMefrTVLs6lGEkgXE,2242
33
33
  iop/_business_host.py,sha256=x9wMNfs_IXBczEeGHsrnAo8mgFrlAhwtrWkSC-W9vqA,9699
34
- iop/_business_operation.py,sha256=ml4BIn1BfrGx8AUGISFR71DZIUCP8vZ2yn9SQjaSzTM,3038
35
- iop/_business_process.py,sha256=hj6nDIP5Mz5UYbm0vDjvs9lPSEYVQxGJl6tQRcDGTBk,8548
36
- iop/_business_service.py,sha256=lPTp3_tcLTOWvHlE_YwrcImLGf1PJBUgIOrV-8ctFLw,3851
34
+ iop/_business_operation.py,sha256=2k7TY-Cjv3zOsTPdwYUT7mEpF33dpVFP8aQjVnbo6nQ,3086
35
+ iop/_business_process.py,sha256=cWaqhJSiPyH36evjCIcHQn6Zt6_VGScbVXA5hhBBUO8,8596
36
+ iop/_business_service.py,sha256=Nb4vK-kR3QPe5PfOGukQuj3tz2giT1OpO-SKamVKKPU,4040
37
37
  iop/_cli.py,sha256=fhaUpq3rTb4P2QPuuqoeatsphMLBPj9xtbvFPJv-2Mo,7941
38
- iop/_common.py,sha256=NaNEeAt_A1JRLDRvMDAHPWoNgwIt3xyg5X4aL0KSXMM,13485
38
+ iop/_common.py,sha256=TWMC0hlWewi2Ynoxk9oIJ3d0HltCHdizSrwAJwyXAa4,16999
39
+ iop/_debugpy.py,sha256=-6BZYU_IV9iesTlunogKqDimV7PRtUkNMfOZCjFdI5k,1732
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
42
43
  iop/_inbound_adapter.py,sha256=PS5ToqhrYcXq9ZdLbCBqAfVp8kCeRACm_KF66pwBO9U,1652
43
44
  iop/_iris.py,sha256=9LsPHk8g9_oBqMM8SzX2HPCeHZtxdnIJqG4TVzUeKBw,150
44
- iop/_log_manager.py,sha256=ZBsMdY7OWn6BadvQ3UfoEKmDYQ9TxmcrXF3sNbqquAI,3332
45
+ iop/_log_manager.py,sha256=uCuhbTjozAcDGZ9phtMUiq5OczNQaA_nDwx-g1CWPq4,3107
45
46
  iop/_message.py,sha256=pJQOjRIdw4wSDoJamvItGODMe-UjDU71XihgWdtCAqc,1120
46
47
  iop/_message_validator.py,sha256=K6FxLe72gBHQXZTLVrFw87rABGM0F6CTaNtZ2MqJoss,1408
47
48
  iop/_outbound_adapter.py,sha256=YTAhLrRf9chEAd53mV6KKbpaHOKNOKJHoGgj5wakRR0,726
@@ -59,7 +60,7 @@ 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.1b7.dist-info/licenses/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
75
- iris_pex_embedded_python-3.4.1b7.dist-info/METADATA,sha256=qqAAXO38iWBGQ1aoBCpDc__rD31k8cwvUOmM6rf8gc4,4419
76
- iris_pex_embedded_python-3.4.1b7.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
77
- iris_pex_embedded_python-3.4.1b7.dist-info/entry_points.txt,sha256=pj-i4LSDyiSP6xpHlVjMCbg1Pik7dC3_sdGY3Yp9Vhk,38
78
- iris_pex_embedded_python-3.4.1b7.dist-info/top_level.txt,sha256=4p0q6hCATmYIVMVi3I8hOUcJE1kwzyBeHygWv_rGvrU,13
79
- iris_pex_embedded_python-3.4.1b7.dist-info/RECORD,,
75
+ iris_pex_embedded_python-3.4.1b9.dist-info/licenses/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
76
+ iris_pex_embedded_python-3.4.1b9.dist-info/METADATA,sha256=NU02nEfoQUtxznuO6Hc5TwfK9uZonh7CZBoXtAgmnw0,4449
77
+ iris_pex_embedded_python-3.4.1b9.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
78
+ iris_pex_embedded_python-3.4.1b9.dist-info/entry_points.txt,sha256=pj-i4LSDyiSP6xpHlVjMCbg1Pik7dC3_sdGY3Yp9Vhk,38
79
+ iris_pex_embedded_python-3.4.1b9.dist-info/top_level.txt,sha256=4p0q6hCATmYIVMVi3I8hOUcJE1kwzyBeHygWv_rGvrU,13
80
+ iris_pex_embedded_python-3.4.1b9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (80.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5