Skip to content

Commit

Permalink
python#10712: 2to3 has a new "asserts" fixer that replaces deprecated…
Browse files Browse the repository at this point in the history
… names of unittest methods.
  • Loading branch information
ezio-melotti committed Nov 23, 2013
1 parent 7571941 commit 6bdd986
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 0 deletions.
33 changes: 33 additions & 0 deletions Doc/library/2to3.rst
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,39 @@ and off individually. They are described here in more detail.
Removes usage of :func:`apply`. For example ``apply(function, *args,
**kwargs)`` is converted to ``function(*args, **kwargs)``.
.. 2to3fixer:: asserts
Replaces deprecated :mod:`unittest` method names with the correct ones.
================================ ==========================================
From To
================================ ==========================================
``failUnlessEqual(a, b)`` :meth:`assertEqual(a, b)
<unittest.TestCase.assertEqual>`
``assertEquals(a, b)`` :meth:`assertEqual(a, b)
<unittest.TestCase.assertEqual>`
``failIfEqual(a, b)`` :meth:`assertNotEqual(a, b)
<unittest.TestCase.assertNotEqual>`
``assertNotEquals(a, b)`` :meth:`assertNotEqual(a, b)
<unittest.TestCase.assertNotEqual>`
``failUnless(a)`` :meth:`assertTrue(a)
<unittest.TestCase.assertTrue>`
``assert_(a)`` :meth:`assertTrue(a)
<unittest.TestCase.assertTrue>`
``failIf(a)`` :meth:`assertFalse(a)
<unittest.TestCase.assertFalse>`
``failUnlessRaises(exc, cal)`` :meth:`assertRaises(exc, cal)
<unittest.TestCase.assertRaises>`
``failUnlessAlmostEqual(a, b)`` :meth:`assertAlmostEqual(a, b)
<unittest.TestCase.assertAlmostEqual>`
``assertAlmostEquals(a, b)`` :meth:`assertAlmostEqual(a, b)
<unittest.TestCase.assertAlmostEqual>`
``failIfAlmostEqual(a, b)`` :meth:`assertNotAlmostEqual(a, b)
<unittest.TestCase.assertNotAlmostEqual>`
``assertNotAlmostEquals(a, b)`` :meth:`assertNotAlmostEqual(a, b)
<unittest.TestCase.assertNotAlmostEqual>`
================================ ==========================================
.. 2to3fixer:: basestring
Converts :class:`basestring` to :class:`str`.
Expand Down
34 changes: 34 additions & 0 deletions Lib/lib2to3/fixes/fix_asserts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"""Fixer that replaces deprecated unittest method names."""

# Author: Ezio Melotti

from ..fixer_base import BaseFix
from ..fixer_util import Name

NAMES = dict(
assert_="assertTrue",
assertEquals="assertEqual",
assertNotEquals="assertNotEqual",
assertAlmostEquals="assertAlmostEqual",
assertNotAlmostEquals="assertNotAlmostEqual",
assertRegexpMatches="assertRegex",
assertRaisesRegexp="assertRaisesRegex",
failUnlessEqual="assertEqual",
failIfEqual="assertNotEqual",
failUnlessAlmostEqual="assertAlmostEqual",
failIfAlmostEqual="assertNotAlmostEqual",
failUnless="assertTrue",
failUnlessRaises="assertRaises",
failIf="assertFalse",
)


class FixAsserts(BaseFix):

PATTERN = """
power< any+ trailer< '.' meth=(%s)> any* >
""" % '|'.join(map(repr, NAMES))

def transform(self, node, results):
name = results["meth"][0]
name.replace(Name(NAMES[str(name)], prefix=name.prefix))
50 changes: 50 additions & 0 deletions Lib/lib2to3/tests/test_fixers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4635,3 +4635,53 @@ def test_no_sys_import(self):
def test_unchanged(self):
s = """f(sys.exitfunc)"""
self.unchanged(s)


class Test_asserts(FixerTestCase):

fixer = "asserts"

def test_deprecated_names(self):
tests = [
('self.assert_(True)', 'self.assertTrue(True)'),
('self.assertEquals(2, 2)', 'self.assertEqual(2, 2)'),
('self.assertNotEquals(2, 3)', 'self.assertNotEqual(2, 3)'),
('self.assertAlmostEquals(2, 3)', 'self.assertAlmostEqual(2, 3)'),
('self.assertNotAlmostEquals(2, 8)', 'self.assertNotAlmostEqual(2, 8)'),
('self.failUnlessEqual(2, 2)', 'self.assertEqual(2, 2)'),
('self.failIfEqual(2, 3)', 'self.assertNotEqual(2, 3)'),
('self.failUnlessAlmostEqual(2, 3)', 'self.assertAlmostEqual(2, 3)'),
('self.failIfAlmostEqual(2, 8)', 'self.assertNotAlmostEqual(2, 8)'),
('self.failUnless(True)', 'self.assertTrue(True)'),
('self.failUnlessRaises(foo)', 'self.assertRaises(foo)'),
('self.failIf(False)', 'self.assertFalse(False)'),
]
for b, a in tests:
self.check(b, a)

def test_variants(self):
b = 'eq = self.assertEquals'
a = 'eq = self.assertEqual'
self.check(b, a)
b = 'self.assertEquals(2, 3, msg="fail")'
a = 'self.assertEqual(2, 3, msg="fail")'
self.check(b, a)
b = 'self.assertEquals(2, 3, msg="fail") # foo'
a = 'self.assertEqual(2, 3, msg="fail") # foo'
self.check(b, a)
b = 'self.assertEquals (2, 3)'
a = 'self.assertEqual (2, 3)'
self.check(b, a)
b = ' self.assertEquals (2, 3)'
a = ' self.assertEqual (2, 3)'
self.check(b, a)
b = 'with self.failUnlessRaises(Explosion): explode()'
a = 'with self.assertRaises(Explosion): explode()'
self.check(b, a)
b = 'with self.failUnlessRaises(Explosion) as cm: explode()'
a = 'with self.assertRaises(Explosion) as cm: explode()'
self.check(b, a)

def test_unchanged(self):
self.unchanged('self.assertEqualsOnSaturday')
self.unchanged('self.assertEqualsOnSaturday(3, 5)')
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,9 @@ Library

- Issue #18716: Deprecate the formatter module.

- Issue #10712: 2to3 has a new "asserts" fixer that replaces deprecated names
of unittest methods (e.g. failUnlessEqual -> assertEqual).

- Issue #18037: 2to3 now escapes '\u' and '\U' in native strings.

- Issue #17839: base64.decodebytes and base64.encodebytes now accept any
Expand Down

0 comments on commit 6bdd986

Please sign in to comment.