forked from r4sas/PBinCLI
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.5 KiB
50 lines
1.5 KiB
import json, os |
|
|
|
|
|
class PBinCLIException(Exception): |
|
pass |
|
|
|
|
|
def check_readable(f): |
|
# Checks if path exists and readable |
|
if not os.path.exists(f) or not os.access(f, os.R_OK): |
|
raise PBinCLIException("Error accessing path: {}".format(f)) |
|
|
|
|
|
def check_writable(f): |
|
# Checks if path is writable |
|
if not os.access(os.path.dirname(f) or ".", os.W_OK): |
|
raise PBinCLIException("Path is not writable: {}".format(f)) |
|
|
|
|
|
# http://stackoverflow.com/a/33571117 |
|
def json_load_byteified(file_handle): |
|
return _byteify( |
|
json.load(file_handle, object_hook=_byteify), |
|
ignore_dicts=True |
|
) |
|
|
|
|
|
def json_loads_byteified(json_text): |
|
return _byteify( |
|
json.loads(json_text, object_hook=_byteify), |
|
ignore_dicts=True |
|
) |
|
|
|
|
|
def _byteify(data, ignore_dicts = False): |
|
# if this is a unicode string, return its string representation |
|
if isinstance(data, str): |
|
return data.encode('utf-8') |
|
# if this is a list of values, return list of byteified values |
|
if isinstance(data, list): |
|
return [ _byteify(item, ignore_dicts=True) for item in data ] |
|
# if this is a dictionary, return dictionary of byteified keys and values |
|
# but only if we haven't already byteified it |
|
if isinstance(data, dict) and not ignore_dicts: |
|
return { |
|
_byteify(key, ignore_dicts=True): _byteify(value, ignore_dicts=True) |
|
for key, value in data.iteritems() |
|
} |
|
# if it's anything else, return it in its original form |
|
return data
|
|
|