Source code for wolframclient.cli.utils

# -*- coding: utf-8 -*-

from __future__ import absolute_import, print_function, unicode_literals

import argparse
import os
import sys

from wolframclient.utils.decorators import to_dict
from wolframclient.utils.importutils import module_path
from wolframclient.utils.require import require_module

if hasattr(os, "scandir"):
    # python2 do not support scan which is way faster
    # the function was introduced in py3.5, so it's better to just check if the function is there using hasattr.

    def _scan(folder):
        for f in os.scandir(folder):
            yield f.is_dir(), f.name


else:

    def _scan(folder):
        for f in os.listdir(folder):
            yield os.path.isdir(os.path.join(folder, f)), f


def _discover(module, folder=None, walk=True):
    folder = folder or module_path(module)
    for is_folder, filename in _scan(folder):
        if not is_folder:
            yield module, filename
        elif walk and not filename == "__pycache__":
            for args in _discover(
                "%s.%s" % (module, filename), folder=os.path.join(folder, filename), walk=walk
            ):
                yield args


[docs]@to_dict def discover_with_convention(modules, import_name, walk=True): for module in modules: for module, filename in _discover(module, walk=walk): basename, ext = os.path.splitext(filename) if ext == ".py" and not basename == "__init__": yield basename, "%s.%s.%s" % (module, basename, import_name)
[docs]class SimpleCommand(object): help = None print = print dependencies = () def __init__(self, argv=None, name=None): if argv is None: self.argv = tuple(sys.argv) else: self.argv = argv self.name = name
[docs] def create_parser(self): return argparse.ArgumentParser(prog=self.name, description=self.help)
[docs] def add_arguments(self, parser): pass
[docs] def handle(self, *args, **opts): pass
[docs] def main(self): if self.dependencies: require_module(*self.dependencies) parser = self.create_parser() if parser: self.add_arguments(parser) cmd_options = vars(parser.parse_args(self.argv[1:])) args = cmd_options.pop("args", ()) return self.handle(*args, **cmd_options) return self.handle()