diff --git a/scripts/pretty_print_and_sort_json.py b/scripts/pretty_print_and_sort_json.py index f21581d7d..9331caabf 100644 --- a/scripts/pretty_print_and_sort_json.py +++ b/scripts/pretty_print_and_sort_json.py @@ -42,7 +42,7 @@ def get_props_info(list_of_dicts): found_props.add(p) # create a copy, since we are gonna possibly remove props - shared_props = set(found_props) + props_whose_value_we_can_sort_on = set(found_props) # for each object, loop through list of all found property names, # if the object contains that property, check that it's of type string or number @@ -50,13 +50,13 @@ def get_props_info(list_of_dicts): # if it's not of type string/number remove it from list of properties to check # since we cannot sort on non-string/number values for p in list(found_props): - if p in shared_props: # short circuit + if p in props_whose_value_we_can_sort_on: # short circuit for d in list_of_dicts: - if p in shared_props: # less shorter short circuit + if p in props_whose_value_we_can_sort_on: # less shorter short circuit if p in d: # we ae only gonna sort key values if they are of type string or number if not isinstance(d[p], str) and not isinstance(d[p], int): - shared_props.remove(p) + props_whose_value_we_can_sort_on.remove(p) # we need to store the type of the value because not each object # in a list of output objects for 1 detector will have the same # keys, so if we want to sort based on the values then if a certain object @@ -67,12 +67,23 @@ def get_props_info(list_of_dicts): prop_types[p] = 'string' elif isinstance(d[p], int): prop_types[p] = 'number' - return (sorted(list(shared_props)), prop_types) + return (sorted(list(props_whose_value_we_can_sort_on)), prop_types) def order_by_prop_value(list_of_dicts): props_info = get_props_info(list_of_dicts) return sorted(list_of_dicts, key=lambda d: create_property_val_tuple(d, props_info)) +def order_dict(d): + result = OrderedDict() # such that we keep the order + for k, v in sorted(d.items()): + if isinstance(v, dict): + result[k] = order_dict(v) + elif type(v) is list: + result[k] = order_list(v) + else: # string/number + result[k] = v + return result + def order_list(l): # TODO: sometimes slither detectors return a null value in the json output sourceMapping object array # get rid of those values, it will break sorting (some items are an object, some are null?!) @@ -88,17 +99,6 @@ def order_list(l): ordered_by_val = order_by_prop_value(ordered_by_key) return ordered_by_val -def order_dict(dictionary): - result = OrderedDict() # such that we keep the order - for k, v in sorted(dictionary.items()): - if isinstance(v, dict): - result[k] = order_dict(v) - elif type(v) is list: - result[k] = order_list(v) - else: # string/number - result[k] = v - return result - with open(raw_json_file, 'r') as json_data: with open(pretty_json_file, 'w') as out_file: out_file.write(json.dumps(order_list(json.load(json_data)), sort_keys=False, indent=4, separators=(',',': '))) \ No newline at end of file