Skip to content

Commit 5ddc201

Browse files
committed
[general] Avoid default mutable arguments
1 parent 117bab1 commit 5ddc201

6 files changed

Lines changed: 22 additions & 16 deletions

File tree

netjsonconfig/backends/base/backend.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ class BaseBackend(object):
2121
schema = None
2222
FILE_SECTION_DELIMITER = '# ---------- files ---------- #'
2323
intermediate_data = None
24+
list_identifiers = []
2425

25-
def __init__(self, config, templates=[], context={}):
26+
def __init__(self, config, templates=None, context=None):
2627
"""
2728
:param config: ``dict`` containing valid **NetJSON DeviceConfiguration**
2829
:param templates: ``list`` containing **NetJSON** dictionaries that will be
@@ -54,17 +55,17 @@ def _merge_config(self, config, templates):
5455
"""
5556
Merges config with templates
5657
"""
58+
if not templates:
59+
return config
5760
# type check
5861
if not isinstance(templates, list):
5962
raise TypeError('templates argument must be an instance of list')
60-
# merge any present template with main configuration
63+
# merge templates with main configuration
6164
base_config = {}
62-
6365
for template in templates:
64-
template = self._load(template)
65-
base_config = merge_config(base_config, template)
66+
base_config = merge_config(base_config, self._load(template), self.list_identifiers)
6667
if base_config:
67-
return merge_config(base_config, config)
68+
return merge_config(base_config, config, self.list_identifiers)
6869
return config
6970

7071
def _evaluate_vars(self, config, context):

netjsonconfig/backends/openwisp/openwisp.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ def _sanitize_radios(self):
2525
for radio in self.config.get('radios', []):
2626
radio.setdefault('disabled', False)
2727

28-
def _render_template(self, template, context={}):
28+
def _render_template(self, template, context=None):
2929
openwisp_env = Environment(loader=PackageLoader(self.__module__, 'templates'),
3030
trim_blocks=True)
3131
template = openwisp_env.get_template(template)
32+
context = context or {}
3233
return template.render(**context)
3334

3435
def _add_unique_file(self, item):

netjsonconfig/backends/openwrt/openwrt.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class OpenWrt(BaseBackend):
2828
converters.Default,
2929
]
3030
renderer = OpenWrtRenderer
31+
list_identifiers = ['name', 'config_value', 'id']
3132

3233
def _generate_contents(self, tar):
3334
"""

netjsonconfig/utils.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import six
66

77

8-
def merge_config(template, config):
8+
def merge_config(template, config, list_identifiers=None):
99
"""
1010
Merges ``config`` on top of ``template``.
1111
@@ -19,6 +19,7 @@ def merge_config(template, config):
1919
2020
:param template: template ``dict``
2121
:param config: config ``dict``
22+
:param list_identifiers: ``list`` or ``None``
2223
:returns: merged ``dict``
2324
"""
2425
result = template.copy()
@@ -27,13 +28,13 @@ def merge_config(template, config):
2728
node = result.get(key, {})
2829
result[key] = merge_config(node, value)
2930
elif isinstance(value, list) and isinstance(result.get(key), list):
30-
result[key] = merge_list(result[key], value)
31+
result[key] = merge_list(result[key], value, list_identifiers)
3132
else:
3233
result[key] = value
3334
return result
3435

3536

36-
def merge_list(list1, list2, identifiers=['name', 'config_value', 'id']):
37+
def merge_list(list1, list2, identifiers=None):
3738
"""
3839
Merges ``list2`` on top of ``list1``.
3940
@@ -43,10 +44,12 @@ def merge_list(list1, list2, identifiers=['name', 'config_value', 'id']):
4344
The remaining elements will be summed in order to create a list
4445
which contains elements of both lists.
4546
46-
:param list1: list from template
47-
:param list2: list from config
47+
:param list1: ``list`` from template
48+
:param list2: ``list from config
49+
:param identifiers: ``list`` or ``None``
4850
:returns: merged ``list``
4951
"""
52+
identifiers = identifiers or []
5053
dict_map = {'list1': OrderedDict(), 'list2': OrderedDict()}
5154
counter = 1
5255
for list_ in [list1, list2]:

tests/openwrt/test_backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ def test_templates_type_error(self):
209209
}
210210
}
211211
with self.assertRaises(TypeError):
212-
OpenWrt(config, templates={})
212+
OpenWrt(config, templates={'a': 'a'})
213213

214214
def test_templates_config_error(self):
215215
config = {

tests/test_utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ def test_evaluate_vars_one_char(self):
173173
def test_merge_list_override(self):
174174
template = [{"name": "test1", "tx": 1}]
175175
config = [{"name": "test1", "tx": 2}]
176-
result = merge_list(template, config)
176+
result = merge_list(template, config, ['name'])
177177
self.assertEqual(result, config)
178178

179179
def test_merge_list_union_and_override(self):
@@ -182,7 +182,7 @@ def test_merge_list_union_and_override(self):
182182
{"id": "test1", "a": "0", "b": "b"},
183183
{"id": "test2", "c": "c"}
184184
]
185-
result = merge_list(template, config)
185+
result = merge_list(template, config, ['id'])
186186
self.assertEqual(result, [
187187
{"id": "test1", "a": "0", "b": "b"},
188188
{"id": "test2", "c": "c"}
@@ -191,7 +191,7 @@ def test_merge_list_union_and_override(self):
191191
def test_merge_list_config_value(self):
192192
template = [{"config_value": "test1", "tx": 1}]
193193
config = [{"config_value": "test1", "tx": 2}]
194-
result = merge_list(template, config)
194+
result = merge_list(template, config, ['config_value'])
195195
self.assertEqual(result, config)
196196

197197
def test_get_copy_default(self):

0 commit comments

Comments
 (0)