Port py-poster to Python 3 (#12363)
* Port py-poster to Python 3 * Forgot the patch
This commit is contained in:
parent
e69456bde2
commit
c5c1d1db43
@ -15,3 +15,8 @@ class PyPoster(PythonPackage):
|
||||
version('0.8.1', '2db12704538781fbaa7e63f1505d6fc8')
|
||||
|
||||
depends_on('py-setuptools', type='build')
|
||||
|
||||
# https://bitbucket.org/chrisatlee/poster/issues/24/not-working-with-python3
|
||||
# https://bitbucket.org/chrisatlee/poster/issues/25/poster-connot-work-in-python35
|
||||
# Patch created using 2to3
|
||||
patch('python3.patch', when='^python@3:')
|
||||
|
441
var/spack/repos/builtin/packages/py-poster/python3.patch
Normal file
441
var/spack/repos/builtin/packages/py-poster/python3.patch
Normal file
@ -0,0 +1,441 @@
|
||||
diff -Naur a/poster/encode.py b/poster/encode.py
|
||||
--- a/poster/encode.py 2010-12-02 23:25:52.000000000 -0600
|
||||
+++ b/poster/encode.py 2019-08-09 16:24:58.000000000 -0500
|
||||
@@ -21,7 +21,7 @@
|
||||
bits = random.getrandbits(160)
|
||||
return sha.new(str(bits)).hexdigest()
|
||||
|
||||
-import urllib, re, os, mimetypes
|
||||
+import urllib.request, urllib.parse, urllib.error, re, os, mimetypes
|
||||
try:
|
||||
from email.header import Header
|
||||
except ImportError:
|
||||
@@ -34,16 +34,16 @@
|
||||
if data is None:
|
||||
return None
|
||||
|
||||
- if isinstance(data, unicode):
|
||||
+ if isinstance(data, str):
|
||||
data = data.encode("utf-8")
|
||||
- return urllib.quote_plus(data)
|
||||
+ return urllib.parse.quote_plus(data)
|
||||
|
||||
def _strify(s):
|
||||
"""If s is a unicode string, encode it to UTF-8 and return the results,
|
||||
otherwise return str(s), or None if s is None"""
|
||||
if s is None:
|
||||
return None
|
||||
- if isinstance(s, unicode):
|
||||
+ if isinstance(s, str):
|
||||
return s.encode("utf-8")
|
||||
return str(s)
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
if filename is None:
|
||||
self.filename = None
|
||||
else:
|
||||
- if isinstance(filename, unicode):
|
||||
+ if isinstance(filename, str):
|
||||
# Encode with XML entities
|
||||
self.filename = filename.encode("ascii", "xmlcharrefreplace")
|
||||
else:
|
||||
@@ -153,7 +153,7 @@
|
||||
MultipartParam object names must match the given names in the
|
||||
name,value pairs or mapping, if applicable."""
|
||||
if hasattr(params, 'items'):
|
||||
- params = params.items()
|
||||
+ params = list(params.items())
|
||||
|
||||
retval = []
|
||||
for item in params:
|
||||
@@ -306,7 +306,7 @@
|
||||
"""Returns a dictionary with Content-Type and Content-Length headers
|
||||
for the multipart/form-data encoding of ``params``."""
|
||||
headers = {}
|
||||
- boundary = urllib.quote_plus(boundary)
|
||||
+ boundary = urllib.parse.quote_plus(boundary)
|
||||
headers['Content-Type'] = "multipart/form-data; boundary=%s" % boundary
|
||||
headers['Content-Length'] = str(get_body_size(params, boundary))
|
||||
return headers
|
||||
@@ -326,12 +326,12 @@
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
- def next(self):
|
||||
+ def __next__(self):
|
||||
"""generator function to yield multipart/form-data representation
|
||||
of parameters"""
|
||||
if self.param_iter is not None:
|
||||
try:
|
||||
- block = self.param_iter.next()
|
||||
+ block = next(self.param_iter)
|
||||
self.current += len(block)
|
||||
if self.cb:
|
||||
self.cb(self.p, self.current, self.total)
|
||||
@@ -355,7 +355,7 @@
|
||||
self.p = self.params[self.i]
|
||||
self.param_iter = self.p.iter_encode(self.boundary)
|
||||
self.i += 1
|
||||
- return self.next()
|
||||
+ return next(self)
|
||||
|
||||
def reset(self):
|
||||
self.i = 0
|
||||
@@ -406,7 +406,7 @@
|
||||
if boundary is None:
|
||||
boundary = gen_boundary()
|
||||
else:
|
||||
- boundary = urllib.quote_plus(boundary)
|
||||
+ boundary = urllib.parse.quote_plus(boundary)
|
||||
|
||||
headers = get_headers(params, boundary)
|
||||
params = MultipartParam.from_params(params)
|
||||
diff -Naur a/poster/streaminghttp.py b/poster/streaminghttp.py
|
||||
--- a/poster/streaminghttp.py 2011-04-16 08:24:30.000000000 -0500
|
||||
+++ b/poster/streaminghttp.py 2019-08-09 16:33:05.000000000 -0500
|
||||
@@ -1,6 +1,6 @@
|
||||
"""Streaming HTTP uploads module.
|
||||
|
||||
-This module extends the standard httplib and urllib2 objects so that
|
||||
+This module extends the standard http.client and urllib2 objects so that
|
||||
iterable objects can be used in the body of HTTP requests.
|
||||
|
||||
In most cases all one should have to do is call :func:`register_openers()`
|
||||
@@ -26,13 +26,13 @@
|
||||
... {'Content-Length': str(len(s))})
|
||||
"""
|
||||
|
||||
-import httplib, urllib2, socket
|
||||
-from httplib import NotConnected
|
||||
+import http.client, urllib.request, urllib.error, urllib.parse, socket
|
||||
+from http.client import NotConnected
|
||||
|
||||
__all__ = ['StreamingHTTPConnection', 'StreamingHTTPRedirectHandler',
|
||||
'StreamingHTTPHandler', 'register_openers']
|
||||
|
||||
-if hasattr(httplib, 'HTTPS'):
|
||||
+if hasattr(http.client, 'HTTPS'):
|
||||
__all__.extend(['StreamingHTTPSHandler', 'StreamingHTTPSConnection'])
|
||||
|
||||
class _StreamingHTTPMixin:
|
||||
@@ -45,7 +45,7 @@
|
||||
a .read() method, or an iterable object that supports a .next()
|
||||
method.
|
||||
"""
|
||||
- # Based on python 2.6's httplib.HTTPConnection.send()
|
||||
+ # Based on python 2.6's http.client.HTTPConnection.send()
|
||||
if self.sock is None:
|
||||
if self.auto_open:
|
||||
self.connect()
|
||||
@@ -58,14 +58,14 @@
|
||||
# NOTE: we DO propagate the error, though, because we cannot simply
|
||||
# ignore the error... the caller will know if they can retry.
|
||||
if self.debuglevel > 0:
|
||||
- print "send:", repr(value)
|
||||
+ print("send:", repr(value))
|
||||
try:
|
||||
blocksize = 8192
|
||||
if hasattr(value, 'read') :
|
||||
if hasattr(value, 'seek'):
|
||||
value.seek(0)
|
||||
if self.debuglevel > 0:
|
||||
- print "sendIng a read()able"
|
||||
+ print("sendIng a read()able")
|
||||
data = value.read(blocksize)
|
||||
while data:
|
||||
self.sock.sendall(data)
|
||||
@@ -74,21 +74,21 @@
|
||||
if hasattr(value, 'reset'):
|
||||
value.reset()
|
||||
if self.debuglevel > 0:
|
||||
- print "sendIng an iterable"
|
||||
+ print("sendIng an iterable")
|
||||
for data in value:
|
||||
self.sock.sendall(data)
|
||||
else:
|
||||
self.sock.sendall(value)
|
||||
- except socket.error, v:
|
||||
+ except socket.error as v:
|
||||
if v[0] == 32: # Broken pipe
|
||||
self.close()
|
||||
raise
|
||||
|
||||
-class StreamingHTTPConnection(_StreamingHTTPMixin, httplib.HTTPConnection):
|
||||
- """Subclass of `httplib.HTTPConnection` that overrides the `send()` method
|
||||
+class StreamingHTTPConnection(_StreamingHTTPMixin, http.client.HTTPConnection):
|
||||
+ """Subclass of `http.client.HTTPConnection` that overrides the `send()` method
|
||||
to support iterable body objects"""
|
||||
|
||||
-class StreamingHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
|
||||
+class StreamingHTTPRedirectHandler(urllib.request.HTTPRedirectHandler):
|
||||
"""Subclass of `urllib2.HTTPRedirectHandler` that overrides the
|
||||
`redirect_request` method to properly handle redirected POST requests
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
the new resource, but the body of the original request is not preserved.
|
||||
"""
|
||||
|
||||
- handler_order = urllib2.HTTPRedirectHandler.handler_order - 1
|
||||
+ handler_order = urllib.request.HTTPRedirectHandler.handler_order - 1
|
||||
|
||||
# From python2.6 urllib2's HTTPRedirectHandler
|
||||
def redirect_request(self, req, fp, code, msg, headers, newurl):
|
||||
@@ -120,22 +120,22 @@
|
||||
# do the same.
|
||||
# be conciliant with URIs containing a space
|
||||
newurl = newurl.replace(' ', '%20')
|
||||
- newheaders = dict((k, v) for k, v in req.headers.items()
|
||||
+ newheaders = dict((k, v) for k, v in list(req.headers.items())
|
||||
if k.lower() not in (
|
||||
"content-length", "content-type")
|
||||
)
|
||||
- return urllib2.Request(newurl,
|
||||
+ return urllib.request.Request(newurl,
|
||||
headers=newheaders,
|
||||
origin_req_host=req.get_origin_req_host(),
|
||||
unverifiable=True)
|
||||
else:
|
||||
- raise urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp)
|
||||
+ raise urllib.error.HTTPError(req.get_full_url(), code, msg, headers, fp)
|
||||
|
||||
-class StreamingHTTPHandler(urllib2.HTTPHandler):
|
||||
+class StreamingHTTPHandler(urllib.request.HTTPHandler):
|
||||
"""Subclass of `urllib2.HTTPHandler` that uses
|
||||
StreamingHTTPConnection as its http connection class."""
|
||||
|
||||
- handler_order = urllib2.HTTPHandler.handler_order - 1
|
||||
+ handler_order = urllib.request.HTTPHandler.handler_order - 1
|
||||
|
||||
def http_open(self, req):
|
||||
"""Open a StreamingHTTPConnection for the given request"""
|
||||
@@ -152,19 +152,19 @@
|
||||
if not req.has_header('Content-length'):
|
||||
raise ValueError(
|
||||
"No Content-Length specified for iterable body")
|
||||
- return urllib2.HTTPHandler.do_request_(self, req)
|
||||
+ return urllib.request.HTTPHandler.do_request_(self, req)
|
||||
|
||||
-if hasattr(httplib, 'HTTPS'):
|
||||
+if hasattr(http.client, 'HTTPS'):
|
||||
class StreamingHTTPSConnection(_StreamingHTTPMixin,
|
||||
- httplib.HTTPSConnection):
|
||||
- """Subclass of `httplib.HTTSConnection` that overrides the `send()`
|
||||
+ http.client.HTTPSConnection):
|
||||
+ """Subclass of `http.client.HTTSConnection` that overrides the `send()`
|
||||
method to support iterable body objects"""
|
||||
|
||||
- class StreamingHTTPSHandler(urllib2.HTTPSHandler):
|
||||
+ class StreamingHTTPSHandler(urllib.request.HTTPSHandler):
|
||||
"""Subclass of `urllib2.HTTPSHandler` that uses
|
||||
StreamingHTTPSConnection as its http connection class."""
|
||||
|
||||
- handler_order = urllib2.HTTPSHandler.handler_order - 1
|
||||
+ handler_order = urllib.request.HTTPSHandler.handler_order - 1
|
||||
|
||||
def https_open(self, req):
|
||||
return self.do_open(StreamingHTTPSConnection, req)
|
||||
@@ -178,22 +178,22 @@
|
||||
if not req.has_header('Content-length'):
|
||||
raise ValueError(
|
||||
"No Content-Length specified for iterable body")
|
||||
- return urllib2.HTTPSHandler.do_request_(self, req)
|
||||
+ return urllib.request.HTTPSHandler.do_request_(self, req)
|
||||
|
||||
|
||||
def get_handlers():
|
||||
handlers = [StreamingHTTPHandler, StreamingHTTPRedirectHandler]
|
||||
- if hasattr(httplib, "HTTPS"):
|
||||
+ if hasattr(http.client, "HTTPS"):
|
||||
handlers.append(StreamingHTTPSHandler)
|
||||
return handlers
|
||||
-
|
||||
+
|
||||
def register_openers():
|
||||
"""Register the streaming http handlers in the global urllib2 default
|
||||
opener object.
|
||||
|
||||
Returns the created OpenerDirector object."""
|
||||
- opener = urllib2.build_opener(*get_handlers())
|
||||
+ opener = urllib.request.build_opener(*get_handlers())
|
||||
|
||||
- urllib2.install_opener(opener)
|
||||
+ urllib.request.install_opener(opener)
|
||||
|
||||
return opener
|
||||
diff -Naur a/tests/test_encode.py b/tests/test_encode.py
|
||||
--- a/tests/test_encode.py 2010-12-02 23:35:48.000000000 -0600
|
||||
+++ b/tests/test_encode.py 2019-08-09 16:24:59.000000000 -0500
|
||||
@@ -2,7 +2,7 @@
|
||||
from unittest import TestCase
|
||||
import mimetypes
|
||||
import poster.encode
|
||||
-import StringIO
|
||||
+import io
|
||||
import sys
|
||||
|
||||
def unix2dos(s):
|
||||
@@ -47,7 +47,7 @@
|
||||
bar
|
||||
""")
|
||||
self.assertEqual(expected,
|
||||
- poster.encode.encode_string("XXXXXXXXX", u"\N{SNOWMAN}", "bar"))
|
||||
+ poster.encode.encode_string("XXXXXXXXX", "\N{SNOWMAN}", "bar"))
|
||||
|
||||
def test_quote_value(self):
|
||||
expected = unix2dos("""--XXXXXXXXX
|
||||
@@ -77,7 +77,7 @@
|
||||
b\xc3\xa1r
|
||||
""")
|
||||
self.assertEqual(expected,
|
||||
- poster.encode.encode_string("XXXXXXXXX", "foo", u"bár"))
|
||||
+ poster.encode.encode_string("XXXXXXXXX", "foo", "bár"))
|
||||
|
||||
|
||||
class TestEncode_File(TestCase):
|
||||
@@ -136,14 +136,14 @@
|
||||
""")
|
||||
self.assertEqual(expected,
|
||||
poster.encode.encode_file_header("XXXXXXXXX", "foo", 42,
|
||||
- u"\N{SNOWMAN}.txt"))
|
||||
+ "\N{SNOWMAN}.txt"))
|
||||
|
||||
class TestEncodeAndQuote(TestCase):
|
||||
def test(self):
|
||||
self.assertEqual("foo+bar", poster.encode.encode_and_quote("foo bar"))
|
||||
self.assertEqual("foo%40bar", poster.encode.encode_and_quote("foo@bar"))
|
||||
self.assertEqual("%28%C2%A9%29+2008",
|
||||
- poster.encode.encode_and_quote(u"(©) 2008"))
|
||||
+ poster.encode.encode_and_quote("(©) 2008"))
|
||||
|
||||
class TestMultiparam(TestCase):
|
||||
def test_from_params(self):
|
||||
@@ -231,7 +231,7 @@
|
||||
|
||||
|
||||
def test_stringio(self):
|
||||
- fp = StringIO.StringIO("file data")
|
||||
+ fp = io.StringIO("file data")
|
||||
params = poster.encode.MultipartParam.from_params( [("foo", fp)] )
|
||||
boundary = "XYZXYZXYZ"
|
||||
datagen, headers = poster.encode.multipart_encode(params, boundary)
|
||||
@@ -289,7 +289,7 @@
|
||||
self.assertEqual(encoded, expected)
|
||||
|
||||
def test_reset_file(self):
|
||||
- fp = StringIO.StringIO("file data")
|
||||
+ fp = io.StringIO("file data")
|
||||
params = poster.encode.MultipartParam.from_params( [("foo", fp)] )
|
||||
boundary = "XYZXYZXYZ"
|
||||
datagen, headers = poster.encode.multipart_encode(params, boundary)
|
||||
diff -Naur a/tests/test_server.py b/tests/test_server.py
|
||||
--- a/tests/test_server.py 2010-10-23 09:59:01.000000000 -0500
|
||||
+++ b/tests/test_server.py 2019-08-09 16:24:59.000000000 -0500
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
start_response("200 OK", [("Content-Type", "text/plain")])
|
||||
retval = ["Path: %s" % request.path]
|
||||
- keys = request.params.keys()
|
||||
+ keys = list(request.params.keys())
|
||||
keys.sort()
|
||||
for k in keys:
|
||||
v = request.params[k]
|
||||
diff -Naur a/tests/test_streaming.py b/tests/test_streaming.py
|
||||
--- a/tests/test_streaming.py 2010-10-23 10:03:20.000000000 -0500
|
||||
+++ b/tests/test_streaming.py 2019-08-09 16:33:39.000000000 -0500
|
||||
@@ -1,8 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from unittest import TestCase
|
||||
-import httplib
|
||||
+import http.client
|
||||
import poster
|
||||
-import urllib2, urllib
|
||||
+import urllib.request, urllib.error, urllib.parse, urllib
|
||||
import threading, time, signal
|
||||
import sys
|
||||
import os
|
||||
@@ -18,9 +18,9 @@
|
||||
if self.disable_https:
|
||||
# Disable HTTPS support for these tests to excercise the non-https code
|
||||
# HTTPS is tested in test_streaming_https.py
|
||||
- if hasattr(httplib, "HTTPS"):
|
||||
- self.https = getattr(httplib, "HTTPS")
|
||||
- delattr(httplib, "HTTPS")
|
||||
+ if hasattr(http.client, "HTTPS"):
|
||||
+ self.https = getattr(http.client, "HTTPS")
|
||||
+ delattr(http.client, "HTTPS")
|
||||
reload(poster.streaminghttp)
|
||||
else:
|
||||
self.https = None
|
||||
@@ -39,9 +39,9 @@
|
||||
for i in range(20):
|
||||
try:
|
||||
if self.disable_https:
|
||||
- urllib2.urlopen("http://localhost:%i/" % port).read()
|
||||
+ urllib.request.urlopen("http://localhost:%i/" % port).read()
|
||||
else:
|
||||
- urllib2.urlopen("https://localhost:%i/" % port).read()
|
||||
+ urllib.request.urlopen("https://localhost:%i/" % port).read()
|
||||
time.sleep(0.1)
|
||||
break
|
||||
except:
|
||||
@@ -50,7 +50,7 @@
|
||||
time.sleep(0.1)
|
||||
else:
|
||||
self.server_output.seek(0)
|
||||
- print self.server_output.read()
|
||||
+ print(self.server_output.read())
|
||||
raise OSError("Error starting server")
|
||||
except:
|
||||
if self.server_proc:
|
||||
@@ -60,20 +60,20 @@
|
||||
|
||||
def tearDown(self):
|
||||
if self.https:
|
||||
- setattr(httplib, "HTTPS", self.https)
|
||||
+ setattr(http.client, "HTTPS", self.https)
|
||||
|
||||
os.kill(self.server_proc.pid, signal.SIGINT)
|
||||
self.server_proc.wait()
|
||||
self.server_output.seek(0)
|
||||
- print self.server_output.read()
|
||||
+ print(self.server_output.read())
|
||||
|
||||
def _open(self, url, params=None, headers=None):
|
||||
try:
|
||||
if headers is None:
|
||||
headers = {}
|
||||
- req = urllib2.Request("http://localhost:%i/%s" % (port, url), params,
|
||||
+ req = urllib.request.Request("http://localhost:%i/%s" % (port, url), params,
|
||||
headers)
|
||||
- return urllib2.urlopen(req).read()
|
||||
+ return urllib.request.urlopen(req).read()
|
||||
except:
|
||||
self._opened = False
|
||||
raise
|
||||
@@ -129,12 +129,12 @@
|
||||
self.assertEqual(response, "Path: /foo")
|
||||
|
||||
def test_login(self):
|
||||
- password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
|
||||
+ password_manager = urllib.request.HTTPPasswordMgrWithDefaultRealm()
|
||||
password_manager.add_password(
|
||||
None, "http://localhost:%i/needs_auth" % port, 'john', 'secret'
|
||||
)
|
||||
|
||||
- auth_handler = urllib2.HTTPBasicAuthHandler(password_manager)
|
||||
+ auth_handler = urllib.request.HTTPBasicAuthHandler(password_manager)
|
||||
auth_handler.handler_order = 0
|
||||
|
||||
self.opener.add_handler(auth_handler)
|
||||
@@ -151,9 +151,9 @@
|
||||
try:
|
||||
if headers is None:
|
||||
headers = {}
|
||||
- req = urllib2.Request("https://localhost:%i/%s" % (port, url), params,
|
||||
+ req = urllib.request.Request("https://localhost:%i/%s" % (port, url), params,
|
||||
headers)
|
||||
- return urllib2.urlopen(req).read()
|
||||
+ return urllib.request.urlopen(req).read()
|
||||
except:
|
||||
self._opened = False
|
||||
raise
|
Loading…
Reference in New Issue
Block a user