Source code for whisk.whisk

"""Main module."""
import whisk
from whisk.cli.log_tree import PARENT_TREE_NODE_PREFIX, CHILD_TREE_NODE_PREFIX
from cookiecutter.main import cookiecutter
from os.path import realpath
# https://docs.python.org/3/library/pathlib.html
# Object-oriented filesystem paths
from pathlib import Path
import logging

[docs]logger = logging.getLogger(__name__)
[docs]def root_module_dir(): """ Returns a Path object with the root whisk module directory. """ filepath = realpath(__file__) return Path(filepath).parents[0]
[docs]def cookiecutter_template_dir(): return str(root_module_dir() / 'template/')
[docs]def to_slug(str): """ Converts a string to a slug: * Makes all letters lowercase * Replaces spaces with underscores """ return str.lower().replace(' ', '_')
[docs]def create(dir, force=False, module_name=None, dependency=f"whisk=={whisk.__version__}", install_requires=f"whisk=={whisk.__version__}"): """ Creates a whisk project. Parameters ---------- dir : str Path of the directory to create the project. The directory name is converted to a slug via :func:`project_name_to_slug`. module_name : str, optional Name of the module used when importing the project. This is converted to a slug via :func:`project_name_to_slug`. Default is the ``project_name``. force : bool, optional Recreates the project directory if it exists. Default is `False`. dependency : str, optional The whisk dependency entry in the project's requirements.txt file. Default locks to the current version. The version lock is restrictive as earlier and later versions of whisk could expect a different template structure and break functionality. install_requires : str, optional The whisk ``install_requires`` entry in the project's ``setup.py`` file. Default locks to the current version. The version lock is restrictive as earlier and later versions of whisk could expect a different template structure and break functionality. """ path = Path(dir).absolute() logger.debug(f"Creating project in {path}.") project_name = path.stem output_dir = path.parent project_name_slug = to_slug(project_name) if module_name: module_name_slug = to_slug(module_name) else: module_name_slug = project_name_slug # `whisk_dependency` is more flexible (for example, specifying a local # install) than `whisk_install_requires` and is used in testing to require # the local version of whisk. extra_content = { "repo_name": project_name_slug, "project_name": module_name_slug, "whisk_dependency": dependency, "whisk_install_requires": install_requires } logger.debug(f"Creating whisk project with extra_content={extra_content}") logger.info(PARENT_TREE_NODE_PREFIX + "Creating project directory structure...") res = cookiecutter(cookiecutter_template_dir(), no_input=True, overwrite_if_exists=force, output_dir=output_dir, extra_context=extra_content) logger.info(CHILD_TREE_NODE_PREFIX+"Project created in %s", res) logger.info(CHILD_TREE_NODE_PREFIX+"DONE.") return res