Source code for pycharmers.utils.templates

#coding: utf-8
import os
from ._path import TEMPLATES_DIR
from ._colorings import toBLUE
from jinja2 import Environment, FileSystemLoader, TemplateNotFound, Template

[docs]def render_template(template_name_or_string, context={}, path=None, searchpath=TEMPLATES_DIR, **envkwargs): """Render Template. Args: template_name_or_string (str) : The name of the template to be rendered or a string. context (dict) : The variables that should be available in the context of the template. path (str) : If given, output to ``path`` file. searchpath (str) : (Default= ``TEMPLATES_DIR`` ) Examples: >>> import matplotlib >>> from pycharmers.utils import render_template >>> render_template( ... template_name_or_string="fonts.html", ... context={"fonts": sorted(set([f.name for f in matplotlib.font_manager.fontManager.ttflist]))} >>> ) """ env = Environment(loader=FileSystemLoader(searchpath=searchpath), **envkwargs) try: template = env.get_template(name=template_name_or_string) except TemplateNotFound: template = env.from_string(source=template_name_or_string) string = template.render(**context) if path is None: print(string) else: with open(path, mode="w") as f: f.write(string) print(f"Content was saved at {toBLUE(path)}.")
def _mk_func(fn, name): """Make a function which is for documentation. Args: fn (str): Filename. Returns: function: function which has the google docstrings (HTML content is contained.) Examples: >>> from pycharmers.utils.templates import _mk_func >>> func = _mk_func(fn="base.html", name="base_html") """ fp = os.path.join(TEMPLATES_DIR, fn) with open(fp, mode="r") as f: code = "\t".join(f.readlines()) def func(): return fp func.__doc__ = f"""Return the path to ``TEMPLATES_DIR``/{fn} Returns: str : Where this file is. The contents of the file are as follows: .. code-block:: html {code} Examples: >>> from pycharmers.utils.templates import {name} >>> {name}() """ return func for fn in os.listdir(TEMPLATES_DIR): if fn[-5:] != ".html": continue name = fn.replace(".", "_") exec(f"{name} = _mk_func('{fn}', '{name}')")
[docs]class defFunction(): def __init__(self, func_name, short_description="", description="", is_method=False): self.func_name = func_name self.short_description = short_description self.description = description self.is_method = is_method self.argwidth = 0 self.arguments = {}
[docs] def set_example(self, prefix="", suffix=""): if prefix=="": prefix = ">>> " + self.func_name + "(" self.example_prefix = prefix self.example_suffix = suffix self.examples=True
[docs] def set_returns(self, name, type, description=""): self.returns = f"{name} ({type.__name__}): {description}"
[docs] def sort_arguments(self): self.arguments = dict(sorted(self.arguments.items(), key=lambda x: x[1]["is_required"], reverse=True))
[docs] def set_argument(self, name, default, example=None, description="", type=str, is_required=True, **kwargs): name_type = f"{name} ({type.__name__})" argumeta = { "type": type, "is_required": is_required, "default": default, "example": example, "description": description, "name_type": name_type, } argumeta.update(kwargs) self.arguments[name] = argumeta self.argwidth = max(self.argwidth, len(name_type))
[docs] def set_arguments(self, **arguments): for argname, argmeta in arguments.items: self.set_argument(name=argname, **argmeta)
[docs] def create(self): self.sort_arguments() render_template( template_name_or_string="def.html", context=self.__dict__, searchpath=TEMPLATES_DIR, )