Browse Source

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 năm trước cách đây
mục cha
commit
6b3d647b2d
40 tập tin đã thay đổi với 260 bổ sung1766 xóa
  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)

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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