Source code for freckles.frecklet.describe

# -*- coding: utf-8 -*-
import logging
from collections import Mapping

import click

from freckles.defaults import (
    FRECKLET_KEY_NAME,
    VARS_KEY,
    TASK_KEY_NAME,
    FRECKLES_DESC_METADATA_KEY,
    FRECKLES_DESC_LONG_METADATA_KEY,
    FRECKLES_DESC_SHORT_METADATA_KEY,
    FRECKLES_DESC_REFERENCES_METADATA_KEY,
)
from freckles.frecklet.vars import VarsInventory
from frutils import dict_merge, reindent, readable
from frutils.doc import Doc

log = logging.getLogger("freckles")





[docs]def describe_frecklet(context, frecklet, vars, auto_vars=False): fx = frecklet.create_frecklecutable(context=context) var_all = {} if isinstance(vars, Mapping): vars = [vars] for v in vars: dict_merge(var_all, v, copy_dct=False) auto_vars_dict = None if auto_vars: params = fx.frecklet.vars auto_vars_dict = create_auto_vars( params, existing_vars=var_all, frecklet=fx.frecklet ) var_all = dict_merge(auto_vars_dict, var_all, copy_dct=True) inv = VarsInventory(var_all) run_inventory, secret_vars = fx.create_run_inventory(inventory=inv) tasks = fx.process_tasks(inventory=run_inventory) result = [] for task in tasks: # output(task, output_type="yaml") f_type = task[FRECKLET_KEY_NAME]["type"] name = task[FRECKLET_KEY_NAME]["name"] f_doc = Doc( task[FRECKLET_KEY_NAME].get(FRECKLES_DESC_METADATA_KEY, {}), short_help_key=FRECKLES_DESC_SHORT_METADATA_KEY, help_key=FRECKLES_DESC_LONG_METADATA_KEY, further_reading_key=FRECKLES_DESC_REFERENCES_METADATA_KEY, ) title = f_doc.get_short_help( default=None, use_help=False, list_item_format=True ) if title: if title.startswith("["): title = title[1:] if title.endswith("]"): title = title[0:-1] else: title = None if f_type == "frecket": alt_title = context.get_frecklet(name).doc.get_short_help( list_item_format=True ) alt_desc = context.get_frecklet(name).doc.get_short_help( list_item_format=False ) if alt_desc: alt_desc = alt_desc.strip() else: alt_title = "execute {}: {}".format(f_type, name) alt_desc = "Run {} '{}'".format(f_type, name) desc = f_doc.get_help(default=None, use_short_help=False) if desc: desc = desc.strip() if not task.get(VARS_KEY): alt_desc = alt_desc + " (no variables used)." else: vars_string = readable(task[VARS_KEY], out="yaml") alt_desc = alt_desc + " using variables:\n\n" + reindent(vars_string, 2) alt_desc = alt_desc.strip() if task.get(TASK_KEY_NAME, None): task_string = readable(task[TASK_KEY_NAME], out="yaml") alt_desc = ( alt_desc + "\n\nand task metadata:\n\n" + reindent(task_string, 2) ) alt_desc = alt_desc.strip() task_md = {} task_md["title"] = title task_md["alt_title"] = alt_title task_md["desc"] = desc task_md["alt_desc"] = alt_desc task_md["references"] = f_doc.get_further_reading() result.append(task_md) return result, auto_vars_dict
[docs]def create_auto_vars(params, existing_vars={}, frecklet=None): if frecklet is not None: examples = frecklet.doc.get_examples() if examples: vars = examples[0].get("vars") return vars required = [] for name, p in params.items(): if name in existing_vars.keys(): continue if p._schema.get("required", True) and p._schema.get("default", None) is None: required.append((name, p)) add_vars = {} for p in required: val = None name = p[0] scheme = p[1]._schema empty = scheme.get("empty", False) p_type = scheme.get("type", "string") if empty: if p_type == "string": val = "" elif p_type == "list": val = [] elif p_type == "dict": val = {} if val is None: if p_type == "string": if "path" in name: val = "/tmp/parent-folder/var--{}--example".format(name) elif "content" in name: val = """Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.""" else: val = "[var--{}--]".format(name) elif p_type == "list": val = ["[var--{}--]".format(name)] elif p_type == "dict": val = {"[var--key-{}--]".format(name): "[var--val-{}--]".format(name)} elif p_type == "integer": val = "1" elif p_type == "boolean": val = True elif p_type == "password": val = "[var--password-{}--]".format(name) else: val = "[var--unknown_type-{}--[".format(name) add_vars[name] = val return add_vars