Source code for remoteappmanager.utils
import inspect
from functools import wraps
import warnings
[docs]def url_path_join(*pieces):
"""Join components of url into a relative url path
Use to prevent double slash when joining subpath. This will leave the
initial and final / in place
Assume pieces do not contain protocol (e.g. http://)
"""
stripped = [s.strip('/') for s in pieces]
result = '/'.join(s for s in stripped if s)
if pieces[0].startswith('/'):
result = '/' + result
if pieces[-1].endswith('/'):
result = result + '/'
if result == '//':
result = '/'
return result
[docs]def with_end_slash(url):
"""Normalises a url to have an ending slash, and only one."""
return url.rstrip("/")+"/"
[docs]def without_end_slash(url):
"""Makes sure there is no end slash at the end of a url."""
return url.rstrip("/")
[docs]def parse_volume_string(volume_string):
"""Parses a volume specification string SOURCE:TARGET:MODE into
its components, or raises click.BadOptionUsage if not according
to format."""
try:
source, target, mode = volume_string.split(":")
except ValueError:
raise ValueError("Volume string must be in the form "
"source:target:mode")
if mode not in ('rw', 'ro'):
raise ValueError("Volume mode must be either 'ro' or 'rw'")
return source, target, mode
[docs]def mergedoc(function, other):
""" Merge the docstring from the other function to the decorated function.
"""
if other.__doc__ is None:
return function
elif function.__doc__ is None:
function.__doc__ = other.__doc__
return function
else:
merged_doc = '\n'.join((other.__doc__, function.__doc__))
function.__doc__ = merged_doc
return function
class mergedocs(object):
""" Merge the docstrings of other class to the decorated.
"""
def __init__(self, other):
self.other = other
def __call__(self, cls):
for name, old in inspect.getmembers(self.other):
if inspect.isfunction(old):
new = getattr(cls, name, None)
if new is not None:
mergedoc(new, old)
return cls
[docs]def one(elements):
"""Returns True if only one element is not None, false otherwise"""
return sum([False if e is None else True for e in elements]) == 1
[docs]def remove_quotes(s):
"""Removes start/end quotes from a string, if needed.
If s is not a string, it is returned untouched.
"""
if not isinstance(s, str):
return s
if len(s) < 2:
return s
if s[0]+s[-1] in ['""', "''"]:
return s[1:-1]
return s
[docs]def deprecated(func):
"""Decorator. Marks a function/method as deprecated."""
@wraps(func)
def _deprecated(*args, **kwargs):
warnings.warn("Deprecation warning: {}".format(func.__name__))
return func(*args, **kwargs)
return _deprecated