|
|
from __future__ import unicode_literals |
|
|
from builtins import str |
|
|
from past.builtins import basestring |
|
|
import hashlib |
|
|
import sys |
|
|
|
|
|
if sys.version_info.major == 2: |
|
|
|
|
|
str = str |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BaseBaseString(type): |
|
|
def __instancecheck__(cls, instance): |
|
|
return isinstance(instance, (bytes, str)) |
|
|
|
|
|
def __subclasshook__(cls, thing): |
|
|
|
|
|
raise NotImplemented |
|
|
|
|
|
|
|
|
def with_metaclass(meta, *bases): |
|
|
class metaclass(meta): |
|
|
__call__ = type.__call__ |
|
|
__init__ = type.__init__ |
|
|
|
|
|
def __new__(cls, name, this_bases, d): |
|
|
if this_bases is None: |
|
|
return type.__new__(cls, name, (), d) |
|
|
return meta(name, bases, d) |
|
|
|
|
|
return metaclass('temporary_class', None, {}) |
|
|
|
|
|
|
|
|
if sys.version_info.major >= 3: |
|
|
|
|
|
class basestring(with_metaclass(BaseBaseString)): |
|
|
pass |
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
from builtins import basestring |
|
|
|
|
|
|
|
|
def _recursive_repr(item): |
|
|
"""Hack around python `repr` to deterministically represent dictionaries. |
|
|
|
|
|
This is able to represent more things than json.dumps, since it does not require things to be JSON serializable |
|
|
(e.g. datetimes). |
|
|
""" |
|
|
if isinstance(item, basestring): |
|
|
result = str(item) |
|
|
elif isinstance(item, list): |
|
|
result = '[{}]'.format(', '.join([_recursive_repr(x) for x in item])) |
|
|
elif isinstance(item, dict): |
|
|
kv_pairs = [ |
|
|
'{}: {}'.format(_recursive_repr(k), _recursive_repr(item[k])) |
|
|
for k in sorted(item) |
|
|
] |
|
|
result = '{' + ', '.join(kv_pairs) + '}' |
|
|
else: |
|
|
result = repr(item) |
|
|
return result |
|
|
|
|
|
|
|
|
def get_hash(item): |
|
|
repr_ = _recursive_repr(item).encode('utf-8') |
|
|
return hashlib.md5(repr_).hexdigest() |
|
|
|
|
|
|
|
|
def get_hash_int(item): |
|
|
return int(get_hash(item), base=16) |
|
|
|
|
|
|
|
|
def escape_chars(text, chars): |
|
|
"""Helper function to escape uncomfortable characters.""" |
|
|
text = str(text) |
|
|
chars = list(set(chars)) |
|
|
if '\\' in chars: |
|
|
chars.remove('\\') |
|
|
chars.insert(0, '\\') |
|
|
for ch in chars: |
|
|
text = text.replace(ch, '\\' + ch) |
|
|
return text |
|
|
|
|
|
|
|
|
def convert_kwargs_to_cmd_line_args(kwargs): |
|
|
"""Helper function to build command line arguments out of dict.""" |
|
|
args = [] |
|
|
for k in sorted(kwargs.keys()): |
|
|
v = kwargs[k] |
|
|
args.append('-{}'.format(k)) |
|
|
if v is not None: |
|
|
args.append('{}'.format(v)) |
|
|
return args |
|
|
|