Source code for pluginmanager.file_manager
from pluginmanager import util
[docs]class FileManager(object):
"""
`FileManager` manages the file filter state and is responible for
collecting filepaths from a set of directories and filtering the files
through the filters. Without file filters, this class acts as a
passthrough, collecting and returning every file in a given directory.
`FileManager` can also optionally manage the plugin filepath state through
the use of the add/get/set plugin filepaths methods. Note that plugin
interface is not automatically set up this way, although it is
relatively trivial to do.
"""
[docs] def __init__(self,
file_filters=None,
plugin_filepaths=None,
blacklisted_filepaths=None):
"""
`FileFilters` are callable filters. Each filter must take in a
set of filepaths and return back a set of filepaths. Each filter
is applied independently to the set of filepaths and added to the
return set.
`FileFilters` can be a single object or an iterable
`plugin_filepaths` are known plugin filepaths that can be stored
in `FileManager`. Note that filepaths stored in the plugin filepaths
are NOT automatically added when calling the `collect_filepaths`
method. Recommend using absolute paths. `plugin_filepaths` can be a
single object or an interable.
`blacklisted_filepaths` are plugin filepaths that are not to be
included in the collected filepaths. Recommend using absolute paths.
`blacklisted_filepaths` can be a single object or an iterable.
"""
if file_filters is None:
file_filters = []
if plugin_filepaths is None:
plugin_filepaths = set()
if blacklisted_filepaths is None:
blacklisted_filepaths = set()
self.file_filters = util.return_list(file_filters)
# pep8
to_abs_paths = util.to_absolute_paths
self.plugin_filepaths = to_abs_paths(plugin_filepaths)
self.blacklisted_filepaths = to_abs_paths(blacklisted_filepaths)
[docs] def collect_filepaths(self, directories):
"""
Collects and returns every filepath from each directory in
`directories` that is filtered through the `file_filters`.
If no `file_filters` are present, passes every file in directory
as a result.
Always returns a `set` object
`directories` can be a object or an iterable. Recommend using
absolute paths.
"""
plugin_filepaths = set()
directories = util.to_absolute_paths(directories)
for directory in directories:
filepaths = util.get_filepaths_from_dir(directory)
filepaths = self._filter_filepaths(filepaths)
plugin_filepaths.update(set(filepaths))
plugin_filepaths = self._remove_blacklisted(plugin_filepaths)
return plugin_filepaths
[docs] def add_plugin_filepaths(self, filepaths, except_blacklisted=True):
"""
Adds `filepaths` to the `self.plugin_filepaths`. Recommend passing
in absolute filepaths. Method will attempt to convert to
absolute paths if they are not already.
`filepaths` can be a single object or an iterable
If `except_blacklisted` is `True`, all `filepaths` that
have been blacklisted will not be added.
"""
filepaths = util.to_absolute_paths(filepaths)
if except_blacklisted:
filepaths = util.remove_from_set(filepaths,
self.blacklisted_filepaths)
self.plugin_filepaths.update(filepaths)
[docs] def set_plugin_filepaths(self, filepaths, except_blacklisted=True):
"""
Sets `filepaths` to the `self.plugin_filepaths`. Recommend passing
in absolute filepaths. Method will attempt to convert to
absolute paths if they are not already.
`filepaths` can be a single object or an iterable.
If `except_blacklisted` is `True`, all `filepaths` that
have been blacklisted will not be set.
"""
filepaths = util.to_absolute_paths(filepaths)
if except_blacklisted:
filepaths = util.remove_from_set(filepaths,
self.blacklisted_filepaths)
self.plugin_filepaths = filepaths
[docs] def remove_plugin_filepaths(self, filepaths):
"""
Removes `filepaths` from `self.plugin_filepaths`.
Recommend passing in absolute filepaths. Method will
attempt to convert to absolute paths if not passed in.
`filepaths` can be a single object or an iterable.
"""
filepaths = util.to_absolute_paths(filepaths)
self.plugin_filepaths = util.remove_from_set(self.plugin_filepaths,
filepaths)
[docs] def get_plugin_filepaths(self):
"""
returns the plugin filepaths tracked internally as a `set` object.
"""
return self.plugin_filepaths
[docs] def set_file_filters(self, file_filters):
"""
Sets internal file filters to `file_filters` by tossing old state.
`file_filters` can be single object or iterable.
"""
file_filters = util.return_list(file_filters)
self.file_filters = file_filters
[docs] def add_file_filters(self, file_filters):
"""
Adds `file_filters` to the internal file filters.
`file_filters` can be single object or iterable.
"""
file_filters = util.return_list(file_filters)
self.file_filters.extend(file_filters)
[docs] def remove_file_filters(self, file_filters):
"""
Removes the `file_filters` from the internal state.
`file_filters` can be a single object or an iterable.
"""
self.file_filters = util.remove_from_list(self.file_filters,
file_filters)
[docs] def get_file_filters(self, filter_function=None):
"""
Gets the file filters.
`filter_function`, can be a user defined filter. Should be callable
and return a list.
"""
if filter_function is None:
return self.file_filters
else:
return filter_function(self.file_filters)
[docs] def add_blacklisted_filepaths(self, filepaths, remove_from_stored=True):
"""
Add `filepaths` to blacklisted filepaths.
If `remove_from_stored` is `True`, any `filepaths` in
`plugin_filepaths` will be automatically removed.
Recommend passing in absolute filepaths but method will attempt
to convert to absolute filepaths based on current working directory.
"""
filepaths = util.to_absolute_paths(filepaths)
self.blacklisted_filepaths.update(filepaths)
if remove_from_stored:
self.plugin_filepaths = util.remove_from_set(self.plugin_filepaths,
filepaths)
[docs] def set_blacklisted_filepaths(self, filepaths, remove_from_stored=True):
"""
Sets internal blacklisted filepaths to filepaths.
If `remove_from_stored` is `True`, any `filepaths` in
`self.plugin_filepaths` will be automatically removed.
Recommend passing in absolute filepaths but method will attempt
to convert to absolute filepaths based on current working directory.
"""
filepaths = util.to_absolute_paths(filepaths)
self.blacklisted_filepaths = filepaths
if remove_from_stored:
self.plugin_filepaths = util.remove_from_set(self.plugin_filepaths,
filepaths)
[docs] def remove_blacklisted_filepaths(self, filepaths):
"""
Removes `filepaths` from blacklisted filepaths
Recommend passing in absolute filepaths but method will attempt
to convert to absolute filepaths based on current working directory.
"""
filepaths = util.to_absolute_paths(filepaths)
black_paths = self.blacklisted_filepaths
black_paths = util.remove_from_set(black_paths, filepaths)
[docs] def get_blacklisted_filepaths(self):
"""
Returns the blacklisted filepaths as a set object.
"""
return self.blacklisted_filepaths
def _remove_blacklisted(self, filepaths):
"""
internal helper method to remove the blacklisted filepaths
from `filepaths`.
"""
filepaths = util.remove_from_set(filepaths, self.blacklisted_filepaths)
return filepaths
def _filter_filepaths(self, filepaths):
"""
helps iterate through all the file parsers
each filter is applied individually to the
same set of `filepaths`
"""
if self.file_filters:
plugin_filepaths = set()
for file_filter in self.file_filters:
plugin_paths = file_filter(filepaths)
plugin_filepaths.update(plugin_paths)
else:
plugin_filepaths = filepaths
return plugin_filepaths