Source code for coalib.parsing.FilterHelper
from coalib.parsing.InvalidFilterException import InvalidFilterException
from coalib.parsing.filters import available_filters
[docs]def is_valid_filter(filter):
return filter in available_filters
def _filter_section_bears(bears, args, filter_name):
filter_function = available_filters[filter_name]
return {section:
tuple(bear for bear in bears[section]
if filter_function(bear, args))
for section in bears}
[docs]def apply_filter(filter_name, filter_args, all_bears=None):
"""
Returns bears after filtering based on ``filter_args``. It returns
all bears if nothing is present in ``filter_args``.
:param filter_name:
Name of the filter.
:param filter_args:
Arguments of the filter to be passed in.
For example:
``['c', 'java']``
:param all_bears:
List of bears on which filter is to be applied.
All the bears are loaded automatically by default.
:return:
Filtered bears based on a single filter.
"""
if all_bears is None:
from coalib.settings.ConfigurationGathering import (
get_all_bears)
all_bears = get_all_bears()
if not is_valid_filter(filter_name):
raise InvalidFilterException(filter_name)
if not filter_args or len(filter_args) == 0:
return all_bears
filter_args = {arg.lower() for arg in filter_args}
local_bears, global_bears = all_bears
local_bears = _filter_section_bears(
local_bears, filter_args, filter_name)
global_bears = _filter_section_bears(
global_bears, filter_args, filter_name)
return local_bears, global_bears
[docs]def apply_filters(filters, bears=None):
"""
Returns bears after filtering based on ``filters``. It returns
intersection of bears if more than one element is present in ``filters``
list.
:param filters:
List of args based on ``bears`` has to be filtered.
For example:
``[['language', 'c', 'java'], ['can_fix', 'syntax']]``
:param bears:
The bears to filter.
:return:
Filtered bears.
"""
for filter in filters:
filter_name, *filter_args = filter
bears = apply_filter(filter_name, filter_args, bears)
return bears