iris-pex-embedded-python 2.3.23b1__py3-none-any.whl → 2.3.23b2__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.

@@ -1,4 +1,4 @@
1
- Class Grongier.Service.WSGI Extends (%RegisteredObject, %CSP.REST) [ ServerOnly = 1 ]
1
+ Class Grongier.Service.WSGI Extends %CSP.REST [ ServerOnly = 1 ]
2
2
  {
3
3
 
4
4
  Parameter CLASSPATHS;
@@ -7,99 +7,304 @@ Parameter MODULENAME;
7
7
 
8
8
  Parameter APPNAME;
9
9
 
10
- /// Helper method to write data to the output stream
11
- ClassMethod write(data)
12
- {
13
- w data
14
- }
10
+ Parameter DEVMODE = 1;
15
11
 
16
- /// Helper to build the environ
17
- ClassMethod GetEnviron() As %SYS.Python
12
+ /// This method matches the request and method and calls the dispatcher
13
+ ClassMethod Page(skipheader As %Boolean = 0) As %Status [ ProcedureBlock = 1 ]
18
14
  {
19
- //set builtins
20
- set builtins = ##class(%SYS.Python).Import("builtins")
15
+ #dim tSC As %Status = $$$OK
16
+ #dim e As %Exception.AbstractException
17
+
18
+ #dim tAuthorized,tRedirected As %Boolean
19
+ #dim tRedirectRoutine,tURL As %String = ""
20
+ #dim %response As %CSP.Response
21
+
22
+ Try {
21
23
 
22
- //import dict to create environ
23
- set dict = builtins.dict()
24
+ #; Ensure that we honor the requested charset
25
+ Set %response.CharSet=..#CHARSET
24
26
 
25
- #dim %request As %CSP.Request
27
+ #; Ensure that we honor the requested CONTENTTYPE
28
+ If ..#CONTENTTYPE'="" Set %response.ContentType=..#CONTENTTYPE
26
29
 
27
- //set environ
28
- do dict."__setitem__"("SERVER_NAME", $System.INetInfo.LocalHostName())
29
- do dict."__setitem__"("SERVER_PORT", "")
30
- do dict."__setitem__"("SERVER_PROTOCOL", "HTTP/1.1")
31
- do dict."__setitem__"("SERVER_SOFTWARE", "IRIS")
32
- do dict."__setitem__"("SCRIPT_NAME", ..#APPNAME)
33
- do dict."__setitem__"("REQUEST_METHOD", %request.Method)
34
- do dict."__setitem__"("CONTENT_TYPE", %request.ContentType)
35
- do dict."__setitem__"("CHARSET", %request.CharSet)
36
- Set app=$$getapp^%SYS.cspServer(%request.URL,.path,.match,.updatedurl)
37
- do dict."__setitem__"("PATH_INFO", $extract(updatedurl,$length(path),*))
30
+ #; Ensure that we honor the requested HTTP_ACCEPT_LANGUAGE
31
+ Set %response.Domain = ..#DOMAIN
32
+ Do %response.MatchLanguage()
33
+
34
+ #; Record if device re-direction is already active
35
+ Set tRedirected=##class(%Library.Device).ReDirectIO()
36
+
37
+ #; Record the redirect routine
38
+ Set tRedirectRoutine=$System.Device.GetMnemonicRoutine()
39
+
40
+ if ..#DEVMODE {
41
+ #; Not so pretty but help to for reload the WSGI application
42
+ do outputError^%SYS.cspServer2("","","","")
43
+ }
44
+ else {
45
+ #; Now switch to using THIS routine for device redirection
46
+ Use $io::("^%SYS.cspServer2")
38
47
 
39
- // to extract the query string
48
+ #; Switch device redirection on (may already be on but thats ok)
49
+ Do ##class(%Library.Device).ReDirectIO(1)
50
+ }
40
51
 
41
- return dict
42
- }
52
+ #; Ensure that the application is defined (security check)
53
+ If $$$GetSecurityApplicationsDispatchClass(%request.AppData)="" {
54
+
55
+ #; Report not authorized
56
+ Set tSC=..Http403()
57
+
58
+ #; Done
59
+ Quit
60
+ }
61
+
62
+ #; GgiEnvs are not defined in the CSP shell
63
+ Set tURL=$Get(%request.CgiEnvs("CSPLIB"))
64
+ If tURL="" Set tURL=%request.URL
65
+
66
+ #; Do an access check
67
+ Set tSC=..AccessCheck(.tAuthorized)
68
+ If $$$ISERR(tSC) Quit
43
69
 
44
- /// Implement a singleton pattern to get the python app
45
- ClassMethod GetPyhonApp() As %SYS.Python
46
- {
47
- if ..#CLASSPATHS '="" {
48
- set sys = ##class(%SYS.Python).Import("sys")
49
- set delimiter = $s($system.Version.GetOS()="Windows":";",1:":")
50
- set extraClasspaths = $tr(..#CLASSPATHS,delimiter,"|")
51
- for i=1:1:$l(extraClasspaths,"|") {
52
- set onePath = $p(extraClasspaths,"|",i)
53
- set onePath = ##class(%File).NormalizeDirectory(onePath)
54
- if onePath?1"$$IRISHOME"1P.E set onePath = $e($system.Util.InstallDirectory(),1,*-1)_$e(onePath,11,*)
55
- if onePath'="" do sys.path.append(onePath)
70
+ If tAuthorized=0 {
71
+
72
+ #; Don't want the session token
73
+ Set %response.OutputSessionToken=0
74
+
75
+ #; Set the Http Status
76
+ Set %response.Status=..#HTTP403FORBIDDEN
77
+
78
+ #; Done
79
+ Quit
56
80
  }
81
+
82
+ #; Extract the match url from the application name
83
+ Set tMatchUrl = "/"_$Extract(tURL,$Length(%request.Application)+1,*)
84
+
85
+ #; Dispatch the request
86
+ Set tSC=..DispatchRequest(tMatchUrl,%request.Method)
87
+
88
+ } Catch (e) {
89
+ Set tSC=e.AsStatus()
90
+ }
91
+
92
+ If $$$ISERR(tSC) {
93
+
94
+ #; Don't want the session token
95
+ Set %response.OutputSessionToken=0
96
+
97
+ Do ..Http500(##class(%Exception.StatusException).CreateFromStatus(tSC))
98
+ }
99
+
100
+ #; Ensure that at least something is written out as the body
101
+ #; This will trigger the device redirect capture and force headers to be written
102
+ #; (if not already done)
103
+ Write ""
104
+
105
+ #; Reset redirect device if necessary
106
+ If tRedirected {
107
+
108
+ #; Use the original redirected routine
109
+ Use $io::("^"_tRedirectRoutine)
110
+
111
+ #; Switch device redirection on
112
+ Do ##class(%Library.Device).ReDirectIO(1)
57
113
  }
114
+
115
+ #; Any errors should have been caught and reported
116
+ Quit $$$OK
117
+ }
58
118
 
59
- //import module
60
- set module = ##class(%SYS.Python).Import(..#MODULENAME)
119
+ ClassMethod OnPreDispatch(
120
+ pUrl As %String,
121
+ pMethod As %String,
122
+ ByRef pContinue As %Boolean) As %Status
123
+ {
124
+ Set path = ..#CLASSPATHS
125
+ Set appName = ..#APPNAME
126
+ Set module = ..#MODULENAME
127
+ Set devmode = ..#DEVMODE
128
+ Set pContinue = 1
129
+ Do ..DispatchREST(pUrl, path, appName, module, devmode)
130
+ Quit $$$OK
131
+ }
61
132
 
62
- //set builtins
63
- set builtins = ##class(%SYS.Python).Import("builtins")
133
+ ClassMethod DispatchREST(
134
+ PathInfo As %String,
135
+ appPath As %String,
136
+ appName As %String,
137
+ module As %String,
138
+ devmode As %Boolean = 1) As %Status
139
+ {
140
+ Set builtins = ##CLASS(%SYS.Python).Builtins()
141
+ Set interface = ##CLASS(%SYS.Python).Import("grongier.pex.wsgi.handlers")
142
+ Set rawformdata = ""
143
+ Set environ = builtins.dict()
144
+ Set key = %request.NextCgiEnv("")
64
145
 
65
- //set app
66
- set application = builtins.getattr(module, ..#APPNAME)
146
+ // Let's check if the WSGI application has been loaded or not for this session.
147
+
148
+ If (($DATA(%session.Data("application")) && $ISOBJECT(%session.Data("application"))) && 'devmode) {
149
+ Set application = %session.Data("Application")
150
+ }
151
+ Else{
67
152
 
68
- Return application
69
- }
153
+ Set application = ..GetPythonClass(appName, module, appPath)
154
+ If application = "" {
155
+ throw ##class(%Exception.General).%New("Error loading WSGI application: "_module_"."_appName_" from "_appPath)
156
+ }
157
+ Else {
158
+ Set %session.Data("Application") = application
159
+ }
160
+ }
70
161
 
71
- ClassMethod Page(skipheader As %Boolean = 1) As %Status [ Internal, ServerOnly = 1 ]
72
- {
73
- Try {
74
-
75
- //set environ
76
- set environ = ..GetEnviron()
162
+ // Editing some CGI variables that may be incorrect in %request
163
+ // Also filling in environ with as many CGI variables as possible from %request
164
+ // WSGI states that all CGI variables are valid and should be included if possible
165
+ While (key'="") {
166
+ Set value = %request.GetCgiEnv(key)
167
+ If key = "PATH_INFO" {
168
+ Set app=$$getapp^%SYS.cspServer(%request.URL,.path,.match,.updatedurl)
169
+ Set value = $EXTRACT(updatedurl,$LENGTH(path),*)
170
+ }
171
+ If key = "SCRIPT_NAME" {
172
+ //%request will sometimes have Script_name include Path_info
173
+ Set value = $PIECE(%request.Application, "/",1,*-1)
174
+ }
175
+ Do environ."__setitem__"(key,value)
176
+ Set key = %request.NextCgiEnv(key)
177
+ }
77
178
 
78
- //import sys
79
- set sys = ##class(%SYS.Python).Import("sys")
179
+ //Have to set up a correct wsgi.input stream from %request
180
+ Set stream = %request.Content
181
+
182
+ Set contentType = %request.ContentType
183
+ Set contentLength = 0
80
184
 
81
- //set stdin
82
- set builtins = ##class(%SYS.Python).Import("builtins")
83
- set ba = builtins.bytearray()
84
-
85
- while %request.Content.AtEnd = 0 {
86
- do ba.extend(##class(%SYS.Python).Bytes(%request.Content.Read()))
87
- }
88
- //set handler
89
- set handler = ##class(%SYS.Python).Import("grongier.pex.wsgi.handlers").IrisHandler(ba, sys.stdout, sys.stderr,environ)
185
+ If contentType = "application/x-www-form-urlencoded" {
186
+ Set formdict = builtins.dict()
187
+ Set key = $ORDER(%request.Data(""))
188
+ While (key'="") {
189
+ Set value = $GET(%request.Data(key,1))
190
+ Do formdict."__setitem__"(key,value)
191
+ Set key = $ORDER(%request.Data(key))
192
+ }
193
+ Do environ."__setitem__"("formdata", formdict)
194
+ }
195
+ ElseIf contentType = "multipart/form-data" {
196
+ Set boundary = $PIECE(%request.GetCgiEnv("CONTENT_TYPE"), "=",2)
197
+ Set stream = ##CLASS(%CSP.BinaryStream).%New()
90
198
 
91
- // get a singleton app
92
- set application = ..GetPyhonApp()
199
+ Do stream.Write($CHAR(13,10))
93
200
 
94
- //run app
95
- do handler.run(application)
201
+ //Get the Form Data values
96
202
 
97
- }
98
- Catch ex {
99
- return ex.AsStatus()
100
- }
203
+ Set key = $ORDER(%request.Data(""))
204
+ While (key'="") {
205
+ Do stream.Write("--")
206
+ Do stream.Write(boundary)
207
+ Do stream.Write($CHAR(13,10))
208
+ Set value = $GET(%request.Data(key,1))
209
+ Do stream.Write("Content-Disposition: form-data; name=")
210
+ Do stream.Write(""""_key_"""")
211
+ Do stream.Write($CHAR(13,10,13,10))
212
+ Do stream.Write(value)
213
+ Do stream.Write($CHAR(13,10))
214
+ Set key = $ORDER(%request.Data(key))
215
+ }
216
+
217
+ //Now get the possible MIME data streams
218
+ Set key = %request.NextMimeData("")
219
+ While key'="" {
220
+ Set numMimeStreams = %request.CountMimeData(key)
221
+ Set index = %request.NextMimeDataIndex(key, "")
222
+ Do stream.Write("--")
223
+ Do stream.Write(boundary)
224
+ Do stream.Write($CHAR(13,10))
225
+ If numMimeStreams > 1 {
226
+ //I need to create a boundary for a nested multipart content type
227
+ Set internalboundary = "--"
228
+ For i = 1 : 1 : 7 {
229
+ Set internalboundary = internalboundary _ $RANDOM(10)
230
+ }
231
+ While index '= "" {
232
+ Set mimestream = %request.GetMimeData(key, index)
233
+ Set headers = mimestream.Headers
234
+ Do stream.Write("--")
235
+ Do stream.Write(internalboundary)
236
+ Do stream.Write($CHAR(13,10))
237
+ Do stream.Write(headers)
238
+ Do stream.Write($CHAR(13,10,13,10))
239
+ Set sc = stream.CopyFrom(mimestream)
240
+ //TODO error handling
241
+ Do stream.Write($CHAR(13,10))
242
+ Set index = %request.NextMimeDataIndex(key, index)
243
+ }
244
+ Do stream.Write("--")
245
+ Do stream.Write(internalboundary)
246
+ Do stream.Write("--")
247
+ }
248
+ Else {
249
+ Set mimestream = %request.GetMimeData(key, index)
250
+ Set headers = mimestream.Headers
251
+ Do stream.Write(headers)
252
+ Do stream.Write($CHAR(13,10,13,10))
253
+ Set sc = stream.CopyFrom(mimestream)
254
+ //TODO error handling
255
+ Do stream.Write($CHAR(13,10))
256
+ }
257
+ Set key = %request.NextMimeData(key)
258
+ }
259
+ Do stream.Write("--")
260
+ Do stream.Write(boundary)
261
+ Do stream.Write("--")
262
+ Do stream.Rewind()
263
+ }
264
+
265
+
266
+ Try {
267
+ Do interface."make_request"(environ, stream, application, appPath)
268
+ }
269
+ Catch exception {
270
+ throw exception
271
+ }
272
+ Quit $$$OK
273
+ }
274
+
275
+ ClassMethod GetPythonClass(
276
+ pClassname As %String,
277
+ pModule As %String,
278
+ pClasspath As %String) As %SYS.Python
279
+ {
280
+ Try {
281
+ If pClasspath '="" {
282
+ set sys = ##class(%SYS.Python).Import("sys")
283
+
284
+ for i=0:1:(sys.path."__len__"()-1) {
285
+ Try {
286
+ if sys.path."__getitem__"(i) = pClasspath {
287
+ do sys.path."__delitem__"(i)
288
+ }
289
+ }
290
+ Catch ex {
291
+ // do nothing
292
+ }
293
+
294
+ }
295
+ do sys.path.insert(0, pClasspath)
296
+ }
101
297
 
102
- quit $$$OK
298
+ Set importlib = ##class(%SYS.Python).Import("importlib")
299
+ Set builtins = ##class(%SYS.Python).Import("builtins")
300
+ Set module = importlib."import_module"(pModule)
301
+ Set class = builtins.getattr(module, pClassname)
302
+ }
303
+ Catch ex {
304
+ throw ##class(%Exception.General).%New("Error loading WSGI application: "_pModule_"."_pClassname_" from "_pClasspath)
305
+ }
306
+
307
+ Quit class
103
308
  }
104
309
 
105
310
  }
@@ -1,51 +1,104 @@
1
- from wsgiref.handlers import BaseHandler
2
- import io
1
+ import os, sys, importlib, urllib.parse
2
+ from io import BytesIO
3
+
4
+ __ospath = os.getcwd()
5
+
3
6
  import iris
4
7
 
5
- class IrisHandler(BaseHandler):
6
- """Handler that's just initialized with streams, environment, etc.
8
+ os.chdir(__ospath)
9
+
10
+ enc, esc = sys.getfilesystemencoding(), 'surrogateescape'
11
+
12
+ rest_service = iris.cls('%REST.Impl')
13
+
14
+ def get_from_module(app_path, app_module, app_name):
15
+
16
+ # Add the path to the application
17
+ if (app_path not in sys.path) :
18
+ sys.path.append(app_path)
19
+
20
+ # retrieve the application
21
+ return getattr(importlib.import_module(app_module), app_name)
22
+
23
+ # Changes the current working directory to the manager directory of the instance.
24
+ def goto_manager_dir():
25
+ iris.system.Process.CurrentDirectory(iris.system.Util.ManagerDirectory())
26
+
27
+ def unicode_to_wsgi(u):
28
+ # Convert an environment variable to a WSGI "bytes-as-unicode" string
29
+ return u.encode(enc, esc).decode('iso-8859-1')
30
+
31
+ def wsgi_to_bytes(s):
32
+ return s.encode('iso-8859-1')
33
+
34
+ def write(chunk):
35
+ rest_service._WriteResponse(chunk)
36
+
37
+ def start_response(status, response_headers, exc_info=None):
38
+ '''WSGI start_response callable'''
39
+ if exc_info:
40
+ try:
41
+ raise exc_info[1].with_traceback(exc_info[2])
42
+ finally:
43
+ exc_info = None
7
44
 
8
- This handler subclass is intended for synchronous HTTP/1.0 origin servers,
9
- and handles sending the entire response output, given the correct inputs.
45
+ rest_service._SetStatusCode(status)
46
+ for tuple in response_headers:
47
+ rest_service._SetHeader(tuple[0], tuple[1])
48
+ return write
10
49
 
11
- Usage::
12
50
 
13
- handler = SimpleHandler(
14
- inp,out,err,env, multithread=False, multiprocess=True
15
- )
16
- handler.run(app)"""
51
+ # Make request to application
52
+ def make_request(environ, stream, application, path):
17
53
 
18
- server_software = "IrisWSGI/0.1"
19
- wsgi_file_wrapper = None
54
+ # Change the working directory for logging purposes
55
+ goto_manager_dir()
20
56
 
21
- def __init__(self,stdin,stdout,stderr,environ,
22
- multithread=True, multiprocess=False
23
- ):
24
- self.stdin = stdin
25
- self.stdout = stdout
26
- self.stderr = stderr
27
- self.base_env = environ
28
- self.wsgi_multithread = multithread
29
- self.wsgi_multiprocess = multiprocess
57
+ error_log_file = open('WSGI.log', 'a+')
58
+
59
+ # We want the working directory to be the app's directory
60
+ if (not path.endswith(os.path.sep)):
61
+ path = path + os.path.sep
30
62
 
31
- def get_stdin(self):
32
- if not self.stdin:
33
- return None
34
- else:
35
- self.environ["wsgi.input"] = io.BytesIO(self.stdin)
36
- self.environ["CONTENT_LENGTH"] = str(len(self.stdin))
37
- return io.BytesIO(self.stdin)
63
+ #iris.system.Process.CurrentDirectory(path)
64
+
65
+ # Set up the body of the request
66
+ if stream != '':
67
+ bytestream = stream
68
+ elif (environ['CONTENT_TYPE'] == 'application/x-www-form-urlencoded'):
69
+ bytestream = BytesIO()
70
+ part = urllib.parse.urlencode(environ['formdata'])
71
+ bytestream.write(part.encode('utf-8'))
72
+ bytestream.seek(0)
73
+ else:
74
+ bytestream = BytesIO(b'')
38
75
 
76
+ #for k,v in os.environ.items():
77
+ #environ[k] = unicode_to_wsgi(v)
78
+ environ['wsgi.input'] = bytestream
79
+ environ['wsgi.errors'] = error_log_file
80
+ environ['wsgi.version'] = (1, 0)
81
+ environ['wsgi.multithread'] = False
82
+ environ['wsgi.multiprocess'] = True
83
+ environ['wsgi.run_once'] = True
39
84
 
40
- def get_stderr(self):
41
- return self.stderr
42
85
 
43
- def add_cgi_vars(self):
44
- self.environ.update(self.base_env)
86
+ if environ.get('HTTPS', 'off') in ('on', '1'):
87
+ environ['wsgi.url_scheme'] = 'https'
88
+ else:
89
+ environ['wsgi.url_scheme'] = 'http'
90
+
91
+ # Calling WSGI application
92
+ response = application(environ, start_response)
45
93
 
46
- def _write(self,data):
47
- iris.cls('Grongier.Service.WSGI').write(data)
94
+ error_log_file.close()
48
95
 
49
- def _flush(self):
50
- self.stdout.flush()
51
- self._flush = self.stdout.flush
96
+ try:
97
+ for data in response:
98
+ if data:
99
+ # (REST.Impl).Write() needs a utf-8 string
100
+ write(data.decode('utf-8'))
101
+ write(b'')
102
+ finally:
103
+ if hasattr(response, 'close'):
104
+ response.close()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iris_pex_embedded_python
3
- Version: 2.3.23b1
3
+ Version: 2.3.23b2
4
4
  Summary: Iris Interoperability based on Embedded Python
5
5
  Author-email: grongier <guillaume.rongier@intersystems.com>
6
6
  License: MIT License
@@ -18,7 +18,7 @@ grongier/cls/Grongier/PEX/PrivateSession/Message/Ack.cls,sha256=WbBn7pWj5mzruVfL
18
18
  grongier/cls/Grongier/PEX/PrivateSession/Message/Poll.cls,sha256=2lj-e20AH7RR8UgGJaldrk-1kd8WjQJNPiH-duds_4A,987
19
19
  grongier/cls/Grongier/PEX/PrivateSession/Message/Start.cls,sha256=DAtq4DyRqFq2_4Isa0cZjjwuAzdHjsQu8wMppK4myzs,994
20
20
  grongier/cls/Grongier/PEX/PrivateSession/Message/Stop.cls,sha256=ofVKjrN6UPFasalrjPFWYNwlJ5IBlAE62IH8_U07c0g,1435
21
- grongier/cls/Grongier/Service/WSGI.cls,sha256=X_yM4oxTBOfIOzsCGnvutIuqCAfg7hd6Oqfl-Kq3TjM,2979
21
+ grongier/cls/Grongier/Service/WSGI.cls,sha256=2KrnsATyoarrN6un-2sJwNK-ANw36Waa8GgFx97XQKA,10598
22
22
  grongier/pex/__init__.py,sha256=nvcmRCxLy-lpL5GzlCKrmsSK8LF8Q0aKddx6ib8U50E,1166
23
23
  grongier/pex/__main__.py,sha256=ebEYPDOBKiXOlmdI4onpQLzfBKU4wyfijYyquA5dWV4,107
24
24
  grongier/pex/_business_host.py,sha256=G4-eWlQzWMvjaHauISfSoogPsfQYJavmRi563ak6FS8,20858
@@ -35,7 +35,7 @@ grongier/pex/_pickle_message.py,sha256=noKfc2VkXufV3fqjKvNHN_oANQ1YN9ffCaSV0XSTA
35
35
  grongier/pex/_private_session_duplex.py,sha256=Qj_xzwwFnFVwi_Sl7Q7nKk4zmL6UC8iqBAuwnz7mVX8,5033
36
36
  grongier/pex/_private_session_process.py,sha256=_2r_csWcVRLmIUt4O0Y1Hg1FcX6A08lt9DvALQhwu8s,1722
37
37
  grongier/pex/_utils.py,sha256=GjHT5WolQAoeYkhHP3a0uDBlRzPIkyGG_bi-TwrMdjI,15877
38
- grongier/pex/wsgi/handlers.py,sha256=t9i3bNld3bewWWOOm5vrDHa1Dcxvp-SB5cHgPUFrggQ,1417
38
+ grongier/pex/wsgi/handlers.py,sha256=NrFLo_YbAh-x_PlWhAiWkQnUUN2Ss9HoEm63dDWCBpQ,2947
39
39
  intersystems_iris/_BufferReader.py,sha256=BXjHQs-sclAnvW9mvdlIrtku9m2Jf67Rc5rsZll7a5g,299
40
40
  intersystems_iris/_BufferWriter.py,sha256=i2BKM99J8pB5fGn-Gjdo4vcwXPEZQymsLEQd69nJrhs,1337
41
41
  intersystems_iris/_ConnectionInformation.py,sha256=Xr6sOPy3uKFyOG05hTmutDHTNjHDhCnCVwH0TTNEwBE,1896
@@ -105,9 +105,9 @@ iris/iris_ipm.py,sha256=Q0jcNItjywlqOPZr0hgdTFSeLPNEmB-tcICOI_cXnaY,790
105
105
  iris/iris_ipm.pyi,sha256=j7CNUZcjeDu5sgeWUZJO_Qi4vQmHh6aD-jPWv8OdoUs,374
106
106
  irisnative/_IRISNative.py,sha256=HQ4nBhc8t8_5OtxdMG-kx1aa-T1znf2I8obZOPLOPzg,665
107
107
  irisnative/__init__.py,sha256=6YmvBLQSURsCPKaNg7LK-xpo4ipDjrlhKuwdfdNb3Kg,341
108
- iris_pex_embedded_python-2.3.23b1.dist-info/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
109
- iris_pex_embedded_python-2.3.23b1.dist-info/METADATA,sha256=cxfW_t8_wmtYVXOfaxJjJUuC5eL_EFwhEmji6lP_ySI,49682
110
- iris_pex_embedded_python-2.3.23b1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
111
- iris_pex_embedded_python-2.3.23b1.dist-info/entry_points.txt,sha256=atkAtHoIuwXcZ0jl5gwof0l__ru_lt8WhVYk6HxYf70,47
112
- iris_pex_embedded_python-2.3.23b1.dist-info/top_level.txt,sha256=Tl4ZHgeNefaZW2Oug30vSldhD-tWzixsIfzASBrZ9ps,43
113
- iris_pex_embedded_python-2.3.23b1.dist-info/RECORD,,
108
+ iris_pex_embedded_python-2.3.23b2.dist-info/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
109
+ iris_pex_embedded_python-2.3.23b2.dist-info/METADATA,sha256=i4jd-lv7DrBSOBzsc01noZTT-lszckwRwEG4DFy312Y,49682
110
+ iris_pex_embedded_python-2.3.23b2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
111
+ iris_pex_embedded_python-2.3.23b2.dist-info/entry_points.txt,sha256=atkAtHoIuwXcZ0jl5gwof0l__ru_lt8WhVYk6HxYf70,47
112
+ iris_pex_embedded_python-2.3.23b2.dist-info/top_level.txt,sha256=Tl4ZHgeNefaZW2Oug30vSldhD-tWzixsIfzASBrZ9ps,43
113
+ iris_pex_embedded_python-2.3.23b2.dist-info/RECORD,,