mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-01-13 12:30:08 -06:00
79 lines
1.8 KiB
Python
79 lines
1.8 KiB
Python
"""five: six, redux"""
|
|
# pylint:disable=invalid-name
|
|
PY2 = (str is bytes)
|
|
PY3 = (str is not bytes)
|
|
|
|
# provide a symettrical `text` type to `bytes`
|
|
if PY2:
|
|
text = unicode # flake8: noqa
|
|
else:
|
|
text = str
|
|
|
|
|
|
def n(obj):
|
|
"""Produce a native string.
|
|
|
|
Similar in behavior to str(), but uses US-ASCII encoding when necessary.
|
|
"""
|
|
if isinstance(obj, str):
|
|
return obj
|
|
elif PY2 and isinstance(obj, text):
|
|
return obj.encode('US-ASCII')
|
|
elif PY3 and isinstance(obj, bytes):
|
|
return obj.decode('US-ASCII')
|
|
else:
|
|
return str(obj)
|
|
|
|
|
|
def u(obj):
|
|
"""Produces text.
|
|
|
|
Similar in behavior to str() in python3 or unicode() in python2,
|
|
but uses US-ASCII encoding when necessary.
|
|
"""
|
|
if isinstance(obj, text):
|
|
return obj
|
|
elif isinstance(obj, bytes):
|
|
return obj.decode('US-ASCII')
|
|
else:
|
|
return text(obj)
|
|
|
|
|
|
def b(obj):
|
|
"""Produces bytes.
|
|
|
|
Similar in behavior to bytes(), but uses US-ASCII encoding when necessary.
|
|
"""
|
|
if isinstance(obj, bytes):
|
|
return obj
|
|
elif isinstance(obj, text):
|
|
return obj.encode('US-ASCII')
|
|
else:
|
|
return bytes(obj)
|
|
|
|
|
|
def udict(*args, **kwargs):
|
|
"""Similar to dict(), but keyword-keys are text."""
|
|
kwargs = dict([
|
|
(u(key), val)
|
|
for key, val in kwargs.items()
|
|
])
|
|
|
|
return dict(*args, **kwargs)
|
|
|
|
def ndict(*args, **kwargs):
|
|
"""Similar to dict(), but keyword-keys are forced to native strings."""
|
|
# I hate this :(
|
|
kwargs = dict([
|
|
(n(key), val)
|
|
for key, val in kwargs.items()
|
|
])
|
|
|
|
return dict(*args, **kwargs)
|
|
|
|
def open(*args, **kwargs):
|
|
"""Override the builtin open() to return text and use utf8 by default."""
|
|
from io import open
|
|
kwargs.setdefault('encoding', 'UTF-8')
|
|
return open(*args, **kwargs)
|