""" Some helpers for options
"""
import logging
from os.path import dirname, join as pj
import pkg_resources
logger = logging.getLogger(__name__)
available_options = {}
try:
loc_input = raw_input
except NameError:
loc_input = input
[docs]class Option(object):
"""Base class to store information associated with an option
"""
def __init__(self):
self._name = None
self._update_parameters = None
self._check = None
self._require = None
self._environment_extensions = None
self._regenerate = None
self._files_dir = None
[docs] def from_entry_point(self, ep):
self._name, func_name = ep.name.split(".")
if func_name == "update_parameters":
self._update_parameters = ep
elif func_name == "check":
self._check = ep
elif func_name == "require":
self._require = ep
elif func_name == "environment_extensions":
self._environment_extensions = ep
elif func_name == "regenerate":
self._regenerate = ep
elif func_name == "files_dir":
self._files_dir = ep
else:
# silently ignore other type of entry points
logger.error("unknown entry point attribute: '{}'".format(func_name))
[docs] def update_parameters(self, cfg):
if self._update_parameters is None:
cfg[self._name] = {}
return
if isinstance(self._update_parameters, pkg_resources.EntryPoint):
self._update_parameters = self._update_parameters.load()
return self._update_parameters(cfg)
[docs] def check(self, *args, **kwds):
if self._check is None:
return []
if isinstance(self._check, pkg_resources.EntryPoint):
self._check = self._check.load()
return self._check(*args, **kwds)
[docs] def require(self, *args, **kwds):
if self._require is None:
return []
if isinstance(self._require, pkg_resources.EntryPoint):
self._require = self._require.load()
return self._require(*args, **kwds)
[docs] def environment_extensions(self, *args, **kwds):
if self._environment_extensions is None:
return {}
if isinstance(self._environment_extensions, pkg_resources.EntryPoint):
self._environment_extensions = self._environment_extensions.load()
return self._environment_extensions(*args, **kwds)
[docs] def regenerate(self, *args, **kwds):
if self._regenerate is None:
return None
if isinstance(self._regenerate, pkg_resources.EntryPoint):
self._regenerate = self._regenerate.load()
return self._regenerate(*args, **kwds)
[docs] def files_dir(self):
if self._files_dir is None:
return None
if isinstance(self._files_dir, pkg_resources.EntryPoint):
self._files_dir = pj(dirname(self._files_dir.load().__file__), self._name)
return self._files_dir
[docs]def find_available_options():
for ep in pkg_resources.iter_entry_points(group='pkglts'):
option_name = ep.name.split(".")[0]
if option_name not in available_options:
available_options[option_name] = Option()
opt = available_options[option_name]
opt.from_entry_point(ep)
[docs]def get_user_permission(action_name, default_true=True):
if default_true:
return loc_input("%s [y], n?" % action_name) in ("", "y")
else:
return loc_input("%s y, [n]?" % action_name) == "y"
#
# def get_key(key, env):
# """ Fetch a specific key in env
# """
# try:
# elms = key.split(".")
# d = env
# for k in elms:
# d = d[k]
#
# return d
# except KeyError:
# return None
#
#
# def _ask_single_arg(name, default):
# # prompt user for value
# msg = name
# if default is None:
# msg += ":"
# val = ""
# else:
# val = str(default)
# msg += " [%s]:" % val
#
# ans = loc_input(msg)
# if ans == "":
# return val
# else:
# return ans
#
#
# def ask_arg(name, pkg_cfg=None, default=None, extra=None):
# """ Prompt the user for the value of some argument
#
# If user returns nothing then default will be returned
#
# If pkg_cfg is provided, the function will attempt to
# find a proper default in it.
#
# If extra is provided, the function will attempt to
# find a value in it and return it without prompting
# the user.
#
# If default is a list of elements, even empty, the function
# will return a list of answers.
#
# args:
# - name (str): name of argument. Can be in the form of
# 'option.arg'.
# - pkg_cfg (dict of (str, any)): place to look for defaults
# - default (any): default to use as a last resort
# - extra (dict of (str, any)): place to look for values
#
# return:
# - (str): value of argument either from prompt or from default
# """
# if extra is None:
# extra = {}
#
# # try to find value in extra
# if name in extra:
# return extra[name]
#
# key = name.split(".")[-1]
# if key in extra:
# return extra[key]
#
# if pkg_cfg is None:
# pkg_cfg = {}
#
# if isinstance(default, (list, tuple)):
# # ask multiple args
# val = get_key(name, pkg_cfg)
# if val is None:
# val = default
#
# if not isinstance(val, (list, tuple)):
# msg = "bad value in pkg_cfg, expected list for %s" % name
# raise UserWarning(msg)
#
# i = 0
# items = []
# res = "txt"
# while res != "":
# if i < len(val):
# loc_val = val[i]
# else:
# loc_val = ""
# res = _ask_single_arg(name, loc_val)
# if res != "":
# items.append(res)
# i += 1
#
# return items
# else:
# val = get_key(name, pkg_cfg)
# if val is None:
# val = default
# return _ask_single_arg(name, val)