Source code for dtale.cli.loaders

import os
import platform
from logging import getLogger

import click

from dtale.cli.loaders import arctic_loader, csv_loader

logger = getLogger(__name__)


[docs]def build_custom_module_loader_args(fname, path): return 'dtale.cli.loaders.{}'.format(fname), '{}/{}.py'.format(path, fname)
[docs]def get_py35_loader(fname, path): """ Utility function for loading dynamic modules (CLI configurations) when python_version >= 3.5 """ import importlib.util spec = importlib.util.spec_from_file_location(*build_custom_module_loader_args(fname, path)) custom_loader = importlib.util.module_from_spec(spec) spec.loader.exec_module(custom_loader) return custom_loader
[docs]def get_py33_loader(fname, path): """ Utility function for loading dynamic modules (CLI configurations) when python_version in (3.3, 3.4) """ from importlib.machinery import SourceFileLoader return SourceFileLoader(*build_custom_module_loader_args(fname, path)).load_module()
[docs]def get_py2_loader(fname, path): """ Utility function for loading dynamic modules (CLI configurations) when python_version < 3 """ import imp return imp.load_source(*build_custom_module_loader_args(fname, path))
[docs]def unsupported_python_version(version_tuple): return ( 'Unsupported version of python used for custom CLI loaders, {}. If you do not plan on using any custom ' 'CLI loaders please remove your DTALE_CLI_LOADERS environment variable.' ).format(version_tuple)
[docs]def custom_module_loader(): """ Utility function for using different module loaders based on python version: * :func:dtale.cli.loaders.get_py35_loader * :func:dtale.cli.loaders.get_py33_loader * :func:dtale.cli.loaders.get_py2_loader """ major, minor, revision = [int(i) for i in platform.python_version_tuple()] if major == 2: return get_py2_loader if major == 3: if minor >= 5: return get_py35_loader elif minor in (3, 4): return get_py33_loader raise ValueError(unsupported_python_version(platform.python_version_tuple()))
LOADERS = { arctic_loader.LOADER_KEY: arctic_loader, csv_loader.LOADER_KEY: csv_loader }
[docs]def build_loaders(): """ Utility function executed at runtime to load dynamic CLI options from the environment variable, DTALE_CLI_LOADERS. You either override one of the two default loader configurations, arctic or csv, or create a brand new configuration which can be referenced from the command line. """ global LOADERS custom_loader_path = os.environ.get('DTALE_CLI_LOADERS') if custom_loader_path is not None: custom_loader_func = custom_module_loader() for full_filename in os.listdir(custom_loader_path): filename, file_extension = os.path.splitext(full_filename) if file_extension == '.py': custom_loader = custom_loader_func(filename, custom_loader_path) if hasattr(custom_loader, 'LOADER_KEY') and hasattr(custom_loader, 'LOADER_PROPS'): LOADERS[custom_loader.LOADER_KEY] = custom_loader
[docs]def setup_loader_options(): """ Utility function executed at runtime to find dynamic CLI options as well as the defaults and create their `click` decorators to keyword arguments will be processed accordingly. """ build_loaders() def decorator(f): for cli_loader in LOADERS.values(): if len(cli_loader.LOADER_PROPS): for p in cli_loader.LOADER_PROPS: f = click.option( '--' + cli_loader.LOADER_KEY + '-' + p, help='Override {} {}'.format(cli_loader.LOADER_KEY, p) )(f) else: f = click.option( '--' + cli_loader.LOADER_KEY, is_flag=True, help='Use {} loader'.format(cli_loader.LOADER_KEY) )(f) return f return decorator
[docs]def check_loaders(kwargs): """ Utility function to find which CLI loader is being used based on the `click` options/flags provided from the command line """ for cli_loader in LOADERS.values(): cli_loader_func = cli_loader.find_loader(kwargs) if cli_loader_func is not None: return cli_loader_func return None