Skip to content

Instantly share code, notes, and snippets.

@alexpyoung
Created September 25, 2018 19:25
Show Gist options
  • Save alexpyoung/e195f1b93f53d7c41dc2bcb71ae22ff1 to your computer and use it in GitHub Desktop.
Save alexpyoung/e195f1b93f53d7c41dc2bcb71ae22ff1 to your computer and use it in GitHub Desktop.
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