Source code for datadiligence.bootstrap
"""
functions to preload default evaluators and make accessible globally
"""
from .exceptions import EvaluatorAlreadyRegistered, EvaluatorNotRegistered, NotEvaluator, DefaultEvaluatorNotFound
from .evaluators import Evaluator, PreprocessEvaluator, PostprocessEvaluator, FileEvaluator
bootstrap_dictionary = {}
[docs]
def load_defaults(user_agent=None):
"""Load the default evaluators."""
register_evaluator(PreprocessEvaluator(user_agent=user_agent), overwrite=True)
register_evaluator(PostprocessEvaluator(user_agent=user_agent), overwrite=True)
register_evaluator(FileEvaluator(), overwrite=True)
[docs]
def list_evaluators():
"""List the evaluators."""
return list(bootstrap_dictionary.keys())
[docs]
def register_evaluator(evaluator, name=None, overwrite=False):
"""Register an evaluator.
Args:
evaluator (Evaluator): The evaluator object.
name (str): Key name of the evaluator.
overwrite (bool): Whether or not to overwrite the evaluator if it already exists.
"""
if not name:
name = evaluator.name
if not isinstance(evaluator, Evaluator):
raise NotEvaluator()
if name in bootstrap_dictionary and not overwrite:
raise EvaluatorAlreadyRegistered(name)
bootstrap_dictionary[name] = evaluator
[docs]
def deregister_evaluator(name):
"""Deregister an evaluator.
Args:
name (str): The name of the evaluator.
"""
if name not in bootstrap_dictionary:
raise EvaluatorNotRegistered(name)
del bootstrap_dictionary[name]
[docs]
def get_evaluator(name):
"""Get an evaluator.
Args:
name (str): The name of the evaluator.
"""
if name not in bootstrap_dictionary:
raise EvaluatorNotRegistered(name)
return bootstrap_dictionary[name]
[docs]
def is_allowed(name=None, **kwargs):
"""
Check if the content is allowed.
Args:
name (str): The name of a specific evaluator.
**kwargs: Arbitrary keyword arguments to read args from.
"""
if name is not None:
if name not in bootstrap_dictionary:
raise EvaluatorNotRegistered(name)
return bootstrap_dictionary[name].is_allowed(**kwargs)
else:
# since we are preloading evaluators manually, we can check to see which one to call
# based on the kwargs
if "urls" in kwargs:
return bootstrap_dictionary["preprocess"].is_allowed(**kwargs)
elif "url" in kwargs or "response" in kwargs or "headers" in kwargs:
return bootstrap_dictionary["postprocess"].is_allowed(**kwargs)
elif "path" in kwargs:
return bootstrap_dictionary["file"].is_allowed(**kwargs)
else:
raise DefaultEvaluatorNotFound(list(kwargs.keys()))
[docs]
def filter_allowed(name=None, **kwargs):
"""
Filter a list of content.
Args:
name (str): The name of a specific evaluator.
**kwargs: Arbitrary keyword arguments to read args from.
"""
if name is not None:
if name not in bootstrap_dictionary:
raise EvaluatorNotRegistered(name)
return bootstrap_dictionary[name].filter_allowed(**kwargs)
else:
# since we are preloading evaluators manually, we can check to see which one to call
# based on the kwargs
if "urls" in kwargs:
return bootstrap_dictionary["preprocess"].filter_allowed(**kwargs)
else:
raise DefaultEvaluatorNotFound(list(kwargs.keys()))
load_defaults()