diff --git a/HACKING.rst b/HACKING.rst index c898fb8ac..b1f1e5e2c 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -6,18 +6,18 @@ Read the OpenStack Style Commandments http://docs.openstack.org/developer/hackin Zun Specific Commandments ------------------------- -- [M302] Change assertEqual(A is not None) by optimal assert like +- [Z302] Change assertEqual(A is not None) by optimal assert like assertIsNotNone(A). -- [M310] timeutils.utcnow() wrapper must be used instead of direct calls to +- [Z310] timeutils.utcnow() wrapper must be used instead of direct calls to datetime.datetime.utcnow() to make it easy to override its return value. -- [M316] Change assertTrue(isinstance(A, B)) by optimal assert like +- [Z316] Change assertTrue(isinstance(A, B)) by optimal assert like assertIsInstance(A, B). -- [M318] Change assertEqual(A, None) or assertEqual(None, A) by optimal assert +- [Z318] Change assertEqual(A, None) or assertEqual(None, A) by optimal assert like assertIsNone(A) -- [M322] Method's default argument shouldn't be mutable. -- [M323] Change assertEqual(True, A) or assertEqual(False, A) by optimal assert +- [Z322] Method's default argument shouldn't be mutable. +- [Z323] Change assertEqual(True, A) or assertEqual(False, A) by optimal assert like assertTrue(A) or assertFalse(A) -- [M336] Must use a dict comprehension instead of a dict constructor +- [Z336] Must use a dict comprehension instead of a dict constructor with a sequence of key-value pairs. -- [M338] Use assertIn/NotIn(A, B) rather than assertEqual(A in B, True/False). -- [M339] Don't use xrange() +- [Z338] Use assertIn/NotIn(A, B) rather than assertEqual(A in B, True/False). +- [Z339] Don't use xrange() diff --git a/zun/hacking/checks.py b/zun/hacking/checks.py index 91d97192b..c60047d2e 100644 --- a/zun/hacking/checks.py +++ b/zun/hacking/checks.py @@ -20,11 +20,11 @@ Guidelines for writing new hacking checks - Use only for Zun specific tests. OpenStack general tests should be submitted to the common 'hacking' module. - - Pick numbers in the range M3xx. Find the current test with + - Pick numbers in the range Z3xx. Find the current test with the highest allocated number and then pick the next value. If nova has an N3xx code for that test, use the same number. - Keep the test method code in the source file ordered based - on the M3xx value. + on the Z3xx value. - List the new rule in the top level HACKING.rst file - Add test cases for each new rule to zun/tests/unit/test_hacking.py @@ -56,9 +56,9 @@ assert_xrange_re = re.compile( def assert_equal_none(logical_line): """Check for assertEqual(A, None) or assertEqual(None, A) sentences - M318 + Z318 """ - msg = ("M318: assertEqual(A, None) or assertEqual(None, A) " + msg = ("Z318: assertEqual(A, None) or assertEqual(None, A) " "sentences not allowed") res = (assert_equal_start_with_none_re.match(logical_line) or assert_equal_end_with_none_re.match(logical_line)) @@ -67,7 +67,7 @@ def assert_equal_none(logical_line): def no_mutable_default_args(logical_line): - msg = "M322: Method's default argument shouldn't be mutable!" + msg = "Z322: Method's default argument shouldn't be mutable!" if mutable_default_args.match(logical_line): yield (0, msg) @@ -75,18 +75,18 @@ def no_mutable_default_args(logical_line): def assert_equal_true_or_false(logical_line): """Check for assertEqual(True, A) or assertEqual(False, A) sentences - M323 + Z323 """ res = (assert_equal_with_true_re.search(logical_line) or assert_equal_with_false_re.search(logical_line)) if res: - yield (0, "M323: assertEqual(True, A) or assertEqual(False, A) " + yield (0, "Z323: assertEqual(True, A) or assertEqual(False, A) " "sentences not allowed") def assert_equal_not_none(logical_line): - """Check for assertEqual(A is not None) sentences M302""" - msg = "M302: assertEqual(A is not None) sentences not allowed." + """Check for assertEqual(A is not None) sentences Z302""" + msg = "Z302: assertEqual(A is not None) sentences not allowed." res = asse_equal_with_is_not_none_re.search(logical_line) if res: yield (0, msg) @@ -95,21 +95,21 @@ def assert_equal_not_none(logical_line): def assert_true_isinstance(logical_line): """Check for assertTrue(isinstance(a, b)) sentences - M316 + Z316 """ if assert_true_isinstance_re.match(logical_line): - yield (0, "M316: assertTrue(isinstance(a, b)) sentences not allowed") + yield (0, "Z316: assertTrue(isinstance(a, b)) sentences not allowed") def assert_equal_in(logical_line): """Check for assertEqual(True|False, A in B), assertEqual(A in B, True|False) - M338 + Z338 """ res = (assert_equal_in_start_with_true_or_false_re.search(logical_line) or assert_equal_in_end_with_true_or_false_re.search(logical_line)) if res: - yield (0, "M338: Use assertIn/NotIn(A, B) rather than " + yield (0, "Z338: Use assertIn/NotIn(A, B) rather than " "assertEqual(A in B, True/False) when checking collection " "contents.") @@ -117,10 +117,10 @@ def assert_equal_in(logical_line): def no_xrange(logical_line): """Disallow 'xrange()' - M339 + Z339 """ if assert_xrange_re.match(logical_line): - yield(0, "M339: Do not use xrange().") + yield(0, "Z339: Do not use xrange().") def use_timeutils_utcnow(logical_line, filename): @@ -128,7 +128,7 @@ def use_timeutils_utcnow(logical_line, filename): if "/tools/" in filename: return - msg = "M310: timeutils.utcnow() must be used instead of datetime.%s()" + msg = "Z310: timeutils.utcnow() must be used instead of datetime.%s()" datetime_funcs = ['now', 'utcnow'] for f in datetime_funcs: pos = logical_line.find('datetime.%s' % f) @@ -137,7 +137,7 @@ def use_timeutils_utcnow(logical_line, filename): def dict_constructor_with_list_copy(logical_line): - msg = ("M336: Must use a dict comprehension instead of a dict constructor" + msg = ("Z336: Must use a dict comprehension instead of a dict constructor" " with a sequence of key-value pairs." ) if dict_constructor_with_list_copy_re.match(logical_line): diff --git a/zun/tests/unit/test_hacking.py b/zun/tests/unit/test_hacking.py index 13455b1b0..18e333062 100644 --- a/zun/tests/unit/test_hacking.py +++ b/zun/tests/unit/test_hacking.py @@ -78,7 +78,7 @@ class HackingTestCase(base.BaseTestCase): self._assert_has_errors(code, checker, filename=filename) def test_assert_equal_in(self): - errors = [(1, 0, "M338")] + errors = [(1, 0, "Z338")] check = checks.assert_equal_in code = "self.assertEqual(a in b, True)" @@ -118,7 +118,7 @@ class HackingTestCase(base.BaseTestCase): self._assert_has_no_errors(code, check) def test_assert_equal_none(self): - errors = [(1, 0, "M318")] + errors = [(1, 0, "Z318")] check = checks.assert_equal_none code = "self.assertEqual(A, None)" @@ -131,7 +131,7 @@ class HackingTestCase(base.BaseTestCase): self._assert_has_no_errors(code, check) def test_assert_equal_true_or_false(self): - errors = [(1, 0, "M323")] + errors = [(1, 0, "Z323")] check = checks.assert_equal_true_or_false code = "self.assertEqual(True, A)" @@ -147,7 +147,7 @@ class HackingTestCase(base.BaseTestCase): self._assert_has_no_errors(code, check) def test_no_mutable_default_args(self): - errors = [(1, 0, "M322")] + errors = [(1, 0, "Z322")] check = checks.no_mutable_default_args code = "def get_info_from_bdm(virt_type, bdm, mapping=[])" @@ -160,7 +160,7 @@ class HackingTestCase(base.BaseTestCase): self._assert_has_no_errors(code, check) def test_assert_is_not_none(self): - errors = [(1, 0, "M302")] + errors = [(1, 0, "Z302")] check = checks.assert_equal_not_none code = "self.assertEqual(A is not None)" @@ -170,7 +170,7 @@ class HackingTestCase(base.BaseTestCase): self._assert_has_no_errors(code, check) def test_assert_true_isinstance(self): - errors = [(1, 0, "M316")] + errors = [(1, 0, "Z316")] check = checks.assert_true_isinstance code = "self.assertTrue(isinstance(e, exception.BuilAbortException))" @@ -180,7 +180,7 @@ class HackingTestCase(base.BaseTestCase): self._assert_has_no_errors(code, check) def test_no_xrange(self): - errors = [(1, 0, "M339")] + errors = [(1, 0, "Z339")] check = checks.no_xrange code = "xrange(45)" @@ -190,7 +190,7 @@ class HackingTestCase(base.BaseTestCase): self._assert_has_no_errors(code, check) def test_use_timeunitls_utcow(self): - errors = [(1, 0, "M310")] + errors = [(1, 0, "Z310")] check = checks.use_timeutils_utcnow code = "datetime.now"