[Asterisk-code-review] Add support code for Python 3 (starpy[master])

Corey Farrell asteriskteam at digium.com
Thu May 3 07:55:34 CDT 2018


Corey Farrell has uploaded this change for review. ( 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, 38 insertions(+), 25 deletions(-)



  git pull ssh://gerrit.asterisk.org:29418/starpy refs/changes/18/8918/1

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..8aaf1ba 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
@@ -118,7 +119,10 @@
         """
         log.debug('Registering function %s to handle events of type %r',
                   function, event)
-        if isinstance(event, (str, unicode, type(None))):
+        types = [str, type(None)]
+        if sys.version_info <= (3, 0):
+            types.append(unicode)
+        if isinstance(event, tuple(types)):
             event = (event,)
         for ev in event:
             self.eventTypeCallbacks.setdefault(ev, []).append(function)
@@ -134,24 +138,27 @@
         """
         log.debug('Deregistering handler %s for events of type %r',
                   function, event)
-        if isinstance(event, (str, unicode, type(None))):
+        types = [str, type(None)]
+        if sys.version_info <= (3, 0):
+            types.append(unicode)
+        if isinstance(event, tuple(types)):
             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 +216,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 +230,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 +249,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 +263,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 +275,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 +326,7 @@
         """Cleanup callbacks on completion"""
         try:
             del self.actionIDCallbacks[actionid]
-        except KeyError, err:
+        except KeyError as err:
             pass
         return result
 
@@ -335,7 +345,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 +355,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 +642,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: newchange
Gerrit-Change-Id: I9ccd5a15be6e4129a5e0ce0bf1a5a4ff26998bac
Gerrit-Change-Number: 8918
Gerrit-PatchSet: 1
Gerrit-Owner: Corey Farrell <git at cfware.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/20180503/e890b066/attachment.html>


More information about the asterisk-code-review mailing list