Source code for owmeta_core.utils
# -*- coding: utf-8 -*-
"""
Common utilities for translation, massaging data, etc., that don't fit
elsewhere in owmeta_core
"""
import functools
import importlib
import re
__all__ = ['grouper', 'slice_dict']
PROVIDER_PATH_FORMAT = r'''
(?P<module>(?:\w+)(?:\.\w+)*)
:
(?P<provider>(?:\w+)(?:\.\w+)*)'''
PROVIDER_PATH_RE = re.compile(PROVIDER_PATH_FORMAT, flags=re.VERBOSE)
[docs]def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
while True:
l = []
try:
for x in args:
l.append(next(x))
except Exception:
pass
yield l
if len(l) < n:
break
def slice_dict(d, s):
return {k: v for k, v in d.items() if k in s}
def FCN(cls):
return str(cls.__module__) + '.' + str(cls.__name__)
def aslist(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
return list(fun(*args, **kwargs))
return wrapper
UNSET = object()
def getattrs(obj, names, default=UNSET):
p = obj
try:
for x in names:
p = getattr(p, x)
return p
except AttributeError:
if default is UNSET:
raise
return default
[docs]def retrieve_provider(provider_path):
'''
Look up a "provider" specified by a string.
Path to an object that provides something. The format is similar to that for
setuptools entry points: ``path.to.module:path.to.provider.callable``. Notably,
there's no name and "extras" are not supported.
Parameters
----------
provider_path : str
The path to the provider
Returns
-------
object
The provider
Raises
------
ValueError
The `provider_path` format doesn't match the expected pattern
AttributeError
Some element in the path is missing
'''
md = PROVIDER_PATH_RE.match(provider_path)
if not md:
raise ValueError('Format of the provider path is incorrect')
module = md.group('module')
provider = md.group('provider')
m = importlib.import_module(module)
attr_chain = provider.split('.')
return getattrs(m, attr_chain)
def ellipsize(s, max_length):
t = s[:max_length]
if t != s:
if len(t) <= 1:
return t
return t[:-1] + '…'
return t