From a71799ea2cbfa1354c786991a85b610753f5474c Mon Sep 17 00:00:00 2001
From: Monty Taylor <mordred@inaugust.com>
Date: Thu, 11 Jul 2013 16:24:50 -0400
Subject: [PATCH] Updated to OpenStack Build stuff.

---
 .gitignore                                    |  4 +
 .testr.conf                                   |  8 ++
 MANIFEST.in                                   |  3 +-
 README                                        |  4 +-
 TODO                                          |  1 -
 {docs => doc/source}/Makefile                 |  0
 {docs => doc/source}/api.rst                  |  0
 {docs => doc/source}/changelog.rst            |  0
 {docs => doc/source}/changeset.rst            |  0
 {docs => doc/source}/conf.py                  |  0
 {docs => doc/source}/credits.rst              |  0
 {docs => doc/source}/download.rst             |  0
 {docs => doc/source}/faq.rst                  |  0
 {docs => doc/source}/glossary.rst             |  0
 .../ProjectDesignDecisionsAutomation.trac     |  0
 .../ProjectDesignDecisionsScriptFormat.trac   |  0
 .../ProjectDesignDecisionsVersioning.trac     |  0
 .../historical/ProjectDetailedDesign.trac     |  0
 .../source}/historical/ProjectGoals.trac      |  0
 .../source}/historical/ProjectProposal.txt    |  0
 .../source}/historical/RepositoryFormat.trac  |  0
 .../source}/historical/RepositoryFormat2.trac |  0
 {docs => doc/source}/index.rst                |  0
 {docs => doc/source}/theme/almodovar.css      |  0
 {docs => doc/source}/theme/layout.css         |  0
 {docs => doc/source}/theme/layout.html        |  0
 {docs => doc/source}/tools.rst                |  0
 {docs => doc/source}/versioning.rst           |  0
 migrate/tests/changeset/test_changeset.py     | 42 +++++------
 migrate/tests/changeset/test_constraint.py    | 26 +++----
 migrate/tests/fixture/__init__.py             |  4 +-
 migrate/tests/fixture/base.py                 | 12 +--
 migrate/tests/integrated/test_docs.py         |  2 +-
 migrate/tests/versioning/test_genmodel.py     | 17 ++---
 .../tests/versioning/test_keyedinstance.py    |  2 +-
 migrate/tests/versioning/test_repository.py   | 37 +++++----
 migrate/tests/versioning/test_runchangeset.py | 18 ++---
 migrate/tests/versioning/test_schema.py       | 20 ++---
 migrate/tests/versioning/test_schemadiff.py   | 25 +++----
 migrate/tests/versioning/test_script.py       |  2 +-
 migrate/tests/versioning/test_shell.py        | 75 +++++++++----------
 migrate/tests/versioning/test_util.py         |  6 +-
 migrate/tests/versioning/test_version.py      | 26 +++----
 requirements.txt                              |  5 +-
 setup.cfg                                     | 48 ++++++++----
 setup.py                                      | 47 +++++-------
 test-requirements.txt                         | 28 +++++--
 tox.ini                                       |  4 +-
 48 files changed, 246 insertions(+), 220 deletions(-)
 create mode 100644 .testr.conf
 rename {docs => doc/source}/Makefile (100%)
 rename {docs => doc/source}/api.rst (100%)
 rename {docs => doc/source}/changelog.rst (100%)
 rename {docs => doc/source}/changeset.rst (100%)
 rename {docs => doc/source}/conf.py (100%)
 rename {docs => doc/source}/credits.rst (100%)
 rename {docs => doc/source}/download.rst (100%)
 rename {docs => doc/source}/faq.rst (100%)
 rename {docs => doc/source}/glossary.rst (100%)
 rename {docs => doc/source}/historical/ProjectDesignDecisionsAutomation.trac (100%)
 rename {docs => doc/source}/historical/ProjectDesignDecisionsScriptFormat.trac (100%)
 rename {docs => doc/source}/historical/ProjectDesignDecisionsVersioning.trac (100%)
 rename {docs => doc/source}/historical/ProjectDetailedDesign.trac (100%)
 rename {docs => doc/source}/historical/ProjectGoals.trac (100%)
 rename {docs => doc/source}/historical/ProjectProposal.txt (100%)
 rename {docs => doc/source}/historical/RepositoryFormat.trac (100%)
 rename {docs => doc/source}/historical/RepositoryFormat2.trac (100%)
 rename {docs => doc/source}/index.rst (100%)
 rename {docs => doc/source}/theme/almodovar.css (100%)
 rename {docs => doc/source}/theme/layout.css (100%)
 rename {docs => doc/source}/theme/layout.html (100%)
 rename {docs => doc/source}/tools.rst (100%)
 rename {docs => doc/source}/versioning.rst (100%)

diff --git a/.gitignore b/.gitignore
index 5a7c657..7432d66 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
+AUTHORS
+ChangeLog
+.tox/*
+.testrepository/*
 *.pyc
 *data/*
 *build/*
diff --git a/.testr.conf b/.testr.conf
new file mode 100644
index 0000000..748029b
--- /dev/null
+++ b/.testr.conf
@@ -0,0 +1,8 @@
+[DEFAULT]
+test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
+             OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
+             OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \
+             ${PYTHON:-python} -m subunit.run discover -t ./ . $LISTOPT $IDOPTION
+
+test_id_option=--load-list $IDFILE
+test_list_option=--list
diff --git a/MANIFEST.in b/MANIFEST.in
index 0f1c471..5b83d74 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,7 +1,8 @@
+include AUTHORS
+include ChangeLog
 include README
 recursive-include docs *
 recursive-include migrate *
 recursive-include tests *
 global-exclude *pyc
-exclude .hgtags
 recursive-exclude docs/_build *
diff --git a/README b/README
index c90cde5..19e7c13 100644
--- a/README
+++ b/README
@@ -34,9 +34,9 @@ To run automated tests:
 * Copy test_db.cfg.tmpl to test_db.cfg
 * Edit test_db.cfg with database connection strings suitable for running tests.
   (Use empty databases.)
-* $ pip install -r test-req.pip
+* $ pip install -r requirements.txt -r test-requirements.txt
 * $ python setup.py develop
-* $ nosetests
+* $ testr run --parallel
 
 Please report any issues with sqlalchemy-migrate to the issue tracker at
 `code.google.com issues
diff --git a/TODO b/TODO
index da88c94..46599c9 100644
--- a/TODO
+++ b/TODO
@@ -26,7 +26,6 @@ Unknown milestone
 - verbose output on migration failures
 - interactive migration script resolution?
 - backend for versioning management
-- port to unittest2
 
 Documentation updates in 0.6.1
 - glossary
diff --git a/docs/Makefile b/doc/source/Makefile
similarity index 100%
rename from docs/Makefile
rename to doc/source/Makefile
diff --git a/docs/api.rst b/doc/source/api.rst
similarity index 100%
rename from docs/api.rst
rename to doc/source/api.rst
diff --git a/docs/changelog.rst b/doc/source/changelog.rst
similarity index 100%
rename from docs/changelog.rst
rename to doc/source/changelog.rst
diff --git a/docs/changeset.rst b/doc/source/changeset.rst
similarity index 100%
rename from docs/changeset.rst
rename to doc/source/changeset.rst
diff --git a/docs/conf.py b/doc/source/conf.py
similarity index 100%
rename from docs/conf.py
rename to doc/source/conf.py
diff --git a/docs/credits.rst b/doc/source/credits.rst
similarity index 100%
rename from docs/credits.rst
rename to doc/source/credits.rst
diff --git a/docs/download.rst b/doc/source/download.rst
similarity index 100%
rename from docs/download.rst
rename to doc/source/download.rst
diff --git a/docs/faq.rst b/doc/source/faq.rst
similarity index 100%
rename from docs/faq.rst
rename to doc/source/faq.rst
diff --git a/docs/glossary.rst b/doc/source/glossary.rst
similarity index 100%
rename from docs/glossary.rst
rename to doc/source/glossary.rst
diff --git a/docs/historical/ProjectDesignDecisionsAutomation.trac b/doc/source/historical/ProjectDesignDecisionsAutomation.trac
similarity index 100%
rename from docs/historical/ProjectDesignDecisionsAutomation.trac
rename to doc/source/historical/ProjectDesignDecisionsAutomation.trac
diff --git a/docs/historical/ProjectDesignDecisionsScriptFormat.trac b/doc/source/historical/ProjectDesignDecisionsScriptFormat.trac
similarity index 100%
rename from docs/historical/ProjectDesignDecisionsScriptFormat.trac
rename to doc/source/historical/ProjectDesignDecisionsScriptFormat.trac
diff --git a/docs/historical/ProjectDesignDecisionsVersioning.trac b/doc/source/historical/ProjectDesignDecisionsVersioning.trac
similarity index 100%
rename from docs/historical/ProjectDesignDecisionsVersioning.trac
rename to doc/source/historical/ProjectDesignDecisionsVersioning.trac
diff --git a/docs/historical/ProjectDetailedDesign.trac b/doc/source/historical/ProjectDetailedDesign.trac
similarity index 100%
rename from docs/historical/ProjectDetailedDesign.trac
rename to doc/source/historical/ProjectDetailedDesign.trac
diff --git a/docs/historical/ProjectGoals.trac b/doc/source/historical/ProjectGoals.trac
similarity index 100%
rename from docs/historical/ProjectGoals.trac
rename to doc/source/historical/ProjectGoals.trac
diff --git a/docs/historical/ProjectProposal.txt b/doc/source/historical/ProjectProposal.txt
similarity index 100%
rename from docs/historical/ProjectProposal.txt
rename to doc/source/historical/ProjectProposal.txt
diff --git a/docs/historical/RepositoryFormat.trac b/doc/source/historical/RepositoryFormat.trac
similarity index 100%
rename from docs/historical/RepositoryFormat.trac
rename to doc/source/historical/RepositoryFormat.trac
diff --git a/docs/historical/RepositoryFormat2.trac b/doc/source/historical/RepositoryFormat2.trac
similarity index 100%
rename from docs/historical/RepositoryFormat2.trac
rename to doc/source/historical/RepositoryFormat2.trac
diff --git a/docs/index.rst b/doc/source/index.rst
similarity index 100%
rename from docs/index.rst
rename to doc/source/index.rst
diff --git a/docs/theme/almodovar.css b/doc/source/theme/almodovar.css
similarity index 100%
rename from docs/theme/almodovar.css
rename to doc/source/theme/almodovar.css
diff --git a/docs/theme/layout.css b/doc/source/theme/layout.css
similarity index 100%
rename from docs/theme/layout.css
rename to doc/source/theme/layout.css
diff --git a/docs/theme/layout.html b/doc/source/theme/layout.html
similarity index 100%
rename from docs/theme/layout.html
rename to doc/source/theme/layout.html
diff --git a/docs/tools.rst b/doc/source/tools.rst
similarity index 100%
rename from docs/tools.rst
rename to doc/source/tools.rst
diff --git a/docs/versioning.rst b/doc/source/versioning.rst
similarity index 100%
rename from docs/versioning.rst
rename to doc/source/versioning.rst
diff --git a/migrate/tests/changeset/test_changeset.py b/migrate/tests/changeset/test_changeset.py
index e1166f4..45cc046 100644
--- a/migrate/tests/changeset/test_changeset.py
+++ b/migrate/tests/changeset/test_changeset.py
@@ -44,11 +44,11 @@ class TestAddDropColumn(fixture.DB):
             self.refresh_table(self.table_name)
             result = len(self.table.c)
 
-            self.assertEquals(result, num_of_expected_cols),
+            self.assertEqual(result, num_of_expected_cols),
             if col_k.get('primary_key', None):
                 # new primary key: check its length too
                 result = len(self.table.primary_key)
-                self.assertEquals(result, num_of_expected_cols)
+                self.assertEqual(result, num_of_expected_cols)
 
         # we have 1 columns and there is no data column  
         assert_numcols(1)
@@ -485,7 +485,7 @@ class TestRename(fixture.DB):
             """
             if not skip_object_check:
                 # Table object check
-                self.assertEquals(self.table.name,expected)
+                self.assertEqual(self.table.name,expected)
                 newname = self.table.name
             else:
                 # we know the object's name isn't consistent: just assign it
@@ -493,12 +493,12 @@ class TestRename(fixture.DB):
             # Table DB check
             self.meta.clear()
             self.table = Table(newname, self.meta, autoload=True)
-            self.assertEquals(self.table.name, expected)
+            self.assertEqual(self.table.name, expected)
 
         def assert_index_name(expected, skip_object_check=False):
             if not skip_object_check:
                 # Index object check
-                self.assertEquals(self.index.name, expected)
+                self.assertEqual(self.index.name, expected)
             else:
                 # object is inconsistent
                 self.index.name = expected
@@ -583,7 +583,7 @@ class TestColumnChange(fixture.DB):
         # Table content should be preserved in changed columns
         content = "fgsfds"
         self.engine.execute(self.table.insert(), data=content, id=42)
-        self.assertEquals(num_rows(self.table.c.data, content), 1)
+        self.assertEqual(num_rows(self.table.c.data, content), 1)
 
         # ...as a function, given a column object and the new name
         alter_column('data', name='data2', table=self.table)
@@ -592,14 +592,14 @@ class TestColumnChange(fixture.DB):
         self.refresh_table(self.table.name)
         self.assert_('data' not in self.table.c.keys())
         self.assert_('atad' in self.table.c.keys())
-        self.assertEquals(num_rows(self.table.c.atad, content), 1)
+        self.assertEqual(num_rows(self.table.c.atad, content), 1)
 
         # ...as a method, given a new name
         self.table.c.atad.alter(name='data')
         self.refresh_table(self.table.name)
         self.assert_('atad' not in self.table.c.keys())
         self.table.c.data # Should not raise exception
-        self.assertEquals(num_rows(self.table.c.data, content), 1)
+        self.assertEqual(num_rows(self.table.c.data, content), 1)
 
         # ...as a function, given a new object
         alter_column(self.table.c.data,
@@ -608,7 +608,7 @@ class TestColumnChange(fixture.DB):
         self.refresh_table(self.table.name)
         self.assert_('data' not in self.table.c.keys())
         self.table.c.atad   # Should not raise exception
-        self.assertEquals(num_rows(self.table.c.atad, content), 1)
+        self.assertEqual(num_rows(self.table.c.atad, content), 1)
 
         # ...as a method, given a new object
         self.table.c.atad.alter(
@@ -618,7 +618,7 @@ class TestColumnChange(fixture.DB):
         self.refresh_table(self.table.name)
         self.assert_('atad' not in self.table.c.keys())
         self.table.c.data   # Should not raise exception
-        self.assertEquals(num_rows(self.table.c.data,content), 1)
+        self.assertEqual(num_rows(self.table.c.data,content), 1)
         
     @fixture.usedb()
     def test_type(self):
@@ -628,15 +628,15 @@ class TestColumnChange(fixture.DB):
         self.table.c.data.alter(type=String(43))
         self.refresh_table(self.table.name)
         self.assert_(isinstance(self.table.c.data.type, String))
-        self.assertEquals(self.table.c.data.type.length, 43)
+        self.assertEqual(self.table.c.data.type.length, 43)
 
         # Different type
         self.assert_(isinstance(self.table.c.id.type, Integer))
-        self.assertEquals(self.table.c.id.nullable, False)
+        self.assertEqual(self.table.c.id.nullable, False)
 
         if not self.engine.name == 'firebird':
             self.table.c.id.alter(type=String(20))
-            self.assertEquals(self.table.c.id.nullable, False)
+            self.assertEqual(self.table.c.id.nullable, False)
             self.refresh_table(self.table.name)
             self.assert_(isinstance(self.table.c.id.type, String))
 
@@ -646,13 +646,13 @@ class TestColumnChange(fixture.DB):
         Only DefaultClauses are changed here: others are managed by the 
         application / by SA
         """
-        self.assertEquals(self.table.c.data.server_default.arg, 'tluafed')
+        self.assertEqual(self.table.c.data.server_default.arg, 'tluafed')
 
         # Just the new default 
         default = 'my_default'
         self.table.c.data.alter(server_default=DefaultClause(default))
         self.refresh_table(self.table.name)
-        #self.assertEquals(self.table.c.data.server_default.arg,default)
+        #self.assertEqual(self.table.c.data.server_default.arg,default)
         # TextClause returned by autoload
         self.assert_(default in str(self.table.c.data.server_default.arg))
         self.engine.execute(self.table.insert(), id=12)
@@ -679,18 +679,18 @@ class TestColumnChange(fixture.DB):
     @fixture.usedb(not_supported='firebird')
     def test_null(self):
         """Can change a column's null constraint"""
-        self.assertEquals(self.table.c.data.nullable, True)
+        self.assertEqual(self.table.c.data.nullable, True)
 
         # Full column
         self.table.c.data.alter(type=String(40), nullable=False)
         self.table.nullable = None
         self.refresh_table(self.table.name)
-        self.assertEquals(self.table.c.data.nullable, False)
+        self.assertEqual(self.table.c.data.nullable, False)
 
         # Just the new status
         self.table.c.data.alter(nullable=True)
         self.refresh_table(self.table.name)
-        self.assertEquals(self.table.c.data.nullable, True)
+        self.assertEqual(self.table.c.data.nullable, True)
 
     @fixture.usedb()
     def test_alter_deprecated(self):
@@ -793,7 +793,7 @@ class TestColumnDelta(fixture.DB):
         self.delta = ColumnDelta(original, *p, **k)
         result = self.delta.keys()
         result.sort()
-        self.assertEquals(expected, result)
+        self.assertEqual(expected, result)
         return self.delta
 
     def test_deltas_two_columns(self):
@@ -885,8 +885,8 @@ class TestColumnDelta(fixture.DB):
 
         # Change name, given an up-to-date definition and the current name
         delta = self.verify(['name'], col_orig, name='blah')
-        self.assertEquals(delta.get('name'), 'blah')
-        self.assertEquals(delta.current_name, 'id')
+        self.assertEqual(delta.get('name'), 'blah')
+        self.assertEqual(delta.current_name, 'id')
 
         col_orig = self.mkcol(primary_key=True)
         self.verify(['name', 'type'], col_orig, name='id12', type=Text, alter_metadata=True)
diff --git a/migrate/tests/changeset/test_constraint.py b/migrate/tests/changeset/test_constraint.py
index f36698d..5527559 100644
--- a/migrate/tests/changeset/test_constraint.py
+++ b/migrate/tests/changeset/test_constraint.py
@@ -40,7 +40,7 @@ class CommonTestConstraint(fixture.DB):
         self.table.create()
 
         # make sure we start at zero
-        self.assertEquals(len(self.table.primary_key), 0)
+        self.assertEqual(len(self.table.primary_key), 0)
         self.assert_(isinstance(self.table.primary_key,
             schema.PrimaryKeyConstraint), self.table.primary_key.__class__)
 
@@ -67,7 +67,7 @@ class TestConstraint(CommonTestConstraint):
         #    pk.name = self.table.primary_key.name
         pk.drop()
         self.refresh_table()
-        self.assertEquals(len(self.table.primary_key), 0)
+        self.assertEqual(len(self.table.primary_key), 0)
         self.assert_(isinstance(self.table.primary_key, schema.PrimaryKeyConstraint))
         return pk
 
@@ -80,9 +80,9 @@ class TestConstraint(CommonTestConstraint):
 
         # Add a FK by creating a FK constraint
         if SQLA_07:
-            self.assertEquals(list(self.table.c.fkey.foreign_keys), [])
+            self.assertEqual(list(self.table.c.fkey.foreign_keys), [])
         else:
-            self.assertEquals(self.table.c.fkey.foreign_keys._list, [])
+            self.assertEqual(self.table.c.fkey.foreign_keys._list, [])
         fk = ForeignKeyConstraint([self.table.c.fkey],
                                   [self.table.c.id],
                                   name="fk_id_fkey",
@@ -92,9 +92,9 @@ class TestConstraint(CommonTestConstraint):
         else:
             self.assert_(self.table.c.fkey.foreign_keys._list is not [])
         for key in fk.columns:
-            self.assertEquals(key, self.table.c.fkey.name)
-        self.assertEquals([e.column for e in fk.elements], [self.table.c.id])
-        self.assertEquals(list(fk.referenced), [self.table.c.id])
+            self.assertEqual(key, self.table.c.fkey.name)
+        self.assertEqual([e.column for e in fk.elements], [self.table.c.id])
+        self.assertEqual(list(fk.referenced), [self.table.c.id])
 
         if self.url.startswith('mysql'):
             # MySQL FKs need an index
@@ -107,7 +107,7 @@ class TestConstraint(CommonTestConstraint):
             fkey = list(self.table.c.fkey.foreign_keys)[0]
         else:
             fkey = self.table.c.fkey.foreign_keys._list[0]
-        self.assertEquals(fkey.ondelete, "CASCADE")
+        self.assertEqual(fkey.ondelete, "CASCADE")
         # TODO: test on real db if it was set
 
         self.refresh_table()
@@ -119,9 +119,9 @@ class TestConstraint(CommonTestConstraint):
         fk.drop()
         self.refresh_table()
         if SQLA_07:
-            self.assertEquals(list(self.table.c.fkey.foreign_keys), [])
+            self.assertEqual(list(self.table.c.fkey.foreign_keys), [])
         else:
-            self.assertEquals(self.table.c.fkey.foreign_keys._list, [])
+            self.assertEqual(self.table.c.fkey.foreign_keys._list, [])
 
     @fixture.usedb()
     def test_define_pk(self):
@@ -203,7 +203,7 @@ class TestAutoname(CommonTestConstraint):
         cons.name = None
         cons.drop()
         self.refresh_table()
-        self.assertEquals(list(), list(self.table.primary_key))
+        self.assertEqual(list(), list(self.table.primary_key))
 
         # test string names
         cons = PrimaryKeyConstraint('id', table=self.table)
@@ -234,9 +234,9 @@ class TestAutoname(CommonTestConstraint):
         cons.drop()
         self.refresh_table()
         if SQLA_07:
-            self.assertEquals(list(self.table.c.fkey.foreign_keys), list())
+            self.assertEqual(list(self.table.c.fkey.foreign_keys), list())
         else:
-            self.assertEquals(self.table.c.fkey.foreign_keys._list, list())
+            self.assertEqual(self.table.c.fkey.foreign_keys._list, list())
 
         # test string names
         cons = ForeignKeyConstraint(['fkey'], ['%s.id' % self.tablename], table=self.table)
diff --git a/migrate/tests/fixture/__init__.py b/migrate/tests/fixture/__init__.py
index 09fc2ca..cfc67b4 100644
--- a/migrate/tests/fixture/__init__.py
+++ b/migrate/tests/fixture/__init__.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-import unittest2
+import testtools
 
 def main(imports=None):
     if imports:
@@ -10,7 +10,7 @@ def main(imports=None):
         defaultTest='fixture.suite'
     else:
         defaultTest=None
-    return unittest2.TestProgram(defaultTest=defaultTest)
+    return testtools.TestProgram(defaultTest=defaultTest)
 
 from base import Base
 from migrate.tests.fixture.pathed import Pathed
diff --git a/migrate/tests/fixture/base.py b/migrate/tests/fixture/base.py
index 67aabf8..38c91af 100644
--- a/migrate/tests/fixture/base.py
+++ b/migrate/tests/fixture/base.py
@@ -2,17 +2,11 @@
 # -*- coding: utf-8 -*-
 
 import re
-import unittest2
+import testtools
 
-class Base(unittest2.TestCase):
+class Base(testtools.TestCase):
 
-    def setup_method(self,func=None):
-        self.setUp()
-
-    def teardown_method(self,func=None):
-        self.tearDown()
-
-    def assertEqualsIgnoreWhitespace(self, v1, v2):
+    def assertEqualIgnoreWhitespace(self, v1, v2):
         """Compares two strings that should be\
         identical except for whitespace
         """
diff --git a/migrate/tests/integrated/test_docs.py b/migrate/tests/integrated/test_docs.py
index 6aed071..8e35427 100644
--- a/migrate/tests/integrated/test_docs.py
+++ b/migrate/tests/integrated/test_docs.py
@@ -6,7 +6,7 @@ from migrate.tests import fixture
 
 # Collect tests for all handwritten docs: doc/*.rst
 
-dir = ('..','..','..','docs')
+dir = ('..','..','..','doc','source')
 absdir = (os.path.dirname(os.path.abspath(__file__)),)+dir
 dirpath = os.path.join(*absdir)
 files = [f for f in os.listdir(dirpath) if f.endswith('.rst')]
diff --git a/migrate/tests/versioning/test_genmodel.py b/migrate/tests/versioning/test_genmodel.py
index db35aa4..e36bea1 100644
--- a/migrate/tests/versioning/test_genmodel.py
+++ b/migrate/tests/versioning/test_genmodel.py
@@ -4,7 +4,6 @@ import os
 
 import sqlalchemy
 from sqlalchemy import *
-from nose.tools import eq_
 
 from migrate.versioning import genmodel, schemadiff
 from migrate.changeset import schema
@@ -45,7 +44,7 @@ class TestSchemaDiff(fixture.DB):
 
         def assertDiff(isDiff, tablesMissingInDatabase, tablesMissingInModel, tablesWithDiff):
             diff = schemadiff.getDiffOfModelAgainstDatabase(self.meta, self.engine, excludeTables=['migrate_version'])
-            eq_(
+            self.assertEqual(
                 (diff.tables_missing_from_B,
                  diff.tables_missing_from_A,
                  diff.tables_different.keys(),
@@ -66,7 +65,7 @@ class TestSchemaDiff(fixture.DB):
         # Feature test for a recent SQLa feature;
         # expect different output in that case.
         if repr(String()) == 'String()':
-            self.assertEqualsIgnoreWhitespace(decls, '''
+            self.assertEqualIgnoreWhitespace(decls, '''
             from migrate.changeset import schema
             pre_meta = MetaData()
             post_meta = MetaData()
@@ -77,7 +76,7 @@ class TestSchemaDiff(fixture.DB):
             )
             ''')
         else:
-            self.assertEqualsIgnoreWhitespace(decls, '''
+            self.assertEqualIgnoreWhitespace(decls, '''
             from migrate.changeset import schema
             pre_meta = MetaData()
             post_meta = MetaData()
@@ -157,8 +156,8 @@ class TestSchemaDiff(fixture.DB):
             # Make sure data is still present.
             result = self.engine.execute(self.table.select(self.table.c.id==dataId))
             rows = result.fetchall()
-            eq_(len(rows), 1)
-            eq_(rows[0].name, 'mydata')
+            self.assertEqual(len(rows), 1)
+            self.assertEqual(rows[0].name, 'mydata')
 
             # Add data, later we'll make sure it's still present.
             result = self.engine.execute(self.table.insert(), id=2, name=u'mydata2', data2=123)
@@ -185,9 +184,9 @@ class TestSchemaDiff(fixture.DB):
             # Make sure data is still present.
             result = self.engine.execute(self.table.select(self.table.c.id==dataId2))
             rows = result.fetchall()
-            self.assertEquals(len(rows), 1)
-            self.assertEquals(rows[0].name, 'mydata2')
-            self.assertEquals(rows[0].data2, '123')
+            self.assertEqual(len(rows), 1)
+            self.assertEqual(rows[0].name, 'mydata2')
+            self.assertEqual(rows[0].data2, '123')
 
             # Delete data, since we're about to make a required column.
             # Not even using sqlalchemy.PassiveDefault helps because we're doing explicit column select.
diff --git a/migrate/tests/versioning/test_keyedinstance.py b/migrate/tests/versioning/test_keyedinstance.py
index b2f87ac..28f3b2b 100644
--- a/migrate/tests/versioning/test_keyedinstance.py
+++ b/migrate/tests/versioning/test_keyedinstance.py
@@ -35,7 +35,7 @@ class TestKeydInstance(fixture.Base):
         self.assert_(a10 is a11)
 
         # __init__ is called
-        self.assertEquals(a10.value,'a')
+        self.assertEqual(a10.value,'a')
 
         # clear() causes us to forget all existing instances
         Uniq1.clear()
diff --git a/migrate/tests/versioning/test_repository.py b/migrate/tests/versioning/test_repository.py
index a926f2c..7065368 100644
--- a/migrate/tests/versioning/test_repository.py
+++ b/migrate/tests/versioning/test_repository.py
@@ -7,7 +7,6 @@ import shutil
 from migrate import exceptions
 from migrate.versioning.repository import *
 from migrate.versioning.script import *
-from nose.tools import raises
 
 from migrate.tests import fixture
 from datetime import datetime
@@ -76,7 +75,7 @@ class TestVersionedRepository(fixture.Pathed):
         repos = Repository(self.path_repos)
 
         # Get latest version, or detect if a specified version exists
-        self.assertEquals(repos.latest, 0)
+        self.assertEqual(repos.latest, 0)
         # repos.latest isn't an integer, but a VerNum
         # (so we can't just assume the following tests are correct)
         self.assert_(repos.latest >= 0)
@@ -84,14 +83,14 @@ class TestVersionedRepository(fixture.Pathed):
 
         # Create a script and test again
         repos.create_script('')
-        self.assertEquals(repos.latest, 1)
+        self.assertEqual(repos.latest, 1)
         self.assert_(repos.latest >= 0)
         self.assert_(repos.latest >= 1)
         self.assert_(repos.latest < 2)
 
         # Create a new script and test again
         repos.create_script('')
-        self.assertEquals(repos.latest, 2)
+        self.assertEqual(repos.latest, 2)
         self.assert_(repos.latest >= 0)
         self.assert_(repos.latest >= 1)
         self.assert_(repos.latest >= 2)
@@ -103,7 +102,7 @@ class TestVersionedRepository(fixture.Pathed):
         repos.config.set('db_settings', 'use_timestamp_numbering', 'True')
 
         # Get latest version, or detect if a specified version exists
-        self.assertEquals(repos.latest, 0)
+        self.assertEqual(repos.latest, 0)
         # repos.latest isn't an integer, but a VerNum
         # (so we can't just assume the following tests are correct)
         self.assert_(repos.latest >= 0)
@@ -113,7 +112,7 @@ class TestVersionedRepository(fixture.Pathed):
         now = int(datetime.utcnow().strftime('%Y%m%d%H%M%S'))
         repos.create_script('')
         print repos.latest
-        self.assertEquals(repos.latest, now)
+        self.assertEqual(repos.latest, now)
 
     def test_source(self):
         """Get a script object by version number and view its source"""
@@ -148,7 +147,7 @@ class TestVersionedRepository(fixture.Pathed):
         def check_changeset(params, length):
             """Creates and verifies a changeset"""
             changeset = repos.changeset('postgres', *params)
-            self.assertEquals(len(changeset), length)
+            self.assertEqual(len(changeset), length)
             self.assertTrue(isinstance(changeset, Changeset))
             uniq = list()
             # Changesets are iterable
@@ -161,10 +160,10 @@ class TestVersionedRepository(fixture.Pathed):
 
         # Upgrade to a specified version...
         cs = check_changeset((0, 10), 10)
-        self.assertEquals(cs.keys().pop(0),0 ) # 0 -> 1: index is starting version
-        self.assertEquals(cs.keys().pop(), 9) # 9 -> 10: index is starting version
-        self.assertEquals(cs.start, 0) # starting version
-        self.assertEquals(cs.end, 10) # ending version
+        self.assertEqual(cs.keys().pop(0),0 ) # 0 -> 1: index is starting version
+        self.assertEqual(cs.keys().pop(), 9) # 9 -> 10: index is starting version
+        self.assertEqual(cs.start, 0) # starting version
+        self.assertEqual(cs.end, 10) # ending version
         check_changeset((0, 1), 1)
         check_changeset((0, 5), 5)
         check_changeset((0, 0), 0)
@@ -178,10 +177,10 @@ class TestVersionedRepository(fixture.Pathed):
 
         # Upgrade to the latest version...
         cs = check_changeset((0,), 10)
-        self.assertEquals(cs.keys().pop(0), 0)
-        self.assertEquals(cs.keys().pop(), 9)
-        self.assertEquals(cs.start, 0)
-        self.assertEquals(cs.end, 10)
+        self.assertEqual(cs.keys().pop(0), 0)
+        self.assertEqual(cs.keys().pop(), 9)
+        self.assertEqual(cs.start, 0)
+        self.assertEqual(cs.end, 10)
         check_changeset((1,), 9)
         check_changeset((5,), 5)
         check_changeset((9,), 1)
@@ -196,10 +195,10 @@ class TestVersionedRepository(fixture.Pathed):
 
         # Downgrade
         cs = check_changeset((10, 0),10)
-        self.assertEquals(cs.keys().pop(0), 10) # 10 -> 9
-        self.assertEquals(cs.keys().pop(), 1)    # 1 -> 0
-        self.assertEquals(cs.start, 10)
-        self.assertEquals(cs.end, 0)
+        self.assertEqual(cs.keys().pop(0), 10) # 10 -> 9
+        self.assertEqual(cs.keys().pop(), 1)    # 1 -> 0
+        self.assertEqual(cs.start, 10)
+        self.assertEqual(cs.end, 0)
         check_changeset((10, 5), 5)
         check_changeset((5, 0), 5)
         
diff --git a/migrate/tests/versioning/test_runchangeset.py b/migrate/tests/versioning/test_runchangeset.py
index 52b0215..12bc77c 100644
--- a/migrate/tests/versioning/test_runchangeset.py
+++ b/migrate/tests/versioning/test_runchangeset.py
@@ -31,22 +31,22 @@ class TestRunChangeset(fixture.Pathed,fixture.DB):
 
         # Scripts are empty; we'll check version # correctness.
         # (Correct application of their content is checked elsewhere)
-        self.assertEquals(db.version,0)
+        self.assertEqual(db.version,0)
         db.upgrade(1)
-        self.assertEquals(db.version,1)
+        self.assertEqual(db.version,1)
         db.upgrade(5)
-        self.assertEquals(db.version,5)
+        self.assertEqual(db.version,5)
         db.upgrade(5)
-        self.assertEquals(db.version,5)
+        self.assertEqual(db.version,5)
         db.upgrade(None) # Latest is implied
-        self.assertEquals(db.version,10)
+        self.assertEqual(db.version,10)
         self.assertRaises(Exception,db.upgrade,11)
-        self.assertEquals(db.version,10)
+        self.assertEqual(db.version,10)
         db.upgrade(9)
-        self.assertEquals(db.version,9)
+        self.assertEqual(db.version,9)
         db.upgrade(0)
-        self.assertEquals(db.version,0)
+        self.assertEqual(db.version,0)
         self.assertRaises(Exception,db.upgrade,-1)
-        self.assertEquals(db.version,0)
+        self.assertEqual(db.version,0)
         #changeset = repos.changeset(self.url,0)
         db.drop()
diff --git a/migrate/tests/versioning/test_schema.py b/migrate/tests/versioning/test_schema.py
index 8b0033c..7502783 100644
--- a/migrate/tests/versioning/test_schema.py
+++ b/migrate/tests/versioning/test_schema.py
@@ -56,16 +56,16 @@ class TestControlledSchema(fixture.Pathed, fixture.DB):
         
         # We can load a controlled DB this way, too
         dbcontrol0 = ControlledSchema(self.engine, self.repos)
-        self.assertEquals(dbcontrol, dbcontrol0)
+        self.assertEqual(dbcontrol, dbcontrol0)
 
         # We can also use a repository path, instead of a repository
         dbcontrol0 = ControlledSchema(self.engine, self.repos.path)
-        self.assertEquals(dbcontrol, dbcontrol0)
+        self.assertEqual(dbcontrol, dbcontrol0)
 
         # We don't have to use the same connection
         engine = create_engine(self.url)
         dbcontrol0 = ControlledSchema(engine, self.repos.path)
-        self.assertEquals(dbcontrol, dbcontrol0)
+        self.assertEqual(dbcontrol, dbcontrol0)
 
         # Clean up: 
         dbcontrol.drop()
@@ -83,11 +83,11 @@ class TestControlledSchema(fixture.Pathed, fixture.DB):
         # Establish version control on this database
         version = 0
         dbcontrol = ControlledSchema.create(self.engine, self.repos, version)
-        self.assertEquals(dbcontrol.version, version)
+        self.assertEqual(dbcontrol.version, version)
         
         # Correct when we load it, too
         dbcontrol = ControlledSchema(self.engine, self.repos)
-        self.assertEquals(dbcontrol.version, version)
+        self.assertEqual(dbcontrol.version, version)
 
         dbcontrol.drop()
 
@@ -95,16 +95,16 @@ class TestControlledSchema(fixture.Pathed, fixture.DB):
         version = 10
         for i in range(version):
             self.repos.create_script('')
-        self.assertEquals(self.repos.latest, version)
+        self.assertEqual(self.repos.latest, version)
 
         # Test with some mid-range value
         dbcontrol = ControlledSchema.create(self.engine,self.repos, 5)
-        self.assertEquals(dbcontrol.version, 5)
+        self.assertEqual(dbcontrol.version, 5)
         dbcontrol.drop()
 
         # Test with max value
         dbcontrol = ControlledSchema.create(self.engine, self.repos, version)
-        self.assertEquals(dbcontrol.version, version)
+        self.assertEqual(dbcontrol.version, version)
         dbcontrol.drop()
 
     @fixture.usedb()
@@ -132,7 +132,7 @@ class TestControlledSchema(fixture.Pathed, fixture.DB):
 
         for i in range(5):
             self.repos.create_script('')
-        self.assertEquals(self.repos.latest, 5)
+        self.assertEqual(self.repos.latest, 5)
 
         cs = dbschema.changeset(5)
         self.assertEqual(len(cs), 5)
@@ -147,7 +147,7 @@ class TestControlledSchema(fixture.Pathed, fixture.DB):
         for i in range(10):
             self.repos.create_script('')
 
-        self.assertEquals(self.repos.latest, 10)
+        self.assertEqual(self.repos.latest, 10)
 
         dbschema.upgrade(10)
 
diff --git a/migrate/tests/versioning/test_schemadiff.py b/migrate/tests/versioning/test_schemadiff.py
index e935eb1..74714e2 100644
--- a/migrate/tests/versioning/test_schemadiff.py
+++ b/migrate/tests/versioning/test_schemadiff.py
@@ -3,7 +3,6 @@
 import os
 
 from sqlalchemy import *
-from nose.tools import eq_
 
 from migrate.versioning import schemadiff
 
@@ -27,12 +26,12 @@ class SchemaDiffBase(fixture.DB):
         diff = self._run_diff()
         # print diff
         self.assertTrue(diff)
-        eq_(1,len(diff.tables_different))
+        self.assertEqual(1,len(diff.tables_different))
         td = diff.tables_different.values()[0]
-        eq_(1,len(td.columns_different))
+        self.assertEqual(1,len(td.columns_different))
         cd = td.columns_different.values()[0]
         label_width = max(len(self.name1), len(self.name2))
-        eq_(('Schema diffs:\n'
+        self.assertEqual(('Schema diffs:\n'
              '  table with differences: xtable\n'
              '    column with differences: data\n'
              '      %*s: %r\n'
@@ -59,7 +58,7 @@ class Test_getDiffOfModelAgainstDatabase(SchemaDiffBase):
         self._make_table(create=False)
         diff = self._run_diff()
         self.assertTrue(diff)
-        eq_('Schema diffs:\n  tables missing from %s: xtable' % self.name2,
+        self.assertEqual('Schema diffs:\n  tables missing from %s: xtable' % self.name2,
             str(diff))
 
     @fixture.usedb()
@@ -68,7 +67,7 @@ class Test_getDiffOfModelAgainstDatabase(SchemaDiffBase):
         self.meta.clear()
         diff = self._run_diff()
         self.assertTrue(diff)
-        eq_('Schema diffs:\n  tables missing from %s: xtable' % self.name1,
+        self.assertEqual('Schema diffs:\n  tables missing from %s: xtable' % self.name1,
             str(diff))
 
     @fixture.usedb()
@@ -86,7 +85,7 @@ class Test_getDiffOfModelAgainstDatabase(SchemaDiffBase):
         # run diff
         diff = self._run_diff()
         self.assertTrue(diff)
-        eq_('Schema diffs:\n'
+        self.assertEqual('Schema diffs:\n'
             '  table with differences: xtable\n'
             '    %s missing these columns: xcol' % self.name2,
             str(diff))
@@ -105,7 +104,7 @@ class Test_getDiffOfModelAgainstDatabase(SchemaDiffBase):
         # run diff
         diff = self._run_diff()
         self.assertTrue(diff)
-        eq_('Schema diffs:\n'
+        self.assertEqual('Schema diffs:\n'
             '  table with differences: xtable\n'
             '    %s missing these columns: xcol' % self.name1,
             str(diff))
@@ -134,14 +133,14 @@ class Test_getDiffOfModelAgainstDatabase(SchemaDiffBase):
         # ztable identical on both
         # ...so we expect no diff!
         self.assertFalse(diff)
-        eq_('No schema diffs',str(diff))
+        self.assertEqual('No schema diffs',str(diff))
 
     @fixture.usedb()
     def test_identical_just_pk(self):
         self._make_table()
         diff = self._run_diff()
         self.assertFalse(diff)
-        eq_('No schema diffs',str(diff))
+        self.assertEqual('No schema diffs',str(diff))
 
 
     @fixture.usedb()
@@ -192,7 +191,7 @@ class Test_getDiffOfModelAgainstDatabase(SchemaDiffBase):
             Column('data', Integer()),
             )
         diff = self._run_diff()
-        eq_('No schema diffs',str(diff))
+        self.assertEqual('No schema diffs',str(diff))
         self.assertFalse(diff)
         
     @fixture.usedb()
@@ -201,7 +200,7 @@ class Test_getDiffOfModelAgainstDatabase(SchemaDiffBase):
             Column('data', String(10)),
             )
         diff = self._run_diff()
-        eq_('No schema diffs',str(diff))
+        self.assertEqual('No schema diffs',str(diff))
         self.assertFalse(diff)
 
     @fixture.usedb()
@@ -210,7 +209,7 @@ class Test_getDiffOfModelAgainstDatabase(SchemaDiffBase):
             Column('data', Text),
             )
         diff = self._run_diff()
-        eq_('No schema diffs',str(diff))
+        self.assertEqual('No schema diffs',str(diff))
         self.assertFalse(diff)
 
 class Test_getDiffOfModelAgainstModel(Test_getDiffOfModelAgainstDatabase):
diff --git a/migrate/tests/versioning/test_script.py b/migrate/tests/versioning/test_script.py
index 53ef929..b52ddaa 100644
--- a/migrate/tests/versioning/test_script.py
+++ b/migrate/tests/versioning/test_script.py
@@ -126,7 +126,7 @@ def upgrade(migrate_engine):
 
         pyscript = self.cls(path)
         SQL = pyscript.preview_sql(self.url, 1)
-        self.assertEqualsIgnoreWhitespace("""
+        self.assertEqualIgnoreWhitespace("""
         CREATE TABLE "Link"
         ("link1ID" INTEGER,
         "link2ID" INTEGER,
diff --git a/migrate/tests/versioning/test_shell.py b/migrate/tests/versioning/test_shell.py
index 4b89c28..0bf5e22 100644
--- a/migrate/tests/versioning/test_shell.py
+++ b/migrate/tests/versioning/test_shell.py
@@ -7,7 +7,6 @@ import tempfile
 
 from cStringIO import StringIO
 from sqlalchemy import MetaData, Table
-from nose.plugins.skip import SkipTest
 
 from migrate.exceptions import *
 from migrate.versioning.repository import Repository
@@ -48,7 +47,7 @@ class TestShellCommands(Shell):
 
     def test_main_with_runpy(self):
         if sys.version_info[:2] == (2, 4):
-            raise SkipTest("runpy is not part of python2.4")
+            self.skipTest("runpy is not part of python2.4")
         from runpy import run_module
         try:
             original = sys.argv
@@ -271,50 +270,50 @@ class TestShellDatabase(Shell, DB):
         repos_name = 'repos_name'
         repos_path = self.tmp()
         result = self.env.run('migrate create %(repos_path)s %(repos_name)s' % locals())
-        self.assertEquals(self.run_version(repos_path), 0)
+        self.assertEqual(self.run_version(repos_path), 0)
 
         # Version the DB
         result = self.env.run('migrate drop_version_control %s %s' % (self.url, repos_path), expect_error=True)
         result = self.env.run('migrate version_control %s %s' % (self.url, repos_path))
 
         # Upgrades with latest version == 0
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
         result = self.env.run('migrate upgrade %s %s' % (self.url, repos_path))
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
         result = self.env.run('migrate upgrade %s %s' % (self.url, repos_path))
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
         result = self.env.run('migrate upgrade %s %s 1' % (self.url, repos_path), expect_error=True)
-        self.assertEquals(result.returncode, 1)
+        self.assertEqual(result.returncode, 1)
         result = self.env.run('migrate upgrade %s %s -1' % (self.url, repos_path), expect_error=True)
-        self.assertEquals(result.returncode, 2)
+        self.assertEqual(result.returncode, 2)
 
         # Add a script to the repository; upgrade the db
         result = self.env.run('migrate script Desc --repository=%s' % (repos_path))
-        self.assertEquals(self.run_version(repos_path), 1)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_version(repos_path), 1)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
 
         # Test preview
         result = self.env.run('migrate upgrade %s %s 0 --preview_sql' % (self.url, repos_path))
         result = self.env.run('migrate upgrade %s %s 0 --preview_py' % (self.url, repos_path))
 
         result = self.env.run('migrate upgrade %s %s' % (self.url, repos_path))
-        self.assertEquals(self.run_db_version(self.url, repos_path), 1)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 1)
         
         # Downgrade must have a valid version specified
         result = self.env.run('migrate downgrade %s %s' % (self.url, repos_path), expect_error=True)
-        self.assertEquals(result.returncode, 2)
+        self.assertEqual(result.returncode, 2)
         result = self.env.run('migrate downgrade %s %s -1' % (self.url, repos_path), expect_error=True)
-        self.assertEquals(result.returncode, 2)
+        self.assertEqual(result.returncode, 2)
         result = self.env.run('migrate downgrade %s %s 2' % (self.url, repos_path), expect_error=True)
-        self.assertEquals(result.returncode, 2)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 1)
+        self.assertEqual(result.returncode, 2)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 1)
         
         result = self.env.run('migrate downgrade %s %s 0' % (self.url, repos_path))
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
         
         result = self.env.run('migrate downgrade %s %s 1' % (self.url, repos_path), expect_error=True)
-        self.assertEquals(result.returncode, 2)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(result.returncode, 2)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
 
         result = self.env.run('migrate drop_version_control %s %s' % (self.url, repos_path))
 
@@ -326,26 +325,26 @@ class TestShellDatabase(Shell, DB):
         result = self.env.run('migrate create %s %s' % (repos_path, repos_name))
         result = self.env.run('migrate drop_version_control %s %s' % (self.url, repos_path), expect_error=True)
         result = self.env.run('migrate version_control %s %s' % (self.url, repos_path))
-        self.assertEquals(self.run_version(repos_path), 0)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_version(repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
 
         beforeCount = len(os.listdir(os.path.join(repos_path, 'versions')))  # hmm, this number changes sometimes based on running from svn
         result = self.env.run('migrate script_sql %s --repository=%s' % ('postgres', repos_path))
-        self.assertEquals(self.run_version(repos_path), 1)
-        self.assertEquals(len(os.listdir(os.path.join(repos_path, 'versions'))), beforeCount + 2)
+        self.assertEqual(self.run_version(repos_path), 1)
+        self.assertEqual(len(os.listdir(os.path.join(repos_path, 'versions'))), beforeCount + 2)
 
         open('%s/versions/001_postgres_upgrade.sql' % repos_path, 'a').write(upgrade_script)
         open('%s/versions/001_postgres_downgrade.sql' % repos_path, 'a').write(downgrade_script)
 
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
         self.assertRaises(Exception, self.engine.text('select * from t_table').execute)
 
         result = self.env.run('migrate upgrade %s %s' % (self.url, repos_path))
-        self.assertEquals(self.run_db_version(self.url, repos_path), 1)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 1)
         self.engine.text('select * from t_table').execute()
 
         result = self.env.run('migrate downgrade %s %s 0' % (self.url, repos_path))
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
         self.assertRaises(Exception, self.engine.text('select * from t_table').execute)
 
     # The tests below are written with some postgres syntax, but the stuff
@@ -387,14 +386,14 @@ class TestShellDatabase(Shell, DB):
         result = self.env.run('migrate create repository_name --repository=%s' % repos_path)
         result = self.env.run('migrate drop_version_control %s %s' % (self.url, repos_path), expect_error=True)
         result = self.env.run('migrate version_control %s %s' % (self.url, repos_path))
-        self.assertEquals(self.run_version(repos_path), 0)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_version(repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
 
         # Empty script should succeed
         result = self.env.run('migrate script Desc %s' % repos_path)
         result = self.env.run('migrate test %s %s' % (self.url, repos_path))
-        self.assertEquals(self.run_version(repos_path), 1)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_version(repos_path), 1)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
 
         # Error script should fail
         script_path = self.tmp_py()
@@ -416,8 +415,8 @@ class TestShellDatabase(Shell, DB):
 
         result = self.env.run('migrate test %s %s bla' % (self.url, repos_path), expect_error=True)
         self.assertEqual(result.returncode, 2)
-        self.assertEquals(self.run_version(repos_path), 1)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_version(repos_path), 1)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
 
         # Nonempty script using migrate_engine should succeed
         script_path = self.tmp_py()
@@ -446,8 +445,8 @@ class TestShellDatabase(Shell, DB):
         file.write(script_text)
         file.close()
         result = self.env.run('migrate test %s %s' % (self.url, repos_path))
-        self.assertEquals(self.run_version(repos_path), 1)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_version(repos_path), 1)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
         
     @usedb()
     def test_rundiffs_in_shell(self):
@@ -468,8 +467,8 @@ class TestShellDatabase(Shell, DB):
         result = self.env.run('migrate create %s %s' % (repos_path, repos_name))
         result = self.env.run('migrate drop_version_control %s %s' % (self.url, repos_path), expect_error=True)
         result = self.env.run('migrate version_control %s %s' % (self.url, repos_path))
-        self.assertEquals(self.run_version(repos_path), 0)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)
+        self.assertEqual(self.run_version(repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)
 
         # Setup helper script.
         result = self.env.run('migrate manage %s --repository=%s --url=%s --model=%s'\
@@ -491,8 +490,8 @@ class TestShellDatabase(Shell, DB):
         # Update db to latest model.
         result = self.env.run('migrate update_db_from_model %s %s %s'\
             % (self.url, repos_path, model_module))
-        self.assertEquals(self.run_version(repos_path), 0)
-        self.assertEquals(self.run_db_version(self.url, repos_path), 0)  # version did not get bumped yet because new version not yet created
+        self.assertEqual(self.run_version(repos_path), 0)
+        self.assertEqual(self.run_db_version(self.url, repos_path), 0)  # version did not get bumped yet because new version not yet created
 
         result = self.env.run('migrate compare_model_to_db %s %s %s'\
             % (self.url, repos_path, model_module))
@@ -520,7 +519,7 @@ class TestShellDatabase(Shell, DB):
 
         #result_script = self.env.run('migrate make_update_script_for_model %s %s %s %s'\
             #% (self.url, repos_path, old_model_module, model_module))
-        #self.assertEqualsIgnoreWhitespace(result_script.stdout,
+        #self.assertEqualIgnoreWhitespace(result_script.stdout,
         #'''from sqlalchemy import *
         #from migrate import *
 
diff --git a/migrate/tests/versioning/test_util.py b/migrate/tests/versioning/test_util.py
index 6b22b7a..b6b1490 100644
--- a/migrate/tests/versioning/test_util.py
+++ b/migrate/tests/versioning/test_util.py
@@ -24,11 +24,11 @@ class TestUtil(fixture.Pathed):
 
         # keyword arg
         engine = construct_engine(url, engine_arg_encoding='utf-8')
-        self.assertEquals(engine.dialect.encoding, 'utf-8')
+        self.assertEqual(engine.dialect.encoding, 'utf-8')
 
         # dict
         engine = construct_engine(url, engine_dict={'encoding': 'utf-8'})
-        self.assertEquals(engine.dialect.encoding, 'utf-8')
+        self.assertEqual(engine.dialect.encoding, 'utf-8')
 
         # engine parameter
         engine_orig = create_engine('sqlite://')
@@ -38,7 +38,7 @@ class TestUtil(fixture.Pathed):
         # test precedance
         engine = construct_engine(url, engine_dict={'encoding': 'iso-8859-1'},
             engine_arg_encoding='utf-8')
-        self.assertEquals(engine.dialect.encoding, 'utf-8')
+        self.assertEqual(engine.dialect.encoding, 'utf-8')
 
         # deprecated echo=True parameter
         try:
diff --git a/migrate/tests/versioning/test_version.py b/migrate/tests/versioning/test_version.py
index 253642f..436d5f9 100644
--- a/migrate/tests/versioning/test_version.py
+++ b/migrate/tests/versioning/test_version.py
@@ -76,14 +76,14 @@ class TestVersion(fixture.Pathed):
         super(TestVersion, self).setUp()
 
     def test_str_to_filename(self):
-        self.assertEquals(str_to_filename(''), '')
-        self.assertEquals(str_to_filename('__'), '_')
-        self.assertEquals(str_to_filename('a'), 'a')
-        self.assertEquals(str_to_filename('Abc Def'), 'Abc_Def')
-        self.assertEquals(str_to_filename('Abc "D" Ef'), 'Abc_D_Ef')
-        self.assertEquals(str_to_filename("Abc's Stuff"), 'Abc_s_Stuff')
-        self.assertEquals(str_to_filename("a      b"), 'a_b')
-        self.assertEquals(str_to_filename("a.b to c"), 'a_b_to_c')
+        self.assertEqual(str_to_filename(''), '')
+        self.assertEqual(str_to_filename('__'), '_')
+        self.assertEqual(str_to_filename('a'), 'a')
+        self.assertEqual(str_to_filename('Abc Def'), 'Abc_Def')
+        self.assertEqual(str_to_filename('Abc "D" Ef'), 'Abc_D_Ef')
+        self.assertEqual(str_to_filename("Abc's Stuff"), 'Abc_s_Stuff')
+        self.assertEqual(str_to_filename("a      b"), 'a_b')
+        self.assertEqual(str_to_filename("a.b to c"), 'a_b_to_c')
 
     def test_collection(self):
         """Let's see how we handle versions collection"""
@@ -142,19 +142,19 @@ class TestVersion(fixture.Pathed):
             open(filepath, 'w').close()
 
         ver = Version(1, path, [sqlite_upgrade_file])
-        self.assertEquals(os.path.basename(ver.script('sqlite', 'upgrade').path), sqlite_upgrade_file)
+        self.assertEqual(os.path.basename(ver.script('sqlite', 'upgrade').path), sqlite_upgrade_file)
     
         ver = Version(1, path, [default_upgrade_file])
-        self.assertEquals(os.path.basename(ver.script('default', 'upgrade').path), default_upgrade_file)
+        self.assertEqual(os.path.basename(ver.script('default', 'upgrade').path), default_upgrade_file)
     
         ver = Version(1, path, [sqlite_upgrade_file, default_upgrade_file])
-        self.assertEquals(os.path.basename(ver.script('sqlite', 'upgrade').path), sqlite_upgrade_file)
+        self.assertEqual(os.path.basename(ver.script('sqlite', 'upgrade').path), sqlite_upgrade_file)
     
         ver = Version(1, path, [sqlite_upgrade_file, default_upgrade_file, python_file])
-        self.assertEquals(os.path.basename(ver.script('postgres', 'upgrade').path), default_upgrade_file)
+        self.assertEqual(os.path.basename(ver.script('postgres', 'upgrade').path), default_upgrade_file)
 
         ver = Version(1, path, [sqlite_upgrade_file, python_file])
-        self.assertEquals(os.path.basename(ver.script('postgres', 'upgrade').path), python_file)
+        self.assertEqual(os.path.basename(ver.script('postgres', 'upgrade').path), python_file)
 
     def test_bad_version(self):
         ver = Version(1, self.temp_usable_dir, [])
diff --git a/requirements.txt b/requirements.txt
index 2599c00..d454507 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,6 @@
+d2to1>=0.2.10,<0.3
+pbr>=0.5,<0.6
+
 SQLAlchemy >= 0.6
 decorator
 Tempita >= 0.4
-Sphinx
-sphinxcontrib_issuetracker
diff --git a/setup.cfg b/setup.cfg
index d20401b..f4ddf34 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,18 +1,40 @@
+[metadata]
+name = sqlalchemy-migrate
+summary = Database schema migration for SQLAlchemy
+description-file =
+    README
+author = OpenStack
+author-email = openstack-dev@lists.openstack.org
+home-page = http://www.openstack.org/
+classifier =
+    Environment :: OpenStack
+    Intended Audience :: Information Technology
+    Intended Audience :: System Administrators
+    License :: OSI Approved :: Apache Software License
+    Operating System :: POSIX :: Linux
+    Programming Language :: Python
+    Programming Language :: Python :: 2
+    Programming Language :: Python :: 2.7
+    Programming Language :: Python :: 2.6
+
+[global]
+setup-hooks =
+    pbr.hooks.setup_hook
+
+[files]
+packages =
+    migrate
+
+[entry_points]
+console_scripts =
+    migrate = migrate.versioning.shell:main
+    migrate-repository = migrate.versioning.migrate_repository:main
+
 [build_sphinx]
-source-dir = docs
-build-dir = docs/_build
+all_files = 1
+build-dir = doc/build
+source-dir = doc/source
 
 [egg_info]
 tag_svn_revision = 1
 tag_build = .dev
-
-[nosetests]
-# uncomment these if you want tests to drop to pdb on first 
-# error or failure.
-#nologcapture =
-#pdb = 
-#pdb-failures = 
-#stop = 
-
-[aliases]
-release = egg_info -RDb ''
diff --git a/setup.py b/setup.py
index 24d4c30..b3e85a7 100644
--- a/setup.py
+++ b/setup.py
@@ -1,34 +1,21 @@
-#!/usr/bin/python
-
-import os
+#!/usr/bin/env python
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 import setuptools
 
-required_deps = ['SQLAlchemy >= 0.6', 'decorator', 'Tempita >= 0.4']
-readme_file = open(os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                'README'))
-
 setuptools.setup(
-    name = "sqlalchemy-migrate",
-    version = "0.7.3",
-    packages = setuptools.find_packages(exclude=["migrate.tests*"]),
-    include_package_data = True,
-    description = "Database schema migration for SQLAlchemy",
-    long_description = readme_file.read(),
-    install_requires = required_deps,
-    extras_require = {
-        'docs' : ['sphinx >= 0.5'],
-    },
-    author = "Evan Rosson",
-    author_email = "evan.rosson@gmail.com",
-    url = "http://code.google.com/p/sqlalchemy-migrate/",
-    maintainer = "Jan Dittberner",
-    maintainer_email = "jan@dittberner.info",
-    license = "MIT",
-    entry_points = """
-    [console_scripts]
-    migrate = migrate.versioning.shell:main
-    migrate-repository = migrate.versioning.migrate_repository:main
-    """,
-    test_suite = "nose.collector",
-)
+    setup_requires=['d2to1>=0.2.10,<0.3', 'pbr>=0.5.10,<0.6'],
+    d2to1=True)
diff --git a/test-requirements.txt b/test-requirements.txt
index 273f886..24d5626 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -1,11 +1,25 @@
-coverage
-nose
-nosexcover
+# Install bounded pep8/pyflakes first, then let flake8 install
+pep8==1.4.5
+pyflakes==0.7.2
+flake8==2.0
+hacking>=0.5.3,<0.6
+
+coverage>=3.6
+discover
+feedparser
+fixtures>=0.3.12
+mox==0.5.3
+MySQL-python
+psycopg2
+pylint==0.25.2
+python-subunit
+setuptools_git>=0.4
+sphinx>=1.1.2
+sphinxcontrib_issuetracker
+testrepository>=0.0.13
+testtools>=0.9.27
+
 # NOTE: scripttest 1.0.1 removes base_path argument to ScriptTest
 scripttest==1.0
 pytz
-psycopg2
 pysqlite
-mysql-python
-virtualenv
-unittest2
diff --git a/tox.ini b/tox.ini
index efbb9f6..eca9a3f 100644
--- a/tox.ini
+++ b/tox.ini
@@ -6,7 +6,7 @@ setenv = VIRTUAL_ENV={envdir}
 deps = -r{toxinidir}/requirements.txt
        -r{toxinidir}/test-requirements.txt
 commands =
-  nosetests {posargs}
+  python setup.py testr --slowest --testr-args='{posargs}'
 
 [testenv:pep8]
 commands = flake8
@@ -17,7 +17,7 @@ commands = {posargs}
 [testenv:cover]
 setenv = VIRTUAL_ENV={envdir}
 commands =
-  nosetests {posargs}
+  python setup.py testr --slowest --testr-args='{posargs}'
 
 [flake8]
 # F841 local variable 'json_template' is assigned to but never used