Created
September 25, 2018 19:25
-
-
Save alexpyoung/e195f1b93f53d7c41dc2bcb71ae22ff1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
import pprint | |
import sys | |
pretty = pprint.PrettyPrinter(indent=4, width=200) | |
""" | |
Returns a map of permissions keyed by entity id | |
""" | |
def transform(entity_permissions): | |
return dict((entity_permission['scoping_entity_id'], entity_permission['permissions']) for entity_permission in entity_permissions) | |
def duplicate_entities(entity_permissions): | |
seen = [] | |
duplicates = [] | |
for entity_permission in entity_permissions: | |
id = entity_permission['scoping_entity_id'] | |
if id in seen: | |
duplicates.append(id) | |
else: | |
seen.append(id) | |
return duplicates | |
def duplicate_permissions(entity_permission): | |
seen = [] | |
duplicates = [] | |
for permission in entity_permission['permissions']: | |
if permission in seen: | |
duplicates.append(permission) | |
else: | |
seen.append(permission) | |
return duplicates | |
def validate(expected, actual): | |
if len(expected) != len(actual): | |
print('Expected entities:') | |
pretty.pprint(map(lambda permission: permission['scoping_entity_id'], expected)) | |
print('Actual entities:') | |
pretty.pprint(map(lambda permission: permission['scoping_entity_id'], actual)) | |
return | |
dupe_entities = duplicate_entities(actual) | |
if len(dupe_entities) > 0: | |
print('Actual has duplicate entities:') | |
pretty.pprint(dupe_entities) | |
return | |
seen_duplicate_permissions = False | |
for entity_permission in actual: | |
dupe_permissions = duplicate_permissions(entity_permission) | |
if len(dupe_permissions) > 0: | |
print("{} {} has duplicate permissions:".format(entity_permission["scoping_entity_type"], entity_permission["scoping_entity_id"])) | |
pretty.pprint(dupe_permissions) | |
seen_duplicate_permissions = True | |
if seen_duplicate_permissions: | |
return | |
expected_map = transform(expected) | |
actual_map = transform(actual) | |
for id, actual_permissions in actual_map.iteritems(): | |
expected_permissions = expected_map[id] | |
if len(actual_permissions) > len(expected_permissions): | |
print("{} has extra permissions".format(id)) | |
elif len(actual_permissions) < len(expected_permissions): | |
print("{} has missing permissions".format(id)) | |
def main(): | |
if len(sys.argv) != 3: | |
print('Expected two files to compare') | |
else: | |
with open(sys.argv[1], 'r') as expected, open(sys.argv[2], 'r') as actual: | |
validate(json.load(expected), json.load(actual)) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment