diff --git a/HACKING.rst b/HACKING.rst index 3120b7e343..41a450441a 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -16,6 +16,7 @@ Octavia Specific Commandments - [O322] Don't use author tags - [O323] Change assertEqual(True, A) or assertEqual(False, A) to the more specific assertTrue(A) or assertFalse(A) +- [O324] Method's default argument shouldn't be mutable - [O338] Change assertEqual(A in B, True), assertEqual(True, A in B), assertEqual(A in B, False) or assertEqual(False, A in B) to the more specific assertIn/NotIn(A, B) diff --git a/octavia/common/data_models.py b/octavia/common/data_models.py index 4d6e989511..2d455cebda 100644 --- a/octavia/common/data_models.py +++ b/octavia/common/data_models.py @@ -211,13 +211,13 @@ class SNI(BaseDataModel): class TLSContainer(BaseDataModel): def __init__(self, id=None, primary_cn=None, certificate=None, - private_key=None, passphrase=None, intermediates=[]): + private_key=None, passphrase=None, intermediates=None): self.id = id self.primary_cn = primary_cn self.certificate = certificate self.private_key = private_key self.passphrase = passphrase - self.intermediates = intermediates + self.intermediates = intermediates or [] class Amphora(BaseDataModel): diff --git a/octavia/hacking/checks.py b/octavia/hacking/checks.py index 4844f97d7d..f2f5c77a47 100644 --- a/octavia/hacking/checks.py +++ b/octavia/hacking/checks.py @@ -66,6 +66,7 @@ assert_equal_with_true_re = re.compile( r"assertEqual\(True,") assert_equal_with_false_re = re.compile( r"assertEqual\(False,") +mutable_default_args = re.compile(r"^\s*def .+\((.+=\{\}|.+=\[\])") def _directory_to_check_translation(filename): @@ -155,6 +156,12 @@ def assert_equal_true_or_false(logical_line): "sentences not allowed") +def no_mutable_default_args(logical_line): + msg = "O324: Method's default argument shouldn't be mutable!" + if mutable_default_args.match(logical_line): + yield (0, msg) + + def assert_equal_in(logical_line): """Check for assertEqual(A in B, True), assertEqual(True, A in B), @@ -177,4 +184,5 @@ def factory(register): register(use_jsonutils) register(no_author_tags) register(assert_equal_true_or_false) + register(no_mutable_default_args) register(assert_equal_in) diff --git a/octavia/tests/unit/common/sample_configs/sample_configs.py b/octavia/tests/unit/common/sample_configs/sample_configs.py index 2ca6370049..eefc038dc5 100644 --- a/octavia/tests/unit/common/sample_configs/sample_configs.py +++ b/octavia/tests/unit/common/sample_configs/sample_configs.py @@ -205,13 +205,13 @@ def sample_tls_sni_containers_tuple(tls_container=None): def sample_tls_container_tuple(id='cont_id_1', certificate=None, - private_key=None, intermediates=[], + private_key=None, intermediates=None, primary_cn=None): sc = collections.namedtuple( 'tls_container', 'id, certificate, private_key, intermediates, primary_cn') return sc(id=id, certificate=certificate, private_key=private_key, - intermediates=intermediates, primary_cn=primary_cn) + intermediates=intermediates or [], primary_cn=primary_cn) def sample_pool_tuple(proto=None, monitor=True, persistence=True,