import simplejson as json import math from collections import OrderedDict from pathlib import Path from flask import make_response def resolve_path(*p: str): return Path(*p).expanduser().resolve().absolute() def safe_list_get(l, idx, default): """ https://stackoverflow.com/a/5125636 :param l: :param idx: :param default: :return: """ try: return l[idx] except IndexError: return default def deep_sort(obj): """ https://stackoverflow.com/a/59218649 :param obj: :return: """ if isinstance(obj, dict): obj = OrderedDict(sorted(obj.items())) for k, v in obj.items(): if isinstance(v, dict) or isinstance(v, list): obj[k] = deep_sort(v) if isinstance(obj, list): for i, v in enumerate(obj): if isinstance(v, dict) or isinstance(v, list): obj[i] = deep_sort(v) obj = sorted(obj, key=lambda x: json.dumps(x)) return obj def indefinite_article(word): if word[0].lower() in 'aeiou': return 'an' else: return 'a' def jsonify_pretty(json_dict: dict, status=200, indent=4, sort_keys=True): response = make_response(json.dumps(json_dict, indent=indent, sort_keys=sort_keys)) response.headers['Content-Type'] = 'application/json; charset=utf-8' response.headers['mimetype'] = 'application/json' response.status_code = status return response def round_up_base(n, base): return math.ceil(n / base) * base