Module spark_rest_api.templates

Expand source code
# -*- coding: utf-8 -*-
import re
from pathlib import Path
from types import MappingProxyType

try:
    from importlib.resources import files
except ImportError:
    from importlib_resources import files

from pandas import read_json

from spark_rest_api.data_classes import Template
from spark_rest_api.exceptions import TemplateRenderError
from spark_rest_api.utils import raise_search_error


class TemplatesRepository:
    """Templates Repository
    """

    def __init__(self):
        """Init params
        """
        self.__df = self.__load_df()
        self._data = self._convert_df2dict(self.__df)

    def __repr__(self):
        """Return templates repository representation

        Returns
        -------
        str
            Templates repository representation
        """
        return f"{self}(ids={self.ids})"

    def __str__(self):
        """Str method

        Returns
        -------
        str
            String representation
        """
        return self.__class__.__name__

    def __iter__(self):
        """Yield templates

        Yields
        ------
        generator
            Tuple of template id and template dataclass
        """
        for t_id, template in self._data.items():
            yield t_id, template

    @staticmethod
    def __load_df(df_path=None):
        """Load json data

        Parameters
        ----------
        df_path : str, optional
            Json path, by default None

        Returns
        -------
        pandas.core.frame.DataFrame
            Loaded dataframe
        """
        if df_path is None:
            try:
                df_path = files("spark_rest_api") / ".data"
            except ModuleNotFoundError:
                df_path = Path(__file__).parent / ".data"
        with open(df_path, "rb") as f:
            return read_json(f, orient="records", compression="gzip")

    @staticmethod
    def _convert_df2dict(df):
        """Convert dataframe to dict

        Parameters
        ----------
        df : pandas.core.frame.DataFrame
            Dataframe

        Returns
        -------
        types.MappingProxyType
            Template storage
        """
        _data = {}
        tmpl_rows = df.T.to_dict().values()
        for tmpl_row in tmpl_rows:
            tmpl = Template(**tmpl_row)
            _data[tmpl.id] = tmpl
        return MappingProxyType(_data)

    @property
    def df_md(self):
        """Get markdown table

        Returns
        -------
        str
            Markdown table
        """
        return self.__df[
            ["id", "path", "method", "description"]
            ].to_markdown(tablefmt="grid", index=False)

    @df_md.setter
    def df_md(self):
        """Protect access
        """

    @property
    def ids(self):
        """Return set of templates identifieres

        Returns
        -------
        set
            Templates identifieres
        """
        return {i for i, _ in self}

    @raise_search_error
    def get_template(self, template_id):
        """Get template by template identifier

        Parameters
        ----------
        template_id : int
            Template's identifier

        Returns
        -------
        Template
            Template dataclass
        """
        return self._data[template_id]

    def render_template(self, template_id, **template_vars):
        """Render template

        Parameters
        ----------
        template_id : int
            Template's identifier

        Returns
        -------
        str
            Rendered template
        """
        template = self.get_template(template_id)
        diff = template.path_variables.difference({*template_vars.keys()})
        if diff:
            raise TemplateRenderError(','.join(diff), template.path)
        return template.path.format(**template_vars)

    def find_template_id(self, pattern):
        """Find templates by pattern

        Parameters
        ----------
        search_pattern : str
            Regex or usual string

        Yields
        ------
        Template
            Dataclass
        """
        for _, template in self:
            if re.search(pattern, template.path):
                yield template

Classes

class TemplatesRepository

Templates Repository

Init params

Expand source code
class TemplatesRepository:
    """Templates Repository
    """

    def __init__(self):
        """Init params
        """
        self.__df = self.__load_df()
        self._data = self._convert_df2dict(self.__df)

    def __repr__(self):
        """Return templates repository representation

        Returns
        -------
        str
            Templates repository representation
        """
        return f"{self}(ids={self.ids})"

    def __str__(self):
        """Str method

        Returns
        -------
        str
            String representation
        """
        return self.__class__.__name__

    def __iter__(self):
        """Yield templates

        Yields
        ------
        generator
            Tuple of template id and template dataclass
        """
        for t_id, template in self._data.items():
            yield t_id, template

    @staticmethod
    def __load_df(df_path=None):
        """Load json data

        Parameters
        ----------
        df_path : str, optional
            Json path, by default None

        Returns
        -------
        pandas.core.frame.DataFrame
            Loaded dataframe
        """
        if df_path is None:
            try:
                df_path = files("spark_rest_api") / ".data"
            except ModuleNotFoundError:
                df_path = Path(__file__).parent / ".data"
        with open(df_path, "rb") as f:
            return read_json(f, orient="records", compression="gzip")

    @staticmethod
    def _convert_df2dict(df):
        """Convert dataframe to dict

        Parameters
        ----------
        df : pandas.core.frame.DataFrame
            Dataframe

        Returns
        -------
        types.MappingProxyType
            Template storage
        """
        _data = {}
        tmpl_rows = df.T.to_dict().values()
        for tmpl_row in tmpl_rows:
            tmpl = Template(**tmpl_row)
            _data[tmpl.id] = tmpl
        return MappingProxyType(_data)

    @property
    def df_md(self):
        """Get markdown table

        Returns
        -------
        str
            Markdown table
        """
        return self.__df[
            ["id", "path", "method", "description"]
            ].to_markdown(tablefmt="grid", index=False)

    @df_md.setter
    def df_md(self):
        """Protect access
        """

    @property
    def ids(self):
        """Return set of templates identifieres

        Returns
        -------
        set
            Templates identifieres
        """
        return {i for i, _ in self}

    @raise_search_error
    def get_template(self, template_id):
        """Get template by template identifier

        Parameters
        ----------
        template_id : int
            Template's identifier

        Returns
        -------
        Template
            Template dataclass
        """
        return self._data[template_id]

    def render_template(self, template_id, **template_vars):
        """Render template

        Parameters
        ----------
        template_id : int
            Template's identifier

        Returns
        -------
        str
            Rendered template
        """
        template = self.get_template(template_id)
        diff = template.path_variables.difference({*template_vars.keys()})
        if diff:
            raise TemplateRenderError(','.join(diff), template.path)
        return template.path.format(**template_vars)

    def find_template_id(self, pattern):
        """Find templates by pattern

        Parameters
        ----------
        search_pattern : str
            Regex or usual string

        Yields
        ------
        Template
            Dataclass
        """
        for _, template in self:
            if re.search(pattern, template.path):
                yield template

Instance variables

var df_md

Get markdown table

Returns

str
Markdown table
Expand source code
@property
def df_md(self):
    """Get markdown table

    Returns
    -------
    str
        Markdown table
    """
    return self.__df[
        ["id", "path", "method", "description"]
        ].to_markdown(tablefmt="grid", index=False)
var ids

Return set of templates identifieres

Returns

set
Templates identifieres
Expand source code
@property
def ids(self):
    """Return set of templates identifieres

    Returns
    -------
    set
        Templates identifieres
    """
    return {i for i, _ in self}

Methods

def find_template_id(self, pattern)

Find templates by pattern

Parameters

search_pattern : str
Regex or usual string

Yields

Template
Dataclass
Expand source code
def find_template_id(self, pattern):
    """Find templates by pattern

    Parameters
    ----------
    search_pattern : str
        Regex or usual string

    Yields
    ------
    Template
        Dataclass
    """
    for _, template in self:
        if re.search(pattern, template.path):
            yield template
def get_template(self, template_id)

Get template by template identifier

Parameters

template_id : int
Template's identifier

Returns

Template
Template dataclass
Expand source code
@raise_search_error
def get_template(self, template_id):
    """Get template by template identifier

    Parameters
    ----------
    template_id : int
        Template's identifier

    Returns
    -------
    Template
        Template dataclass
    """
    return self._data[template_id]
def render_template(self, template_id, **template_vars)

Render template

Parameters

template_id : int
Template's identifier

Returns

str
Rendered template
Expand source code
def render_template(self, template_id, **template_vars):
    """Render template

    Parameters
    ----------
    template_id : int
        Template's identifier

    Returns
    -------
    str
        Rendered template
    """
    template = self.get_template(template_id)
    diff = template.path_variables.difference({*template_vars.keys()})
    if diff:
        raise TemplateRenderError(','.join(diff), template.path)
    return template.path.format(**template_vars)