Skip to content

Commit

Permalink
all tests pass under python 3
Browse files Browse the repository at this point in the history
  • Loading branch information
benoitc committed Oct 24, 2012
1 parent 60644b1 commit 8d453fb
Show file tree
Hide file tree
Showing 47 changed files with 276 additions and 293 deletions.
6 changes: 3 additions & 3 deletions gunicorn/app/django_wsgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,10 @@ def reload_django_settings():
app_mod = util.import_module(app[:-2])
appdir = os.path.dirname(app_mod.__file__)
app_subdirs = os.listdir(appdir)
app_subdirs.sort()
name_pattern = re.compile(r'[a-zA-Z]\w*')
for d in app_subdirs:
if name_pattern.match(d) and os.path.isdir(os.path.join(appdir, d)):
for d in sorted(app_subdirs):
if (name_pattern.match(d) and
os.path.isdir(os.path.join(appdir, d))):
new_installed_apps.append('%s.%s' % (app[:-2], d))
else:
new_installed_apps.append(app)
Expand Down
7 changes: 5 additions & 2 deletions gunicorn/arbiter.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,10 @@ def setup(self, app):

if self.cfg.debug:
self.log.debug("Current configuration:")
for config, value in sorted(self.cfg.settings.iteritems()):


for config, value in sorted(self.cfg.settings.items(),
key=lambda setting: setting[1]):
self.log.debug(" %s: %s", config, value.value)

if self.cfg.preload_app:
Expand Down Expand Up @@ -436,7 +439,7 @@ def manage_workers(self):
self.spawn_workers()

workers = self.WORKERS.items()
workers.sort(key=lambda w: w[1].age)
workers = sorted(workers, key=lambda w: w[1].age)
while len(workers) > self.num_workers:
(pid, _) = workers.pop(0)
self.kill_worker(pid, signal.SIGQUIT)
Expand Down
21 changes: 15 additions & 6 deletions gunicorn/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from gunicorn import __version__
from gunicorn.errors import ConfigError
from gunicorn import util
from gunicorn.six import string_types
from gunicorn.six import string_types, integer_types, bytes_to_str

KNOWN_SETTINGS = []

Expand Down Expand Up @@ -62,10 +62,12 @@ def parser(self):
}
parser = optparse.OptionParser(**kwargs)

keys = self.settings.keys()
keys = list(self.settings)
def sorter(k):
return (self.settings[k].section, self.settings[k].order)
keys.sort(key=sorter)


keys = sorted(self.settings, key=self.settings.__getitem__)
for k in keys:
self.settings[k].add_option(parser)
return parser
Expand All @@ -85,7 +87,7 @@ def workers(self):
@property
def address(self):
bind = self.settings['bind'].get()
return util.parse_address(util.to_bytestring(bind))
return util.parse_address(bytes_to_str(bind))

@property
def uid(self):
Expand Down Expand Up @@ -179,8 +181,15 @@ def set(self, val):
assert callable(self.validator), "Invalid validator: %s" % self.name
self.value = self.validator(val)

def __lt__(self, other):
return (self.section == other.section and
self.order < other.order)
__cmp__ = __lt__

Setting = SettingMeta('Setting', (Setting,), {})

def validate_bool(val):
if isinstance(val, types.BooleanType):
if isinstance(val, bool):
return val
if not isinstance(val, string_types):
raise TypeError("Invalid type for casting: %s" % val)
Expand All @@ -197,7 +206,7 @@ def validate_dict(val):
return val

def validate_pos_int(val):
if not isinstance(val, (types.IntType, types.LongType)):
if not isinstance(val, integer_types):
val = int(val, 0)
else:
# Booleans are ints!
Expand Down
4 changes: 2 additions & 2 deletions gunicorn/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
# See the NOTICE for more information.


class HaltServer(Exception):
class HaltServer(BaseException):
def __init__(self, reason, exit_status=1):
self.reason = reason
self.exit_status = exit_status

def __str__(self):
return "<HaltServer %r %d>" % (self.reason, self.exit_status)

class ConfigError(Exception):
class ConfigError(BaseException):
""" Exception raised on config error """
48 changes: 24 additions & 24 deletions gunicorn/http/body.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@

from gunicorn.http.errors import (NoMoreData, ChunkMissingTerminator,
InvalidChunkSize)
from gunicorn.six import StringIO, bytes_to_str, integer_types
from gunicorn import six

class ChunkedReader(object):
def __init__(self, req, unreader):
self.req = req
self.parser = self.parse_chunked(unreader)
self.buf = StringIO()
self.buf = six.BytesIO()

def read(self, size):
if not isinstance(size, integer_types):
if not isinstance(size, six.integer_types):
raise TypeError("size must be an integral type")
if size <= 0:
raise ValueError("Size must be positive.")
Expand All @@ -26,19 +26,19 @@ def read(self, size):
if self.parser:
while self.buf.tell() < size:
try:
self.buf.write(self.parser.next())
self.buf.write(six.next(self.parser))
except StopIteration:
self.parser = None
break

data = self.buf.getvalue()
ret, rest = data[:size], data[size:]
self.buf.truncate(0)
self.buf = six.BytesIO()
self.buf.write(rest)
return ret

def parse_trailers(self, unreader, data):
buf = StringIO()
buf = six.BytesIO()
buf.write(data)

idx = buf.getvalue().find(b"\r\n\r\n")
Expand All @@ -50,8 +50,7 @@ def parse_trailers(self, unreader, data):
if done:
unreader.unread(buf.getvalue()[2:])
return b""
self.req.trailers = self.req.parse_headers(
bytes_to_str(buf.getvalue()[:idx]))
self.req.trailers = self.req.parse_headers(buf.getvalue()[:idx])
unreader.unread(buf.getvalue()[idx+4:])

def parse_chunked(self, unreader):
Expand All @@ -73,7 +72,7 @@ def parse_chunked(self, unreader):
(size, rest) = self.parse_chunk_size(unreader, data=rest[2:])

def parse_chunk_size(self, unreader, data=None):
buf = StringIO()
buf = six.BytesIO()
if data is not None:
buf.write(data)

Expand Down Expand Up @@ -111,7 +110,7 @@ def __init__(self, unreader, length):
self.length = length

def read(self, size):
if not isinstance(size, integer_types):
if not isinstance(size, six.integer_types):
raise TypeError("size must be an integral type")

size = min(self.length, size)
Expand All @@ -121,7 +120,7 @@ def read(self, size):
return b""


buf = StringIO()
buf = six.BytesIO()
data = self.unreader.read()
while data:
buf.write(data)
Expand All @@ -138,21 +137,21 @@ def read(self, size):
class EOFReader(object):
def __init__(self, unreader):
self.unreader = unreader
self.buf = StringIO()
self.buf = six.BytesIO()
self.finished = False

def read(self, size):
if not isinstance(size, integer_types):
if not isinstance(size, six.integer_types):
raise TypeError("size must be an integral type")
if size < 0:
raise ValueError("Size must be positive.")
if size == 0:
return ""
return b""

if self.finished:
data = self.buf.getvalue()
ret, rest = data[:size], data[size:]
self.buf.truncate(0)
self.buf = six.BytesIO()
self.buf.write(rest)
return ret

Expand All @@ -168,31 +167,32 @@ def read(self, size):

data = self.buf.getvalue()
ret, rest = data[:size], data[size:]
self.buf.truncate(0)
self.buf = six.BytesIO()
self.buf.write(rest)
return ret

class Body(object):
def __init__(self, reader):
self.reader = reader
self.buf = StringIO()
self.buf = six.BytesIO()

def __iter__(self):
return self

def next(self):
def __next__(self):
ret = self.readline()
if not ret:
raise StopIteration()
return ret
next = __next__

def getsize(self, size):
if size is None:
return sys.maxint
elif not isinstance(size, integer_types):
return six.MAXSIZE
elif not isinstance(size, six.integer_types):
raise TypeError("size must be an integral type")
elif size < 0:
return sys.maxint
return six.MAXSIZE
return size

def read(self, size=None):
Expand All @@ -203,7 +203,7 @@ def read(self, size=None):
if size < self.buf.tell():
data = self.buf.getvalue()
ret, rest = data[:size], data[size:]
self.buf.truncate(0)
self.buf = six.BytesIO()
self.buf.write(rest)
return ret

Expand All @@ -215,7 +215,7 @@ def read(self, size=None):

data = self.buf.getvalue()
ret, rest = data[:size], data[size:]
self.buf.truncate(0)
self.buf = six.BytesIO()
self.buf.write(rest)
return ret

Expand All @@ -225,7 +225,7 @@ def readline(self, size=None):
return b""

line = self.buf.getvalue()
self.buf.truncate(0)
self.buf = six.BytesIO()
if len(line) < size:
line += self.reader.read(size - len(line))
extra_buf_data = line[size:]
Expand Down
3 changes: 2 additions & 1 deletion gunicorn/http/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

class ParseException(Exception):
class ParseException(BaseException):
pass

class NoMoreData(IOError):
def __init__(self, buf=None):
self.buf = buf

def __str__(self):
return "No more data after: %r" % self.buf

Expand Down
11 changes: 5 additions & 6 deletions gunicorn/http/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
InvalidRequestLine, InvalidRequestMethod, InvalidHTTPVersion, \
LimitRequestLine, LimitRequestHeaders
from gunicorn.http.errors import InvalidProxyLine, ForbiddenProxyRequest
from gunicorn.six import StringIO, urlsplit, bytes_to_str
from gunicorn.six import BytesIO, urlsplit, bytes_to_str

MAX_REQUEST_LINE = 8190
MAX_HEADERS = 32768
Expand Down Expand Up @@ -148,7 +148,6 @@ def __init__(self, cfg, unreader, req_number=1):

self.req_number = req_number
self.proxy_protocol_info = None

super(Request, self).__init__(cfg, unreader)


Expand All @@ -161,7 +160,7 @@ def get_data(self, unreader, buf, stop=False):
buf.write(data)

def parse(self, unreader):
buf = StringIO()
buf = BytesIO()
self.get_data(unreader, buf, stop=True)

# get request line
Expand All @@ -170,12 +169,12 @@ def parse(self, unreader):
# proxy protocol
if self.proxy_protocol(bytes_to_str(line)):
# get next request line
buf = StringIO()
buf = BytesIO()
buf.write(rbuf)
line, rbuf = self.read_line(unreader, buf, self.limit_request_line)

self.parse_request_line(bytes_to_str(line))
buf = StringIO()
buf = BytesIO()
buf.write(rbuf)

# Headers
Expand All @@ -202,7 +201,7 @@ def parse(self, unreader):
self.headers = self.parse_headers(data[:idx])

ret = data[idx+4:]
buf = StringIO()
buf = BytesIO()
return ret

def read_line(self, unreader, buf, limit=0):
Expand Down
5 changes: 4 additions & 1 deletion gunicorn/http/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def __init__(self, mesg_class, cfg, source):
def __iter__(self):
return self

def next(self):
def __next__(self):
# Stop if HTTP dictates a stop.
if self.mesg and self.mesg.should_close():
raise StopIteration()
Expand All @@ -33,13 +33,16 @@ def next(self):
while data:
data = self.mesg.body.read(8192)


# Parse the next request
self.req_count += 1
self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
if not self.mesg:
raise StopIteration()
return self.mesg

next = __next__

class RequestParser(Parser):
def __init__(self, *args, **kwargs):
super(RequestParser, self).__init__(Request, *args, **kwargs)
Expand Down
Loading

0 comments on commit 8d453fb

Please sign in to comment.