Browse Source

Merge pull request #444 from methane/round7-python-update

Round7 python update
Brian Hauer 12 years ago
parent
commit
ac58d19c3b

+ 3 - 3
config/create-postgres.sql

@@ -1,15 +1,15 @@
 DROP TABLE IF EXISTS World;
 DROP TABLE IF EXISTS World;
-CREATE TABLE  World (
+CREATE TABLE  "World" (
   id integer NOT NULL,
   id integer NOT NULL,
   randomNumber integer NOT NULL default 0,
   randomNumber integer NOT NULL default 0,
   PRIMARY KEY  (id)
   PRIMARY KEY  (id)
 );
 );
 
 
-INSERT INTO World (id, randomNumber)
+INSERT INTO "World" (id, randomNumber)
 SELECT x.id, random() * 10000 + 1 FROM generate_series(1,10000) as x(id);
 SELECT x.id, random() * 10000 + 1 FROM generate_series(1,10000) as x(id);
 
 
 DROP TABLE IF EXISTS Fortune;
 DROP TABLE IF EXISTS Fortune;
-CREATE TABLE  Fortune (
+CREATE TABLE  "Fortune" (
   id integer NOT NULL,
   id integer NOT NULL,
   message varchar(2048) NOT NULL,
   message varchar(2048) NOT NULL,
   PRIMARY KEY  (id)
   PRIMARY KEY  (id)

+ 0 - 38
django-stripped/README.md

@@ -1,38 +0,0 @@
-# Django Benchmarking Test
-
-This is the Django portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
-
-### JSON Encoding Test
-
-* [JSON test source](hello/world/views.py)
-
-
-### Data-Store/Database Mapping Test
-
-* [DB test controller](hello/world/views.py)
-* [DB test model](hello/world/models.py)
-
-
-## Infrastructure Software Versions
-The tests were run with:
-* [Python 2.7.3](http://www.python.org/)
-* [Django 1.4](https://www.djangoproject.com/)
-* [Gunicorn 0.17.2](http://gunicorn.org/)
-* [MySQL 5.5.29](https://dev.mysql.com/)
-
-
-## Resources
-* https://docs.djangoproject.com/en/dev/intro/tutorial01/
-
-## Test URLs
-### JSON Encoding Test
-
-http://localhost:8080/json
-
-### Data-Store/Database Mapping Test
-
-http://localhost:8080/db
-
-### Variable Query Test
-
-http://localhost:8080/db?queries=2

+ 0 - 0
django-stripped/__init__.py


+ 0 - 21
django-stripped/benchmark_config

@@ -1,21 +0,0 @@
-{
-  "framework": "django-stripped",
-  "tests": [{
-    "default": {
-      "setup_file": "setup",
-      "json_url": "/json",
-      "db_url": "/db",
-      "query_url": "/db?queries=",
-      "port": 8080,
-      "sort": 33
-    },
-    "py3": {
-      "setup_file": "setup_py3",
-      "json_url": "/json",
-      "db_url": "/db",
-      "query_url": "/db?queries=",
-      "port": 8080,
-      "sort": 243
-    }
-  }]
-}

+ 0 - 0
django-stripped/hello/hello/__init__.py


+ 0 - 173
django-stripped/hello/hello/settings.py

@@ -1,173 +0,0 @@
-# Django settings for hello project.
-
-DEBUG = False
-TEMPLATE_DEBUG = DEBUG
-
-ADMINS = (
-    # ('Your Name', '[email protected]'),
-)
-
-MANAGERS = ADMINS
-
-DATABASES = {
-    'default': {
-        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
-        'NAME': 'hello_world',                      # Or path to database file if using sqlite3.
-        'USER': 'benchmarkdbuser',                      # Not used with sqlite3.
-        'PASSWORD': 'benchmarkdbpass',                  # Not used with sqlite3.
-        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
-        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
-        'CONN_MAX_AGE': 30,
-    }
-}
-
-# Local time zone for this installation. Choices can be found here:
-# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
-# although not all choices may be available on all operating systems.
-# On Unix systems, a value of None will cause Django to use the same
-# timezone as the operating system.
-# If running in a Windows environment this must be set to the same as your
-# system time zone.
-TIME_ZONE = 'America/Chicago'
-
-# Language code for this installation. All choices can be found here:
-# http://www.i18nguy.com/unicode/language-identifiers.html
-LANGUAGE_CODE = 'en-us'
-
-SITE_ID = 1
-
-# If you set this to False, Django will make some optimizations so as not
-# to load the internationalization machinery.
-USE_I18N = True
-
-# If you set this to False, Django will not format dates, numbers and
-# calendars according to the current locale.
-USE_L10N = True
-
-# If you set this to False, Django will not use timezone-aware datetimes.
-USE_TZ = True
-
-# Absolute filesystem path to the directory that will hold user-uploaded files.
-# Example: "/home/media/media.lawrence.com/media/"
-MEDIA_ROOT = ''
-
-# URL that handles the media served from MEDIA_ROOT. Make sure to use a
-# trailing slash.
-# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
-MEDIA_URL = ''
-
-# Absolute path to the directory static files should be collected to.
-# Don't put anything in this directory yourself; store your static files
-# in apps' "static/" subdirectories and in STATICFILES_DIRS.
-# Example: "/home/media/media.lawrence.com/static/"
-STATIC_ROOT = ''
-
-# URL prefix for static files.
-# Example: "http://media.lawrence.com/static/"
-STATIC_URL = '/static/'
-
-# Additional locations of static files
-STATICFILES_DIRS = (
-    # Put strings here, like "/home/html/static" or "C:/www/django/static".
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
-)
-
-# List of finder classes that know how to find static files in
-# various locations.
-STATICFILES_FINDERS = (
-    'django.contrib.staticfiles.finders.FileSystemFinder',
-    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
-#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
-)
-
-# Make this unique, and don't share it with anybody.
-SECRET_KEY = '_7mb6#v4yf@qhc(r(zbyh&z_iby-na*7wz&-v6pohsul-d#y5f'
-
-# List of callables that know how to import templates from various sources.
-TEMPLATE_LOADERS = (
-    ('django.template.loaders.cached.Loader', (
-        'django.template.loaders.filesystem.Loader',
-        'django.template.loaders.app_directories.Loader',
-    )),
-)
-
-MIDDLEWARE_CLASSES = (
-    # In our optimized version, we can remove this middleware that we're not using
-    # 'django.middleware.common.CommonMiddleware',
-    # 'django.contrib.sessions.middleware.SessionMiddleware',
-    # 'django.middleware.csrf.CsrfViewMiddleware',
-    # 'django.contrib.auth.middleware.AuthenticationMiddleware',
-    # 'django.contrib.messages.middleware.MessageMiddleware',
-)
-
-ROOT_URLCONF = 'hello.urls'
-
-# Python dotted path to the WSGI application used by Django's runserver.
-WSGI_APPLICATION = 'hello.wsgi.application'
-
-TEMPLATE_DIRS = (
-    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
-    "/home/ubuntu/FrameworkBenchmarks/django/hello/templates",
-)
-
-INSTALLED_APPS = (
-    # Removing these for our optimized version
-    # 'django.contrib.auth',
-    # 'django.contrib.contenttypes',
-    # 'django.contrib.sessions',
-    # 'django.contrib.sites',
-    # 'django.contrib.messages',
-    # 'django.contrib.staticfiles',
-    # Uncomment the next line to enable the admin:
-    # 'django.contrib.admin',
-    # Uncomment the next line to enable admin documentation:
-    # 'django.contrib.admindocs',
-    'world',
-)
-
-# A sample logging configuration. The only tangible logging
-# performed by this configuration is to send an email to
-# the site admins on every HTTP 500 error when DEBUG=False.
-# See http://docs.djangoproject.com/en/dev/topics/logging for
-# more details on how to customize your logging configuration.
-LOGGING = {
-    'version': 1,
-    'disable_existing_loggers': True,
-    'formatters': {
-        'verbose': {
-            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
-        },
-        'simple': {
-            'format': '%(levelname)s %(message)s'
-        },
-    },
-    'filters': {
-        'require_debug_false': {
-            '()': 'django.utils.log.RequireDebugFalse'
-        }
-    },
-    'handlers': {
-        'mail_admins': {
-            'level': 'ERROR',
-            'filters': ['require_debug_false'],
-            'class': 'django.utils.log.AdminEmailHandler'
-        },
-        'console':{
-            'level': 'ERROR',
-            'class': 'logging.StreamHandler',
-            'formatter': 'simple'
-        },
-    },
-    'loggers': {
-        'django.request': {
-            'handlers': ['mail_admins', 'console'],
-            'level': 'ERROR',
-            'propagate': True,
-        },
-    }
-}
-
-ALLOWED_HOSTS = ['*']

+ 0 - 19
django-stripped/hello/hello/urls.py

@@ -1,19 +0,0 @@
-from django.conf.urls import patterns, include, url
-
-# Uncomment the next two lines to enable the admin:
-# from django.contrib import admin
-# admin.autodiscover()
-
-urlpatterns = patterns('',
-    # Examples:
-    # url(r'^$', 'hello.views.home', name='home'),
-    # url(r'^hello/', include('hello.foo.urls')),
-
-    # Uncomment the admin/doc line below to enable admin documentation:
-    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
-
-    # Uncomment the next line to enable the admin:
-    # url(r'^admin/', include(admin.site.urls)),
-    url(r'^json$', 'world.views.json'),
-    url(r'^db$', 'world.views.db'),
-)

+ 0 - 28
django-stripped/hello/hello/wsgi.py

@@ -1,28 +0,0 @@
-"""
-WSGI config for hello project.
-
-This module contains the WSGI application used by Django's development server
-and any production WSGI deployments. It should expose a module-level variable
-named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
-this application via the ``WSGI_APPLICATION`` setting.
-
-Usually you will have the standard Django WSGI application here, but it also
-might make sense to replace the whole Django WSGI application with a custom one
-that later delegates to the Django one. For example, you could introduce WSGI
-middleware here, or combine a Django application with an application of another
-framework.
-
-"""
-import os
-
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hello.settings")
-
-# This application object is used by any WSGI server configured to use this
-# file. This includes Django's development server, if the WSGI_APPLICATION
-# setting points here.
-from django.core.wsgi import get_wsgi_application
-application = get_wsgi_application()
-
-# Apply WSGI middleware here.
-# from helloworld.wsgi import HelloWorldApplication
-# application = HelloWorldApplication(application)

+ 0 - 10
django-stripped/hello/manage.py

@@ -1,10 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-
-if __name__ == "__main__":
-    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hello.settings")
-
-    from django.core.management import execute_from_command_line
-
-    execute_from_command_line(sys.argv)

+ 0 - 11
django-stripped/hello/templates/base.html

@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-</head>
-
-<body>
-  <div id="content">
-    {% block content %}{% endblock %}
-  </div>
-</body>
-</html>

+ 0 - 0
django-stripped/hello/world/__init__.py


+ 0 - 9
django-stripped/hello/world/models.py

@@ -1,9 +0,0 @@
-from django.db import models
-
-# Create your models here.
-
-class World(models.Model):
-  randomNumber = models.IntegerField()
-  class Meta:
-    db_table = 'World'
-

+ 0 - 25
django-stripped/hello/world/views.py

@@ -1,25 +0,0 @@
-# Create your views here.
-
-from django.template import Context, loader
-from django.http import HttpResponse
-from django.core import serializers
-from world.models import World
-import ujson
-import random
-
-def json(request):
-  response = {
-    "message": "Hello, World!"
-  }
-  return HttpResponse(ujson.dumps(response), mimetype="application/json")
-
-def db(request):
-  queries = int(request.GET.get('queries', 1))
-  worlds  = []
-
-  for i in range(queries):
-    # get a random row, we know the ids are between 1 and 10000
-    worlds.append(World.objects.get(id=random.randint(1, 10000)))
-
-  return HttpResponse(serializers.serialize("json", worlds), mimetype="application/json")
-

+ 0 - 34
django-stripped/setup_py3.py

@@ -1,34 +0,0 @@
-import subprocess
-import setup_util
-import multiprocessing
-import os
-
-home = os.path.expanduser('~')
-bin_dir = os.path.expanduser('~/FrameworkBenchmarks/installs/py3/bin')
-NCPU = multiprocessing.cpu_count()
-
-proc = None
-
-
-def start(args):
-    global proc
-    setup_util.replace_text("django-stripped/hello/hello/settings.py", "HOST': '.*'", "HOST': '" + args.database_host + "'")
-    setup_util.replace_text("django-stripped/hello/hello/settings.py", "\/home\/ubuntu",  home)
-    proc = subprocess.Popen([
-        bin_dir + "/gunicorn",
-        "hello.wsgi:application",
-        "-k", "meinheld.gmeinheld.MeinheldWorker",
-        "-b", "0.0.0.0:8080",
-        '-w', str(NCPU*3),
-        "--log-level=critical"],
-        cwd="django-stripped/hello")
-    return 0
-
-def stop():
-    global proc
-    if proc is None:
-        return 0
-    proc.terminate()
-    proc.wait()
-    proc = None
-    return 0

+ 10 - 0
django/benchmark_config

@@ -20,6 +20,16 @@
       "update_url": "/update?queries=",
       "update_url": "/update?queries=",
       "port": 8080,
       "port": 8080,
       "sort": 242
       "sort": 242
+    },
+    "postgresql": {
+      "setup_file": "setup_pg",
+      "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/db?queries=",
+      "fortune_url": "/fortunes",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "sort": 245
     }
     }
   }]
   }]
 }
 }

+ 9 - 7
django/hello/hello/settings.py

@@ -1,5 +1,7 @@
 # Django settings for hello project.
 # Django settings for hello project.
 
 
+import os
+
 DEBUG = False
 DEBUG = False
 TEMPLATE_DEBUG = DEBUG
 TEMPLATE_DEBUG = DEBUG
 
 
@@ -11,10 +13,10 @@ MANAGERS = ADMINS
 
 
 DATABASES = {
 DATABASES = {
     'default': {
     'default': {
-        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
-        'NAME': 'hello_world',                      # Or path to database file if using sqlite3.
-        'USER': 'benchmarkdbuser',                      # Not used with sqlite3.
-        'PASSWORD': 'benchmarkdbpass',                  # Not used with sqlite3.
+        'ENGINE': 'django.db.backends.' + os.environ['DJANGO_DB'], # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+        'NAME': 'hello_world',           # Or path to database file if using sqlite3.
+        'USER': 'benchmarkdbuser',       # Not used with sqlite3.
+        'PASSWORD': 'benchmarkdbpass',   # Not used with sqlite3.
         'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
         'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
         'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
         'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
         'CONN_MAX_AGE': 30,
         'CONN_MAX_AGE': 30,
@@ -38,14 +40,14 @@ SITE_ID = 1
 
 
 # If you set this to False, Django will make some optimizations so as not
 # If you set this to False, Django will make some optimizations so as not
 # to load the internationalization machinery.
 # to load the internationalization machinery.
-USE_I18N = True
+USE_I18N = False
 
 
 # If you set this to False, Django will not format dates, numbers and
 # If you set this to False, Django will not format dates, numbers and
 # calendars according to the current locale.
 # calendars according to the current locale.
-USE_L10N = True
+USE_L10N = False
 
 
 # If you set this to False, Django will not use timezone-aware datetimes.
 # If you set this to False, Django will not use timezone-aware datetimes.
-USE_TZ = True
+USE_TZ = False
 
 
 # Absolute filesystem path to the directory that will hold user-uploaded files.
 # Absolute filesystem path to the directory that will hold user-uploaded files.
 # Example: "/home/media/media.lawrence.com/media/"
 # Example: "/home/media/media.lawrence.com/media/"

+ 2 - 2
django/hello/world/models.py

@@ -5,9 +5,9 @@ from django.db import models
 class World(models.Model):
 class World(models.Model):
   randomnumber = models.IntegerField()
   randomnumber = models.IntegerField()
   class Meta:
   class Meta:
-    db_table = 'world'
+    db_table = 'World'
 
 
 class Fortune(models.Model):
 class Fortune(models.Model):
   message = models.CharField(max_length=65535)
   message = models.CharField(max_length=65535)
   class Meta:
   class Meta:
-    db_table = 'fortune'
+    db_table = 'Fortune'

+ 4 - 1
django/setup.py

@@ -14,6 +14,8 @@ def start(args):
     global proc
     global proc
     setup_util.replace_text("django/hello/hello/settings.py", "HOST': '.*'", "HOST': '" + args.database_host + "'")
     setup_util.replace_text("django/hello/hello/settings.py", "HOST': '.*'", "HOST': '" + args.database_host + "'")
     setup_util.replace_text("django/hello/hello/settings.py", "\/home\/ubuntu",  home)
     setup_util.replace_text("django/hello/hello/settings.py", "\/home\/ubuntu",  home)
+    env = os.environ.copy()
+    env['DJANGO_DB'] = 'mysql'
     proc = subprocess.Popen([
     proc = subprocess.Popen([
         bin_dir + "/gunicorn",
         bin_dir + "/gunicorn",
         "hello.wsgi:application",
         "hello.wsgi:application",
@@ -21,7 +23,8 @@ def start(args):
         "-b", "0.0.0.0:8080",
         "-b", "0.0.0.0:8080",
         '-w', str(NCPU*3),
         '-w', str(NCPU*3),
         "--log-level=critical"],
         "--log-level=critical"],
-        cwd="django/hello")
+        cwd="django/hello",
+        env=env)
     return 0
     return 0
 
 
 def stop():
 def stop():

+ 6 - 3
django-stripped/setup.py → django/setup_pg.py

@@ -12,8 +12,10 @@ proc = None
 
 
 def start(args):
 def start(args):
     global proc
     global proc
-    setup_util.replace_text("django-stripped/hello/hello/settings.py", "HOST': '.*'", "HOST': '" + args.database_host + "'")
-    setup_util.replace_text("django-stripped/hello/hello/settings.py", "\/home\/ubuntu",  home)
+    setup_util.replace_text("django/hello/hello/settings.py", "HOST': '.*'", "HOST': '" + args.database_host + "'")
+    setup_util.replace_text("django/hello/hello/settings.py", "\/home\/ubuntu",  home)
+    env = os.environ.copy()
+    env['DJANGO_DB'] = 'postgresql_psycopg2'
     proc = subprocess.Popen([
     proc = subprocess.Popen([
         bin_dir + "/gunicorn",
         bin_dir + "/gunicorn",
         "hello.wsgi:application",
         "hello.wsgi:application",
@@ -21,7 +23,8 @@ def start(args):
         "-b", "0.0.0.0:8080",
         "-b", "0.0.0.0:8080",
         '-w', str(NCPU*3),
         '-w', str(NCPU*3),
         "--log-level=critical"],
         "--log-level=critical"],
-        cwd="django-stripped/hello")
+        cwd="django/hello",
+        env=env)
     return 0
     return 0
 
 
 def stop():
 def stop():

+ 10 - 9
installer.py

@@ -304,18 +304,18 @@ class Installer:
       if three: self.__run_command(python3_bin + cmd)
       if three: self.__run_command(python3_bin + cmd)
       if pypy:  self.__run_command(pypy_bin + cmd)
       if pypy:  self.__run_command(pypy_bin + cmd)
 
 
-    self.__download("http://bitbucket.org/pypy/pypy/downloads/pypy-2.0.2-linux64.tar.bz2")
-    self.__run_command("tar xjf pypy-2.0.2-linux64.tar.bz2")
-    self.__run_command('ln -sf pypy-2.0.2 pypy')
+    self.__download("http://bitbucket.org/pypy/pypy/downloads/pypy-2.1-linux64.tar.bz2")
+    self.__run_command("tar xjf pypy-2.1-linux64.tar.bz2")
+    self.__run_command('ln -sf pypy-2.1 pypy')
     self.__download("http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz")
     self.__download("http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz")
     self.__run_command("tar xzf Python-2.7.5.tgz")
     self.__run_command("tar xzf Python-2.7.5.tgz")
     self.__download("http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz")
     self.__download("http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz")
     self.__run_command("tar xJf Python-3.3.2.tar.xz")
     self.__run_command("tar xJf Python-3.3.2.tar.xz")
     self.__run_command("./configure --prefix=$HOME/FrameworkBenchmarks/installs/py2 --disable-shared CC=gcc-4.8", cwd="Python-2.7.5")
     self.__run_command("./configure --prefix=$HOME/FrameworkBenchmarks/installs/py2 --disable-shared CC=gcc-4.8", cwd="Python-2.7.5")
     self.__run_command("./configure --prefix=$HOME/FrameworkBenchmarks/installs/py3 --disable-shared CC=gcc-4.8", cwd="Python-3.3.2")
     self.__run_command("./configure --prefix=$HOME/FrameworkBenchmarks/installs/py3 --disable-shared CC=gcc-4.8", cwd="Python-3.3.2")
-    self.__run_command("make -j", cwd="Python-2.7.5")
+    self.__run_command("make -j2", cwd="Python-2.7.5")
     self.__run_command("make install", cwd="Python-2.7.5")
     self.__run_command("make install", cwd="Python-2.7.5")
-    self.__run_command("make -j", cwd="Python-3.3.2")
+    self.__run_command("make -j2", cwd="Python-3.3.2")
     self.__run_command("make install", cwd="Python-3.3.2")
     self.__run_command("make install", cwd="Python-3.3.2")
 
 
     self.__download("https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py")
     self.__download("https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py")
@@ -323,13 +323,14 @@ class Installer:
     self.__run_command(python_bin + "/python ez_setup.py")
     self.__run_command(python_bin + "/python ez_setup.py")
     self.__run_command(python3_bin + "/python3 ez_setup.py")
     self.__run_command(python3_bin + "/python3 ez_setup.py")
 
 
-    easy_install('pip==1.3.1', two=True, three=True, pypy=True)
+    easy_install('pip==1.4.1', two=True, three=True, pypy=True)
     easy_install('MySQL-python==1.2.4', two=True, three=False, pypy=True)
     easy_install('MySQL-python==1.2.4', two=True, three=False, pypy=True)
     easy_install('https://github.com/clelland/MySQL-for-Python-3/archive/master.zip', two=False, three=True, pypy=False)
     easy_install('https://github.com/clelland/MySQL-for-Python-3/archive/master.zip', two=False, three=True, pypy=False)
     easy_install('PyMySQL==0.5', pypy=True)
     easy_install('PyMySQL==0.5', pypy=True)
     easy_install('PyMySQL3==0.5', two=False, three=True)
     easy_install('PyMySQL3==0.5', two=False, three=True)
-    easy_install('simplejson==3.3.0', two=True, three=True, pypy=False)
     easy_install('psycopg2==2.5.1', three=True)
     easy_install('psycopg2==2.5.1', three=True)
+
+    easy_install('simplejson==3.3.0', two=True, three=True, pypy=False)
     easy_install('ujson==1.33', three=True)
     easy_install('ujson==1.33', three=True)
     easy_install('https://github.com/downloads/surfly/gevent/gevent-1.0rc2.tar.gz', three=True)
     easy_install('https://github.com/downloads/surfly/gevent/gevent-1.0rc2.tar.gz', three=True)
     easy_install('uwsgi', three=True)  # uwsgi is released too often to stick on single version.
     easy_install('uwsgi', three=True)  # uwsgi is released too often to stick on single version.
@@ -345,10 +346,10 @@ class Installer:
     easy_install('pymongo==2.5.2', two=True, three=True, pypy=True)
     easy_install('pymongo==2.5.2', two=True, three=True, pypy=True)
 
 
     # Django
     # Django
-    easy_install("https://www.djangoproject.com/download/1.6b1/tarball/", two=True, three=True, pypy=True)
+    easy_install("https://www.djangoproject.com/download/1.6b2/tarball/", two=True, three=True, pypy=True)
 
 
     # Flask
     # Flask
-    easy_install('Werkzeug==0.9.2', two=True, three=True, pypy=True)
+    easy_install('Werkzeug==0.9.3', two=True, three=True, pypy=True)
     easy_install('flask==0.10.1', two=True, three=True, pypy=True)
     easy_install('flask==0.10.1', two=True, three=True, pypy=True)
     easy_install('sqlalchemy==0.8.2', two=True, three=True, pypy=True)
     easy_install('sqlalchemy==0.8.2', two=True, three=True, pypy=True)
     easy_install('Jinja2==2.7', two=True, three=True, pypy=True)
     easy_install('Jinja2==2.7', two=True, three=True, pypy=True)

+ 1 - 1
tornado/server.py

@@ -12,7 +12,7 @@ import tornado.httpserver
 tornado.options.define('port', default=8888, type=int, help="Server port")
 tornado.options.define('port', default=8888, type=int, help="Server port")
 
 
 
 
-class BaseHandler(torando.web.RequestHandler):
+class BaseHandler(tornado.web.RequestHandler):
     def compute_etag(self):
     def compute_etag(self):
         return None
         return None