فهرست منبع

rename py3compat to compat, move adhoc conditional imports into compat and import from compat, remove from py3compat import * from all modules, remove local copy of meld3

Chris McDonough 11 سال پیش
والد
کامیت
6b3d647b2d
40فایلهای تغییر یافته به همراه260 افزوده شده و 1766 حذف شده
  1. 4 6
      supervisor/childutils.py
  2. 114 2
      supervisor/py3compat.py
  3. 1 1
      supervisor/confecho.py
  4. 3 6
      supervisor/datatypes.py
  5. 3 16
      supervisor/http.py
  6. 8 12
      supervisor/http_client.py
  7. 3 8
      supervisor/loggers.py
  8. 1 1
      supervisor/medusa/asynchat_25.py
  9. 2 1
      supervisor/medusa/asyncore_25.py
  10. 6 12
      supervisor/medusa/auth_handler.py
  11. 0 2
      supervisor/medusa/counter.py
  12. 1 1
      supervisor/medusa/filesys.py
  13. 5 12
      supervisor/medusa/ftp_server.py
  14. 3 5
      supervisor/medusa/monitor.py
  15. 6 9
      supervisor/medusa/monitor_client.py
  16. 2 5
      supervisor/medusa/monitor_client_win32.py
  17. 2 4
      supervisor/medusa/resolver.py
  18. 1 3
      supervisor/medusa/rpc_server.py
  19. 2 6
      supervisor/medusa/script_handler.py
  20. 3 6
      supervisor/medusa/status_handler.py
  21. 2 1
      supervisor/medusa/test/asyn_http_bench.py
  22. 4 2
      supervisor/medusa/text_socket.py
  23. 2 2
      supervisor/medusa/thread/pi_module.py
  24. 3 7
      supervisor/medusa/thread/select_trigger.py
  25. 0 1464
      supervisor/meld3.py
  26. 8 12
      supervisor/options.py
  27. 5 12
      supervisor/process.py
  28. 4 1
      supervisor/rpcinterface.py
  29. 4 7
      supervisor/supervisorctl.py
  30. 8 14
      supervisor/tests/base.py
  31. 1 6
      supervisor/tests/test_childutils.py
  32. 3 12
      supervisor/tests/test_datatypes.py
  33. 5 12
      supervisor/tests/test_http.py
  34. 3 5
      supervisor/tests/test_loggers.py
  35. 4 17
      supervisor/tests/test_options.py
  36. 5 19
      supervisor/tests/test_process.py
  37. 3 4
      supervisor/tests/test_rpcinterfaces.py
  38. 3 3
      supervisor/tests/test_web.py
  39. 11 16
      supervisor/web.py
  40. 12 32
      supervisor/xmlrpc.py

+ 4 - 6
supervisor/childutils.py

@@ -1,11 +1,9 @@
 import sys
 import time
-from supervisor.py3compat import *
-if PY3:
-    import xmlrpc.client as xmlrpclib
-else:
-    #noinspection PyUnresolvedReferences
-    import xmlrpclib
+
+from supervisor.compat import xmlrpclib
+from supervisor.compat import long
+
 from supervisor.xmlrpc import SupervisorTransport
 from supervisor.events import ProcessCommunicationEvent
 from supervisor.dispatchers import PEventListenerDispatcher

+ 114 - 2
supervisor/py3compat.py

@@ -1,5 +1,3 @@
-__author__ = 'Scott Maxwell'
-
 import sys
 PY3 = sys.version>'3'
 if PY3:
@@ -12,10 +10,16 @@ if PY3:
             str.__init__(self, string)
     def as_bytes(s): return s if isinstance(s,bytes) else s.encode('utf8')
     def as_string(s): return s if isinstance(s,str) else s.decode('utf8')
+    from functools import reduce
     
 else:
+    long = long
+    raw_input = raw_input
+    unicode = unicode
+    basestring = basestring
     def as_bytes(s): return s if isinstance(s, str) else s.encode('utf-8')
     def as_string(s): return s if isinstance(s, unicode) else s.decode('utf-8')
+    reduce = reduce
 
 def print_function(*args,**kwargs): sys.stdout.write(' '.join(str(i) for i in args)+kwargs.get('end','\n'))
 
@@ -50,3 +54,111 @@ def total_ordering(cls): # pragma: no cover
                 opfunc.__doc__ = op.__doc__
             setattr(cls, opname, opfunc)
     return cls
+
+try:
+    import xmlrpc.client as xmlrpclib
+except ImportError:
+    import xmlrpclib
+
+try:
+    import urllib.parse as urlparse
+    import urllib.parse as urllib
+except ImportError:
+    import urlparse
+    import urllib
+    
+if PY3:
+    from base64 import encodebytes as encodestring
+else:
+    from base64 import encodestring
+    
+try:
+    from hashlib import sha1
+except ImportError:
+    #noinspection PyUnresolvedReferences
+    from sha import new as sha1
+
+try:
+    #noinspection PyUnresolvedReferences
+    import syslog
+except ImportError:
+    syslog = None
+
+try:
+    import configparser as ConfigParser
+except ImportError:
+   import ConfigParser
+
+try:
+    from StringIO import StringIO
+except ImportError:
+    from io import StringIO
+    
+try:
+    #noinspection PyUnresolvedReferences
+    from sys import maxint
+except ImportError:
+    from sys import maxsize as maxint
+
+try:
+    from urllib.parse import parse_qs, parse_qsl
+except ImportError:
+    from cgi import parse_qs, parse_qsl
+
+try:
+    import http.client as httplib
+except ImportError:
+    import httplib
+
+try:
+    from base64 import decodebytes as decodestring, encodebytes as encodestring
+except ImportError:
+    from base64 import decodestring, encodestring
+
+    
+if PY3:
+    func_attribute = '__func__'
+else:
+    func_attribute = 'im_func'
+
+try:
+    # Python 2.6 contains a version of cElementTree inside it.
+    from xml.etree.ElementTree import iterparse
+except ImportError:
+    try:
+        # Failing that, try cElementTree instead.
+        #noinspection PyPackageRequirements
+        from cElementTree import iterparse
+    except ImportError:
+        iterparse = None
+
+
+try:
+    from unittest.mock import Mock, patch, sentinel
+except ImportError:
+    from mock import Mock, patch, sentinel
+
+try:
+    import unittest.mock as mock
+except ImportError:
+    import mock
+
+try:
+    from xmlrpc.client import Fault
+except ImportError:
+    from xmlrpclib import Fault
+
+try:
+    from string import ascii_letters as letters
+except ImportError:
+    from string import letters
+
+try:
+    from hashlib import md5
+except ImportError:
+    from md5 import md5
+
+try:
+    import thread
+except ImportError:
+    import _thread as thread

+ 1 - 1
supervisor/confecho.py

@@ -1,6 +1,6 @@
 import pkg_resources
 import sys
-from supervisor.py3compat import *
+from supervisor.compat import as_string
 
 def main(out=sys.stdout):
     config = pkg_resources.resource_string(__name__, 'skel/sample.conf')

+ 3 - 6
supervisor/datatypes.py

@@ -5,12 +5,9 @@ import signal
 import sys
 import supervisor.medusa.text_socket as socket
 import shlex
-from supervisor.py3compat import *
-if PY3:
-    import urllib.parse as urlparse
-else:
-    #noinspection PyUnresolvedReferences
-    import urlparse
+
+from supervisor.compat import urlparse
+from supervisor.compat import long
 from supervisor.loggers import getLevelNumByDescription
 
 # I dont know why we bother, this doesn't run on Windows, but just

+ 3 - 16
supervisor/http.py

@@ -5,23 +5,10 @@ import sys
 import supervisor.medusa.text_socket as socket
 import errno
 import pwd
-from supervisor.py3compat import *
-if PY3:
-    import urllib.parse as urllib
-else:
-    import urllib
-
-try:
-    import pwd
-except ImportError:  # Windows
-    import getpass as pwd
-
-try:
-    from hashlib import sha1
-except ImportError:
-    #noinspection PyUnresolvedReferences
-    from sha import new as sha1
 
+from supervisor.compat import urllib
+from supervisor.compat import sha1
+from supervisor.compat import as_bytes
 from supervisor.medusa import asyncore_25 as asyncore
 from supervisor.medusa import http_date
 from supervisor.medusa import http_server

+ 8 - 12
supervisor/http_client.py

@@ -2,17 +2,12 @@
 
 import sys
 import supervisor.medusa.text_socket as socket
-from supervisor.py3compat import *
-if PY3:
-    from urllib.parse import urlparse
-    from base64 import encodebytes as encodestring
-else:
-    #noinspection PyUnresolvedReferences
-    from urlparse import urlparse
-    #noinspection PyDeprecation
-    from base64 import encodestring
-
-from supervisor.medusa import asyncore_25 as asyncore
+
+from supervisor.compat import print_function
+from supervisor.compat import urlparse
+from supervisor.compat import as_bytes
+from supervisor.compat import as_string
+from supervisor.compat import encodestring
 from supervisor.medusa import asynchat_25 as asynchat
 
 CR="\x0d"
@@ -64,7 +59,8 @@ class HTTPHandler(asynchat.async_chat):
         if self.url is not None:
             raise AssertionError('Already doing a get')
         self.url = serverurl + path
-        scheme, host, path_ignored, params, query, fragment = urlparse(self.url)
+        scheme, host, path_ignored, params, query, fragment = urlparse.urlparse(
+            self.url)
         if not scheme in ("http", "unix"):
             raise NotImplementedError
         self.host = host

+ 3 - 8
supervisor/loggers.py

@@ -12,14 +12,9 @@ import errno
 import sys
 import time
 import traceback
-from supervisor.py3compat import *
 
-try:
-    #noinspection PyUnresolvedReferences
-    import syslog
-except ImportError:
-    # only required when 'syslog' is specified as the log filename
-    pass
+from supervisor.compat import syslog
+from supervisor.compat import long
 
 class LevelsByName:
     CRIT = 50   # messages that probably require immediate user attention
@@ -310,7 +305,7 @@ class Logger:
 class SyslogHandler(Handler):
     def __init__(self):
         Handler.__init__(self)
-        assert 'syslog' in globals(), "Syslog module not present"
+        assert syslog is not None, "Syslog module not present"
 
     def close(self):
         pass

+ 1 - 1
supervisor/medusa/asynchat_25.py

@@ -48,7 +48,7 @@ you - by calling your self.found_terminator() method.
 
 import supervisor.medusa.text_socket as socket
 from supervisor.medusa import asyncore_25 as asyncore
-from supervisor.py3compat import *
+from supervisor.compat import long
 
 class async_chat (asyncore.dispatcher):
     """This is an abstract class.  You must derive from this class, and add

+ 2 - 1
supervisor/medusa/asyncore_25.py

@@ -54,7 +54,8 @@ import time
 import os
 from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, \
      ENOTCONN, ESHUTDOWN, EINTR, EISCONN, errorcode
-from supervisor.py3compat import *
+
+from supervisor.compat import as_string, as_bytes
 
 try:
     #noinspection PyUnresolvedReferences,PyUnboundLocalVariable

+ 6 - 12
supervisor/medusa/auth_handler.py

@@ -9,21 +9,15 @@ RCS_ID =  '$Id: auth_handler.py,v 1.6 2002/11/25 19:40:23 akuchling Exp $'
 
 # support for 'basic' authentication.
 
-try:
-    from hashlib import md5
-except ImportError:
-    #noinspection PyUnresolvedReferences
-    from md5 import new as md5
-try:
-    from base64 import decodebytes as decodestring, encodebytes as encodestring
-except ImportError:
-    from base64 import decodestring, encodestring
-
 import re
 import time
-import supervisor.medusa.counter as counter
-from supervisor.py3compat import *
 
+from supervisor.compat import encodestring, decodestring
+from supervisor.compat import md5
+from supervisor.compat import as_string, as_bytes
+from supervisor.compat import print_function
+
+import supervisor.medusa.counter as counter
 import supervisor.medusa.default_handler as default_handler
 
 get_header = default_handler.get_header

+ 0 - 2
supervisor/medusa/counter.py

@@ -12,8 +12,6 @@
 # method, the use of long arithmetic is a reminder that the counter
 # will overflow.
 
-from supervisor.py3compat import *
-
 class counter:
     """general-purpose counter"""
 

+ 1 - 1
supervisor/medusa/filesys.py

@@ -14,7 +14,7 @@
 # opening files for reading, and listing directories, should
 # return a producer.
 
-from supervisor.py3compat import *
+from supervisor.compat import long
 
 class abstract_filesystem:
     def __init__ (self):

+ 5 - 12
supervisor/medusa/ftp_server.py

@@ -19,21 +19,16 @@ RCS_ID =  '$Id: ftp_server.py,v 1.11 2003/12/24 16:05:28 akuchling Exp $'
 # vestigial anyway.  I've attempted to include the most commonly-used
 # commands, using the feature set of wu-ftpd as a guide.
 
-import supervisor.medusa.asyncore_25 as asyncore
-import supervisor.medusa.asynchat_25 as asynchat
-#noinspection PyUnresolvedReferences
-from supervisor.py3compat import * # needed for long
-
 import os
-import supervisor.medusa.text_socket as socket
 import stat
-try:
-    from string import letters
-except ImportError:
-    from string import ascii_letters as letters
 import sys
 import time
 
+from supervisor.compat import letters
+
+import supervisor.medusa.asyncore_25 as asyncore
+import supervisor.medusa.asynchat_25 as asynchat
+import supervisor.medusa.text_socket as socket
 from supervisor.medusa.producers import file_producer
 
 # TODO: implement a directory listing cache.  On very-high-load
@@ -140,8 +135,6 @@ class ftp_channel (asynchat.async_chat):
         command = line[0].lower()
         # watch especially for 'urgent' abort commands.
         if command.find('abor') != -1:
-            # ascii_letters for python 3
-            letters = getattr(string, "letters", string.ascii_letters)
             # strip off telnet sync chars and the like...
             while command and command[0] not in letters:
                 command = command[1:]

+ 3 - 5
supervisor/medusa/monitor.py

@@ -6,10 +6,9 @@
 #
 RCS_ID = '$Id: monitor.py,v 1.5 2002/03/23 15:08:06 amk Exp $'
 
-try:
-    from md5 import md5
-except ImportError:
-    from hashlib import md5
+from supervisor.compat import md5
+from supervisor.compat import print_function
+
 import supervisor.medusa.text_socket as socket
 import sys
 import time
@@ -21,7 +20,6 @@ import supervisor.medusa.asynchat_25 as asynchat
 
 from supervisor.medusa.counter import counter
 import supervisor.medusa.producers as producers
-from supervisor.py3compat import *
 
 class monitor_channel (asynchat.async_chat):
     try_linemode = 1

+ 6 - 9
supervisor/medusa/monitor_client.py

@@ -6,18 +6,15 @@ import supervisor.medusa.asynchat_25 as asynchat
 import supervisor.medusa.text_socket as socket
 import sys
 import os
-from supervisor.py3compat import *
 
-try:
-    from md5 import md5
-except ImportError:
-    from hashlib import md5
+from supervisor.compat import md5
+from supervisor.compat import print_function
 
 class stdin_channel (asyncore.file_dispatcher):
     def handle_read (self):
         data = self.recv(512)
         if not data:
-            print('\nclosed.')
+            print_function('\nclosed.')
             self.sock_channel.close()
             try:
                 self.close()
@@ -55,7 +52,7 @@ class monitor_client (asynchat.async_chat):
             self.push (hex_digest (self.timestamp + self.password) + '\r\n')
             self.sent_auth = 1
         else:
-            print()
+            print_function()
 
     def handle_close (self):
         # close all the channels, which will make the standard main
@@ -91,7 +88,7 @@ def hex_digest (s):
 
 if __name__ == '__main__':
     if len(sys.argv) == 1:
-        print('Usage: %s host port' % sys.argv[0])
+        print_function('Usage: %s host port' % sys.argv[0])
         sys.exit(0)
 
     if '-e' in sys.argv:
@@ -105,7 +102,7 @@ if __name__ == '__main__':
     try:
         os.system ('stty -echo')
         p = raw_input()
-        print()
+        print_function()
     finally:
         os.system ('stty echo')
     stdin = stdin_channel (0)

+ 2 - 5
supervisor/medusa/monitor_client_win32.py

@@ -8,12 +8,9 @@
 import supervisor.medusa.text_socket as socket
 import sys
 import supervisor.medusa.thread as thread
-from supervisor.py3compat import *
 
-try:
-    from md5 import md5
-except ImportError:
-    from hashlib import md5
+from supervisor.compat import md5
+from supervisor.compat import print_function
 
 def hex_digest (s):
     m = md5.md5()

+ 2 - 4
supervisor/medusa/resolver.py

@@ -11,15 +11,13 @@ RCS_ID =  '$Id: resolver.py,v 1.4 2002/03/20 17:37:48 amk Exp $'
 
 # see rfc1035 for details
 
+from supervisor.compat import reduce
+
 import supervisor.medusa.asyncore_25 as asyncore
 import supervisor.medusa.text_socket as socket
 import sys
 import time
 from supervisor.medusa.counter import counter
-from supervisor.py3compat import *
-
-if PY3:
-    from functools import reduce
 
 VERSION = RCS_ID.split()[2]
 

+ 1 - 3
supervisor/medusa/rpc_server.py

@@ -41,9 +41,7 @@ import supervisor.medusa.asynchat_25 as asynchat
 from supervisor.medusa.producers import scanning_producer
 from supervisor.medusa.counter import counter
 
-from supervisor.py3compat import *
-if PY3:
-    from functools import reduce
+from supervisor.compat import reduce
 
 MY_NAME = socket.gethostname().split('.')[0]
 

+ 2 - 6
supervisor/medusa/script_handler.py

@@ -22,14 +22,10 @@
 # script_handler.restricted)
 
 import re
-from supervisor.py3compat import *
-if PY3:
-    from io import StringIO
-else:
-    #noinspection PyUnresolvedReferences
-    from StringIO import StringIO
 import sys
 
+from supervisor.compat import StringIO
+
 import supervisor.medusa.counter as counter
 import supervisor.medusa.default_handler as default_handler
 import supervisor.medusa.producers as producers

+ 3 - 6
supervisor/medusa/status_handler.py

@@ -10,7 +10,9 @@ import time
 import re
 from cgi import escape
 
-from supervisor.py3compat import *
+from supervisor.compat import StringIO
+from supervisor.compat import long
+
 import supervisor.medusa.asyncore_25 as asyncore
 import supervisor.medusa.http_server as http_server
 import supervisor.medusa.medusa_gif as medusa_gif
@@ -78,11 +80,6 @@ class status_extension:
                     request.push (self.objects[i].status())
                 except:
                     import traceback
-                    if PY3:
-                        from io import StringIO
-                    else:
-                        #noinspection PyUnresolvedReferences
-                        from StringIO import StringIO
                     stream = StringIO()
                     traceback.print_exc(None,stream)
                     request.push('<h2><font color="red">Error in Channel %3d: %s</font><pre>%s</pre>' % (i,escape(repr(self.objects[i])), escape(stream.getvalue())))

+ 2 - 1
supervisor/medusa/test/asyn_http_bench.py

@@ -1,9 +1,10 @@
 # -*- Mode: Python -*-
 
+from supervisor.compat import as_bytes
+
 import asyncore
 import socket
 import sys
-from supervisor.py3compat import *
 
 def blurt (thing):
     sys.stdout.write (thing)

+ 4 - 2
supervisor/medusa/text_socket.py

@@ -2,8 +2,10 @@
 
 __author__ = 'Scott Maxwell'
 
-from supervisor.py3compat import *
-from socket import *
+from supervisor.compat import PY3
+from supervisor.compat import as_string, as_bytes
+
+from socket import * # relied on to be imported from elsewhere
 
 if PY3:
     bin_socket = socket

+ 2 - 2
supervisor/medusa/thread/pi_module.py

@@ -10,10 +10,10 @@
 # See also the ABC Programmer's Handbook, by Geurts, Meertens & Pemberton,
 # published by Prentice-Hall (UK) Ltd., 1990.
 
-from supervisor.py3compat import *
-
 StopException = "Stop!"
 
+from supervisor.compat import long
+
 def go (file):
     try:
         k, a, b, a1, b1 = long(2), long(4), long(1), long(12), long(4)

+ 3 - 7
supervisor/medusa/thread/select_trigger.py

@@ -15,18 +15,14 @@
 ##############################################################################
 
 __revision__ = "$Id: select_trigger.py,v 1.4 2003/01/09 15:49:15 akuchling Exp $"
+from supervisor.compat import thread
+from supervisor.compat import as_bytes
 
-from supervisor.py3compat import *
 import supervisor.medusa.asyncore_25 as asyncore
 import supervisor.medusa.asynchat_25 as asynchat
 
 import os
 import supervisor.medusa.text_socket as socket
-try:
-    import _thread as thread
-except ImportError:
-    #noinspection PyUnresolvedReferences
-    import thread
 
 if os.name == 'posix':
 
@@ -316,7 +312,7 @@ if __name__ == '__main__':
 
         def handle_accept (self):
             conn, addr = self.accept()
-            tp = thread_parent (conn, addr)
+            thread_parent (conn, addr)
 
     thread_server()
     #asyncore.loop(1.0, use_poll=1)

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 1464
supervisor/meld3.py


+ 8 - 12
supervisor/options.py

@@ -6,17 +6,6 @@ import tempfile
 import errno
 import signal
 import re
-from supervisor.py3compat import *
-if PY3:
-    import configparser as ConfigParser
-    import xmlrpc.client as xmlrpclib
-    from io import StringIO
-else:
-    #noinspection PyUnresolvedReferences
-    import ConfigParser
-    #noinspection PyUnresolvedReferences
-    import xmlrpclib
-    from StringIO import StringIO
 import pwd
 import grp
 import resource
@@ -30,6 +19,14 @@ import warnings
 from fcntl import fcntl
 from fcntl import F_SETFL, F_GETFL
 
+from supervisor.compat import print_function
+from supervisor.compat import PY3
+from supervisor.compat import ConfigParser
+from supervisor.compat import as_bytes, as_string
+from supervisor.compat import xmlrpclib
+from supervisor.compat import StringIO
+from supervisor.compat import basestring
+
 from supervisor.medusa import asyncore_25 as asyncore
 
 from supervisor.datatypes import process_or_group_name
@@ -1328,7 +1325,6 @@ class ServerOptions(Options):
             lmin = limit['min']
             res = limit['resource']
             msg = limit['msg']
-            name = limit['name']
 
             soft, hard = resource.getrlimit(res)
 

+ 5 - 12
supervisor/process.py

@@ -3,18 +3,13 @@ import sys
 import time
 import errno
 import shlex
-try:
-    #noinspection PyUnresolvedReferences
-    import StringIO
-    #noinspection PyUnresolvedReferences
-    from sys import maxint
-except ImportError:
-    import io as StringIO
-    from sys import maxsize as maxint
-
 import traceback
 import signal
 
+from supervisor.compat import maxint
+from supervisor.compat import StringIO
+from supervisor.compat import total_ordering
+
 from supervisor.medusa import asyncore_25 as asyncore
 
 from supervisor.states import ProcessStates
@@ -29,7 +24,6 @@ from supervisor.options import ProcessException, BadCommand
 from supervisor.dispatchers import EventListenerStates
 
 from supervisor import events
-from supervisor.py3compat import total_ordering
 
 from supervisor.datatypes import RestartUnconditionally
 
@@ -430,7 +424,7 @@ class Subprocess(object):
         try:
             options.kill(pid, sig)
         except:
-            io = StringIO.StringIO()
+            io = StringIO()
             traceback.print_exc(file=io)
             tb = io.getvalue()
             msg = 'unknown problem killing %s (%s):%s' % (self.config.name,
@@ -794,7 +788,6 @@ class EventListenerPool(ProcessGroupBase):
     def _acceptEvent(self, event, head=False):
         # events are required to be instances
         # this has a side effect to fail with an attribute error on 'old style' classes
-        event_type = event.__class__
         if not hasattr(event, 'serial'):
             event.serial = new_serial(GlobalSerial)
         if not hasattr(event, 'pool_serials'):

+ 4 - 1
supervisor/rpcinterface.py

@@ -4,6 +4,10 @@ import datetime
 import errno
 import sys
 
+from supervisor.compat import as_string
+from supervisor.compat import unicode
+from supervisor.compat import basestring
+
 from supervisor.options import readFile
 from supervisor.options import tailFile
 from supervisor.options import NotExecutable
@@ -25,7 +29,6 @@ from supervisor.states import getSupervisorStateDescription
 from supervisor.states import ProcessStates
 from supervisor.states import getProcessStateDescription
 from supervisor.states import RUNNING_STATES
-from supervisor.py3compat import *
 
 API_VERSION  = '3.0'
 

+ 4 - 7
supervisor/supervisorctl.py

@@ -25,18 +25,15 @@ actions.
 import cmd
 import sys
 import getpass
-from supervisor.py3compat import *
-try:
-    import xmlrpclib
-    import urlparse
-except ImportError:
-    import xmlrpc.client as xmlrpclib
-    import urllib.parse as urlparse
 
 import supervisor.medusa.text_socket as socket
 import errno
 import threading
 
+from supervisor.compat import xmlrpclib
+from supervisor.compat import urlparse
+from supervisor.compat import unicode
+
 from supervisor.medusa import asyncore_25 as asyncore
 
 from supervisor.options import ClientOptions

+ 8 - 14
supervisor/tests/base.py

@@ -1,14 +1,8 @@
 _NOW = 1151365354
 _TIMEFORMAT = '%b %d %I:%M %p'
 
-try:
-    import xmlrpclib
-    from xmlrpclib import Fault
-except ImportError:
-    import xmlrpc.client as xmlrpclib
-    from xmlrpc.client import Fault
-
-from supervisor.py3compat import total_ordering
+from supervisor.compat import total_ordering
+from supervisor.compat import Fault
 
 class DummyOptions:
 
@@ -734,11 +728,11 @@ class DummySupervisorRPCNamespace:
     def readProcessStdoutLog(self, name, offset, length):
         from supervisor import xmlrpc
         if name == 'BAD_NAME':
-            raise xmlrpclib.Fault(xmlrpc.Faults.BAD_NAME, 'BAD_NAME')
+            raise Fault(xmlrpc.Faults.BAD_NAME, 'BAD_NAME')
         elif name == 'FAILED':
-            raise xmlrpclib.Fault(xmlrpc.Faults.FAILED, 'FAILED')
+            raise Fault(xmlrpc.Faults.FAILED, 'FAILED')
         elif name == 'NO_FILE':
-            raise xmlrpclib.Fault(xmlrpc.Faults.NO_FILE, 'NO_FILE')
+            raise Fault(xmlrpc.Faults.NO_FILE, 'NO_FILE')
         a = 'output line\n' * 10
         return a[offset:]
 
@@ -755,11 +749,11 @@ class DummySupervisorRPCNamespace:
                 info=i
                 return info
         if name == 'BAD_NAME':
-            raise xmlrpclib.Fault(xmlrpc.Faults.BAD_NAME, 'BAD_NAME')
+            raise Fault(xmlrpc.Faults.BAD_NAME, 'BAD_NAME')
         if name == 'FAILED':
-            raise xmlrpclib.Fault(xmlrpc.Faults.FAILED, 'FAILED')
+            raise Fault(xmlrpc.Faults.FAILED, 'FAILED')
         if name == 'NO_FILE':
-            raise xmlrpclib.Fault(xmlrpc.Faults.NO_FILE, 'NO_FILE')
+            raise Fault(xmlrpc.Faults.NO_FILE, 'NO_FILE')
 
     def startProcess(self, name):
         from supervisor import xmlrpc

+ 1 - 6
supervisor/tests/test_childutils.py

@@ -1,10 +1,7 @@
 import sys
 import time
 import unittest
-try:
-    from StringIO import StringIO
-except ImportError:
-    from io import StringIO
+from supervisor.compat import StringIO
 
 class ChildUtilsTests(unittest.TestCase):
     def test_getRPCInterface(self):
@@ -87,8 +84,6 @@ class TestProcessCommunicationsProtocol(unittest.TestCase):
 class TestEventListenerProtocol(unittest.TestCase):
     def test_wait(self):
         from supervisor.childutils import listener
-        from supervisor.dispatchers import PEventListenerDispatcher
-        token = PEventListenerDispatcher.READY_FOR_EVENTS_TOKEN
         class Dummy:
             def readline(self):
                 return 'len:5'

+ 3 - 12
supervisor/tests/test_datatypes.py

@@ -1,23 +1,14 @@
 """Test suite for supervisor.datatypes"""
 
-import sys
 import os
 import unittest
-import supervisor.medusa.text_socket as socket
 import tempfile
 
-try:
-    from mock import Mock, patch, sentinel
-except ImportError:
-    from unittest.mock import Mock, patch, sentinel
+from supervisor.compat import Mock, patch, sentinel
+from supervisor.compat import maxint
 
 from supervisor import datatypes
-from supervisor.py3compat import *
-if PY3:
-    maxint = sys.maxsize
-else:
-    #noinspection PyUnresolvedReferences
-    maxint = sys.maxint
+import supervisor.medusa.text_socket as socket
 
 class DatatypesTest(unittest.TestCase):
     def test_boolean_returns_true_for_truthy_values(self):

+ 5 - 12
supervisor/tests/test_http.py

@@ -4,13 +4,10 @@ import sys
 import supervisor.medusa.text_socket as socket
 import tempfile
 import unittest
-from supervisor.py3compat import *
 
-try:
-    from hashlib import sha1
-except ImportError:
-    #noinspection PyUnresolvedReferences
-    from sha import new as sha1
+from supervisor.compat import as_bytes
+from supervisor.compat import as_string
+from supervisor.compat import sha1
 
 from supervisor.tests.base import DummySupervisor
 from supervisor.tests.base import PopulatedDummySupervisor
@@ -26,12 +23,12 @@ class HandlerTests:
         return self._getTargetClass()(supervisord)
 
     def test_match(self):
-        class DummyRequest:
+        class FakeRequest:
             def __init__(self, uri):
                 self.uri = uri
         supervisor = DummySupervisor()
         handler = self._makeOne(supervisor)
-        self.assertEqual(handler.match(DummyRequest(handler.path)), True)
+        self.assertEqual(handler.match(FakeRequest(handler.path)), True)
 
 class LogtailHandlerTests(HandlerTests, unittest.TestCase):
     def _getTargetClass(self):
@@ -49,7 +46,6 @@ class LogtailHandlerTests(HandlerTests, unittest.TestCase):
         self.assertEqual(request._error, 410)
 
     def test_handle_request_stdout_logfile_missing(self):
-        supervisor = DummySupervisor()
         options = DummyOptions()
         pconfig = DummyPConfig(options, 'foo', 'foo', 'it/is/missing')
         supervisord = PopulatedDummySupervisor(options, 'foo', pconfig)
@@ -59,9 +55,6 @@ class LogtailHandlerTests(HandlerTests, unittest.TestCase):
         self.assertEqual(request._error, 410)
 
     def test_handle_request(self):
-        supervisor = DummySupervisor()
-        import tempfile
-        import os
         import stat
         f = tempfile.NamedTemporaryFile()
         t = f.name

+ 3 - 5
supervisor/tests/test_loggers.py

@@ -6,13 +6,11 @@ import shutil
 import os
 import syslog
 
-try:
-    import mock
-except ImportError:
-    import unittest.mock as mock
+from supervisor.compat import mock
+from supervisor.compat import PY3
+from supervisor.compat import as_string
 
 from supervisor.tests.base import DummyStream
-from supervisor.py3compat import *
 from supervisor import read_file
 
 class LevelTests(unittest.TestCase):

+ 4 - 17
supervisor/tests/test_options.py

@@ -8,24 +8,11 @@ import unittest
 import signal
 import shutil
 import errno
-try:
-    # Python < 3
-    from StringIO import StringIO
-except ImportError:
-    # Python >= 3
-    from io import StringIO
-
-try:
-    from mock import Mock, patch, sentinel
-except ImportError:
-    from unittest.mock import Mock, patch, sentinel
-from supervisor.py3compat import *
-from supervisor import read_file
 
-try:
-    from StringIO import StringIO
-except ImportError:
-    from io import StringIO
+from supervisor import read_file
+from supervisor.compat import StringIO
+from supervisor.compat import as_bytes
+from supervisor.compat import Mock, sentinel, patch
 
 from supervisor.tests.base import DummySupervisor
 from supervisor.tests.base import DummyLogger

+ 5 - 19
supervisor/tests/test_process.py

@@ -1,16 +1,11 @@
-import os
 import signal
-import time
 import unittest
 import sys
 import errno
 
-try:
-    from mock import Mock, patch, sentinel
-except ImportError:
-    from unittest.mock import Mock, patch, sentinel
+from supervisor.compat import Mock, patch, sentinel
+from supervisor.compat import maxint
 
-from supervisor.py3compat import *
 from supervisor.tests.base import DummyOptions
 from supervisor.tests.base import DummyPConfig
 from supervisor.tests.base import DummyProcess
@@ -21,13 +16,6 @@ from supervisor.tests.base import DummyFCGIGroupConfig
 from supervisor.tests.base import DummySocketConfig
 from supervisor.tests.base import DummyProcessGroup
 from supervisor.tests.base import DummyFCGIProcessGroup
-from supervisor.tests.base import DummySocketManager
-
-if PY3:
-    maxint = sys.maxsize
-else:
-    #noinspection PyUnresolvedReferences
-    maxint = sys.maxint
 
 from supervisor.process import Subprocess
 from supervisor.options import BadCommand
@@ -222,7 +210,6 @@ class SubprocessTests(unittest.TestCase):
 
     def test_spawn_fail_make_pipes_emfile(self):
         options = DummyOptions()
-        import errno
         options.make_pipes_error = errno.EMFILE
         config = DummyPConfig(options, 'good', '/good/filename')
         instance = self._makeOne(config)
@@ -567,7 +554,7 @@ class SubprocessTests(unittest.TestCase):
         sent = 'a' * (1 << 13)
         self.assertRaises(OSError, instance.write, sent)
         options.forkpid = 1
-        result = instance.spawn()
+        instance.spawn()
         instance.write(sent)
         stdin_fd = instance.pipes['stdin']
         self.assertEqual(sent, instance.dispatchers[stdin_fd].input_buffer)
@@ -582,7 +569,7 @@ class SubprocessTests(unittest.TestCase):
         sent = 'a' * (1 << 13)
         self.assertRaises(OSError, instance.write, sent)
         options.forkpid = 1
-        result = instance.spawn()
+        instance.spawn()
         stdin_fd = instance.pipes['stdin']
         instance.dispatchers[stdin_fd].close()
         self.assertRaises(OSError, instance.write, sent)
@@ -595,7 +582,7 @@ class SubprocessTests(unittest.TestCase):
         sent = 'a' * (1 << 13)
         self.assertRaises(OSError, instance.write, sent)
         options.forkpid = 1
-        result = instance.spawn()
+        instance.spawn()
         stdin_fd = instance.pipes['stdin']
         instance.dispatchers[stdin_fd].flush_error = errno.EPIPE
         self.assertRaises(OSError, instance.write, sent)
@@ -1677,7 +1664,6 @@ class EventListenerPoolTests(ProcessGroupBaseTests):
         pool.transition()
         self.assertEqual(process1.transitioned, True)
         self.assertEqual(pool.event_buffer, [event])
-        data = pool.config.options.logger.data
 
     def test_transition_event_proc_not_running(self):
         options = DummyOptions()

+ 3 - 4
supervisor/tests/test_rpcinterfaces.py

@@ -15,8 +15,6 @@ from supervisor.tests.base import PopulatedDummySupervisor
 from supervisor.tests.base import _NOW
 from supervisor.tests.base import _TIMEFORMAT
 
-from supervisor.py3compat import *
-
 class TestBase(unittest.TestCase):
     def setUp(self):
         pass
@@ -478,7 +476,7 @@ class SupervisorNamespaceXMLRPCInterfaceTests(TestBase):
         supervisord.set_procattr('process1', 'state', ProcessStates.STOPPED)
         supervisord.set_procattr('process2', 'state', ProcessStates.STOPPED)
         interface = self._makeOne(supervisord)
-        callback = interface.startProcess('foo:*')
+        interface.startProcess('foo:*')
         self.assertEqual(interface.update_text, 'startProcessGroup')
 
     def test_startProcessGroup(self):
@@ -781,7 +779,7 @@ class SupervisorNamespaceXMLRPCInterfaceTests(TestBase):
         supervisord.set_procattr('process1', 'state', ProcessStates.STOPPED)
         supervisord.set_procattr('process2', 'state', ProcessStates.STOPPED)
         interface = self._makeOne(supervisord)
-        callback = interface.stopProcess('foo:*')
+        interface.stopProcess('foo:*')
         self.assertEqual(interface.update_text, 'stopProcessGroup')
 
     def test_stopAllProcesses(self):
@@ -1619,6 +1617,7 @@ class SupervisorNamespaceXMLRPCInterfaceTests(TestBase):
         self.assertEqual(event.data, 'bar')
 
     def test_sendRemoteCommEvent_unicode_encoded_to_utf8(self):
+        from supervisor.compat import as_string, PY3
         options = DummyOptions()
         supervisord = DummySupervisor(options)
         interface = self._makeOne(supervisord)

+ 3 - 3
supervisor/tests/test_web.py

@@ -100,7 +100,7 @@ class UIHandlerTests(unittest.TestCase):
         request = DummyRequest('/index.html', [], '', '',
                                {'PATH_INFO':'/index.html'})
         handler = self._makeOne()
-        data = handler.handle_request(request)
+        handler.handle_request(request)
         from supervisor.web import StatusView
         view = request.channel.producer.callback
         self.assertEqual(view.__class__, StatusView)
@@ -110,7 +110,7 @@ class UIHandlerTests(unittest.TestCase):
         request = DummyRequest('/tail.html', [], '', '',
                                {'PATH_INFO':'/tail.html'})
         handler = self._makeOne()
-        data = handler.handle_request(request)
+        handler.handle_request(request)
         from supervisor.web import TailView
         view = request.channel.producer.callback
         self.assertEqual(view.__class__, TailView)
@@ -120,7 +120,7 @@ class UIHandlerTests(unittest.TestCase):
         request = DummyRequest('/tail.html', [], '', '',
                                {'PATH_INFO':'/ok.html'})
         handler = self._makeOne()
-        data = handler.handle_request(request)
+        handler.handle_request(request)
         from supervisor.web import OKView
         view = request.channel.producer.callback
         self.assertEqual(view.__class__, OKView)

+ 11 - 16
supervisor/web.py

@@ -1,28 +1,23 @@
 import os
 import re
+import sys
 import time
 import traceback
-import urllib
 import datetime
 
-from supervisor.py3compat import *
-if PY3:
-    from io import StringIO
-    import urllib.parse as urllib
-    from urllib.parse import parse_qs, parse_qsl
-else:
-    #noinspection PyUnresolvedReferences
-    from StringIO import StringIO
-    import urllib
-    from cgi import parse_qs, parse_qsl
+import meld3
+
+from supervisor.compat import StringIO
+from supervisor.compat import urllib
+from supervisor.compat import parse_qs
+from supervisor.compat import parse_qsl
+from supervisor.compat import as_string
 
 from supervisor.medusa import producers
 from supervisor.medusa.http_server import http_date
 from supervisor.medusa.http_server import get_header
 from supervisor.medusa.xmlrpc_handler import collector
 
-import supervisor.meld3 as meld3
-
 from supervisor.process import ProcessStates
 from supervisor.http import NOT_DONE_YET
 
@@ -181,7 +176,7 @@ class MeldView:
         headers['Pragma'] = 'no-cache'
         headers['Cache-Control'] = 'no-cache'
         headers['Expires'] = http_date.build_http_date(0)
-        response['body'] = body
+        response['body'] = as_string(body)
         return response
 
     def render(self):
@@ -235,7 +230,7 @@ class TailView(MeldView):
         else:
             refresh_anchor.deparent()
 
-        return root.write_xhtmlstring()
+        return as_string(root.write_xhtmlstring())
 
 class StatusView(MeldView):
     def actions_for_process(self, process):
@@ -493,7 +488,7 @@ class StatusView(MeldView):
         copyright_year = str(datetime.date.today().year)
         root.findmeld('copyright_date').content(copyright_year)
 
-        return root.write_xhtmlstring()
+        return as_string(root.write_xhtmlstring())
 
 class OKView:
     delay = 0

+ 12 - 32
supervisor/xmlrpc.py

@@ -1,28 +1,20 @@
 import types
-import supervisor.medusa.text_socket as socket
-from supervisor.py3compat import *
-if PY3:
-    import xmlrpc.client as xmlrpclib
-    import http.client as httplib
-    import urllib.parse as urllib
-    from io import StringIO
-    from base64 import decodebytes as decodestring, encodebytes as encodestring
-    func_attribute = '__func__'
-else:
-    #noinspection PyUnresolvedReferences
-    import xmlrpclib
-    #noinspection PyUnresolvedReferences
-    import httplib
-    import urllib
-    #noinspection PyUnresolvedReferences
-    from cStringIO import StringIO
-    from base64 import decodestring, encodestring
-    func_attribute = 'im_func'
 import re
 import traceback
 import sys
-import base64
 
+from supervisor.compat import xmlrpclib
+from supervisor.compat import func_attribute
+from supervisor.compat import StringIO
+from supervisor.compat import urllib
+from supervisor.compat import as_bytes
+from supervisor.compat import as_string
+from supervisor.compat import encodestring
+from supervisor.compat import decodestring
+from supervisor.compat import httplib
+from supervisor.compat import iterparse
+
+import supervisor.medusa.text_socket as socket
 from supervisor.medusa.http_server import get_header
 from supervisor.medusa.xmlrpc_handler import xmlrpc_handler
 from supervisor.medusa import producers
@@ -545,18 +537,6 @@ def gettags(comment):
     return tags
 
 
-try:
-    # Python 2.6 contains a version of cElementTree inside it.
-    from xml.etree.ElementTree import iterparse
-except ImportError:
-    try:
-        # Failing that, try cElementTree instead.
-        #noinspection PyPackageRequirements
-        from cElementTree import iterparse
-    except ImportError:
-        iterparse = None
-
-
 if iterparse is not None:
     import datetime, time