Skip to content

Commit 319dc8f

Browse files
author
Maximilian Schmidt
committed
Fix bug with nested blacklists: Now arbitrary depths of blacklist entries are possible
1 parent 0fd39cf commit 319dc8f

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

dicthash/dicthash.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,14 @@ def _generate_string_from_dict(d, blacklist, whitelist, prefix=''):
122122
if blacklist is not None:
123123
whitelist = set(whitelist).difference(blacklist)
124124
# Sort whitelist according to the keys converted to str
125-
return ''.join(_unpack_value(d[key],
126-
whitelist=filter_blackwhitelist(whitelist, key),
127-
blacklist=filter_blackwhitelist(blacklist, key),
128-
prefix=prefix + str(key)) for
129-
key in sorted(filter_blackwhitelist(whitelist, None), key=str))
125+
if len(whitelist) > 0:
126+
return ''.join(_unpack_value(d[key],
127+
whitelist=filter_blackwhitelist(whitelist, key),
128+
blacklist=filter_blackwhitelist(blacklist, key),
129+
prefix=prefix + str(key)) for
130+
key in sorted(filter_blackwhitelist(whitelist, None), key=str))
131+
else:
132+
return ''
130133

131134

132135
def generate_hash_from_dict(d, blacklist=None, whitelist=None,
@@ -243,7 +246,10 @@ def filter_blackwhitelist(l, key):
243246
for k in l:
244247
if isinstance(k, tuple):
245248
if key is not None and k[0] == key:
246-
fl.append(k[1])
249+
if len(k) == 2:
250+
fl.append(k[1])
251+
else:
252+
fl.append(k[1:])
247253
elif key is None:
248254
fl.append(k[0])
249255
elif key is None:

dicthash/test/test_dicthash.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,15 @@ def test_subdir_keys_for_whitelist_blacklist():
346346
label1 = dicthash.generate_hash_from_dict(d1, whitelist=[('a', 'b')])
347347
assert(label0 == label1)
348348

349+
# Test with one more level in the dictionaries
350+
d0 = {'e': {'f': {'g': 2,
351+
'h': 4}}}
352+
d1 = {'e': {'f': {'g': 3,
353+
'h': 4}}}
354+
label0 = dicthash.generate_hash_from_dict(d0, blacklist=[('e', 'f', 'h')])
355+
label1 = dicthash.generate_hash_from_dict(d1, blacklist=[('e', 'f', 'h')])
356+
assert(label0 != label1)
357+
349358

350359
def test_dict_list_lead_to_different_hash():
351360
d0 = {

0 commit comments

Comments
 (0)