[Asterisk-code-review] Add support code for Python 3 (starpy[master])
Matthew Fredrickson
asteriskteam at digium.com
Mon May 14 07:00:42 CDT 2018
Matthew Fredrickson has submitted this change and it was merged. ( https://gerrit.asterisk.org/8918 )
Change subject: Add support code for Python 3
......................................................................
Add support code for Python 3
Change-Id: I9ccd5a15be6e4129a5e0ce0bf1a5a4ff26998bac
---
M starpy/fastagi.py
M starpy/manager.py
M tox.ini
3 files changed, 40 insertions(+), 25 deletions(-)
Approvals:
Rodrigo Ramirez Norambuena: Looks good to me, but someone else must approve
Kevin Harwell: Looks good to me, but someone else must approve
Joshua Colp: Looks good to me, but someone else must approve
Matthew Fredrickson: Looks good to me, approved; Approved for Submit
diff --git a/starpy/fastagi.py b/starpy/fastagi.py
index 7a9b32e..7e26284 100644
--- a/starpy/fastagi.py
+++ b/starpy/fastagi.py
@@ -127,7 +127,7 @@
try:
key, value = line.split(':', 1)
value = value[1:].rstrip('\n').rstrip('\r')
- except ValueError, err:
+ except ValueError as err:
log.error("""Invalid variable line: %r""", line)
else:
self.variables[key.lower()] = value
@@ -135,7 +135,7 @@
else:
try:
df = self.pendingMessages.pop(0)
- except IndexError, err:
+ except IndexError as err:
log.warn("Line received without pending deferred: %r", line)
else:
if line.startswith('200'):
@@ -148,7 +148,7 @@
try:
errCode, line = line.split(' ', 1)
errCode = int(errCode)
- except ValueError, err:
+ except ValueError as err:
errCode = 500
df.errback(error.AGICommandFailure(errCode, line))
@@ -166,7 +166,7 @@
# result code may have trailing information...
try:
resultInt, line = result.split(' ', 1)
- except ValueError, err:
+ except ValueError as err:
resultInt = result
if resultInt.strip() == failure:
raise error.AGICommandFailure(FAILURE_CODE, result)
@@ -176,7 +176,7 @@
"""(Internal) Convert result to an integer value"""
try:
return int(result.strip())
- except ValueError, err:
+ except ValueError as err:
raise error.AGICommandFailure(FAILURE_CODE, result)
def secondResultItem(self, result):
@@ -188,7 +188,7 @@
try:
digits, timeout = resultLine.split(' ', 1)
return digits.strip(), True
- except ValueError, err:
+ except ValueError as err:
return resultLine.strip(), False
def dateAsSeconds(self, date):
@@ -207,7 +207,7 @@
"""
try:
digit, exitType, endposStuff = resultLine.split(' ', 2)
- except ValueError, err:
+ except ValueError as err:
pass
else:
digit = int(digit)
@@ -226,7 +226,7 @@
"""
try:
digit, endposStuff = resultLine.split(' ', 1)
- except ValueError, err:
+ except ValueError as err:
pass
else:
digit = int(digit)
@@ -472,7 +472,8 @@
timeout *= 1000
command += ' %s' % (timeout,)
- def charFirst((c, position)):
+ def charFirst(values):
+ (c, position) = values
if not c: # returns 0 on timeout
c = ''
else:
diff --git a/starpy/manager.py b/starpy/manager.py
index a564b3a..6876f74 100644
--- a/starpy/manager.py
+++ b/starpy/manager.py
@@ -22,6 +22,7 @@
Module defines a standard Python logging module log 'AMI'
"""
+import sys
from twisted.internet import protocol, reactor, defer
from twisted.protocols import basic
from twisted.internet import error as tw_error
@@ -32,6 +33,14 @@
log = logging.getLogger('AMI')
+
+if sys.version_info[0] < 3:
+ def string_types(value):
+ return isinstance(value, (str, unicode, type(None))) # noqa
+else:
+ def string_types(value):
+ return isinstance(value, (str, type(None)))
+
class deferredErrorResp(defer.Deferred):
"""A subclass of defer.Deferred that adds a registerError method
@@ -118,7 +127,7 @@
"""
log.debug('Registering function %s to handle events of type %r',
function, event)
- if isinstance(event, (str, unicode, type(None))):
+ if string_types(event):
event = (event,)
for ev in event:
self.eventTypeCallbacks.setdefault(ev, []).append(function)
@@ -134,24 +143,24 @@
"""
log.debug('Deregistering handler %s for events of type %r',
function, event)
- if isinstance(event, (str, unicode, type(None))):
+ if string_types(event):
event = (event,)
success = True
for ev in event:
try:
set = self.eventTypeCallbacks[ev]
- except KeyError, err:
+ except KeyError as err:
success = False
else:
try:
while function in set:
set.remove(function)
- except (ValueError, KeyError), err:
+ except (ValueError, KeyError) as err:
success = False
if not set or function is None:
try:
del self.eventTypeCallbacks[ev]
- except KeyError, err:
+ except KeyError as err:
success = False
return success
@@ -209,7 +218,7 @@
try:
callable(tw_error.ConnectionDone(
"FastAGI connection terminated"))
- except Exception, err:
+ except Exception as err:
log.error("Failure during connectionLost for callable %s: %s",
callable, err)
self.actionIDCallbacks.clear()
@@ -223,6 +232,9 @@
message = {}
while self.messageCache:
line = self.messageCache.pop(0)
+
+ if type(line) is bytes:
+ line = line.decode('utf-8')
line = line.strip()
if line:
if line.endswith(self.END_DATA):
@@ -239,7 +251,7 @@
else:
try:
key, value = line.split(':', 1)
- except ValueError, err:
+ except ValueError as err:
# XXX data-safety issues, what prevents the
# VERSION_PREFIX from showing up in a data-set?
log.warn("Improperly formatted line received and "
@@ -253,7 +265,7 @@
if callback:
try:
callback(message)
- except Exception, err:
+ except Exception as err:
# XXX log failure here...
pass
# otherwise is a monitor message or something we didn't send...
@@ -265,13 +277,13 @@
for key in (event['event'], None):
try:
handlers = self.eventTypeCallbacks[key]
- except KeyError, err:
+ except KeyError as err:
pass
else:
for handler in handlers:
try:
handler(self, event)
- except Exception, err:
+ except Exception as err:
# would like the getException code here...
log.error(
'Exception in event handler %s on event %s: %s',
@@ -316,7 +328,7 @@
"""Cleanup callbacks on completion"""
try:
del self.actionIDCallbacks[actionid]
- except KeyError, err:
+ except KeyError as err:
pass
return result
@@ -335,7 +347,8 @@
self.actionIDCallbacks[actionid] = responseCallback
log.debug("""MSG OUT: %s""", message)
for item in message:
- self.sendLine('%s: %s' % (str(item[0].lower()), str(item[1])))
+ line = ('%s: %s' % (str(item[0].lower()), str(item[1])))
+ self.sendLine(line.encode('utf-8'))
else:
message = dict([(k.lower(), v) for (k, v) in message.items()])
if 'actionid' not in message:
@@ -344,8 +357,9 @@
self.actionIDCallbacks[message['actionid']] = responseCallback
log.debug("""MSG OUT: %s""", message)
for key, value in message.items():
- self.sendLine('%s: %s' % (str(key.lower()), str(value)))
- self.sendLine('')
+ line = ('%s: %s' % (str(key.lower()), str(value)))
+ self.sendLine(line.encode('utf-8'))
+ self.sendLine(''.encode('utf-8'))
if type(message) == list:
return actionid
else:
@@ -630,7 +644,7 @@
def removeActionId(message):
try:
del message['actionid']
- except KeyError, err:
+ except KeyError as err:
pass
return message
diff --git a/tox.ini b/tox.ini
index a74bf6d..a6c1ede 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
[tox]
-envlist = py26,py27,pep8
+envlist = py26,py27,py32,py33,py34,p35,pep8
[testenv]
deps = -r{toxinidir}/tools/pip-requires
--
To view, visit https://gerrit.asterisk.org/8918
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-Project: starpy
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I9ccd5a15be6e4129a5e0ce0bf1a5a4ff26998bac
Gerrit-Change-Number: 8918
Gerrit-PatchSet: 2
Gerrit-Owner: Corey Farrell <git at cfware.com>
Gerrit-Reviewer: Corey Farrell <git at cfware.com>
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Kevin Harwell <kharwell at digium.com>
Gerrit-Reviewer: Matthew Fredrickson <creslin at digium.com>
Gerrit-Reviewer: Rodrigo Ramirez Norambuena <a at rodrigoramirez.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20180514/9c76ac6f/attachment-0001.html>
More information about the asterisk-code-review
mailing list