Source code for hyperstream.channels.module_channel

# The MIT License (MIT) # Copyright (c) 2014-2017 University of Bristol
#
#  Permission is hereby granted, free of charge, to any person obtaining a copy
#  of this software and associated documentation files (the "Software"), to deal
#  in the Software without restriction, including without limitation the rights
#  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#  copies of the Software, and to permit persons to whom the Software is
#  furnished to do so, subject to the following conditions:
#
#  The above copyright notice and this permission notice shall be included in all
#  copies or substantial portions of the Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
#  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
#  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
#  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
#  OR OTHER DEALINGS IN THE SOFTWARE.

from .file_channel import FileChannel

from os.path import join
from re import sub
import logging
import imp
import sys


[docs]class ModuleChannel(FileChannel): """ A channel of module streams, the documents in the streams contain functions that can be called to import the respective module """ versions = None
[docs] def update_state(self, up_to_timestamp): super(ModuleChannel, self).update_state(up_to_timestamp)
[docs] def file_filter(self, sorted_file_names): for tool_info in super(ModuleChannel, self).file_filter(sorted_file_names): if tool_info.is_python: yield tool_info
[docs] def data_loader(self, short_path, tool_info): module_file = join(self.path, short_path, tool_info.long_filename) module_file_components = module_file[:-3].split('/') def module_importer(): with open(module_file, 'rb') as fp: # logging.debug('importing: ' + module_file) module_name = '_'.join(map(lambda pp: sub(r'[^a-zA-Z0-9]', '_', pp), module_file_components)) if module_name in sys.modules: logging.debug("module {} already loaded ... skipping".format(module_name)) return sys.modules[module_name] mod = imp.load_module( module_name, fp, module_file, ('.py', 'rb', imp.PY_SOURCE) ) return mod return tool_info.version, module_importer