Bogdanp/hugs

View on GitHub
hugs/expression.py

Summary

Maintainability
A
1 hr
Test Coverage
from collections import namedtuple
from itertools import chain


_TEMPLATE = """\
def {name}(self, __cursor{args}):
    {doc!r}
    return __cursor.execute({body!r}{params})
"""


class Expression(namedtuple("Expression", ("name", "args", "kwargs", "is_command", "doc", "body"))):
    """A SQL expression plus some metadata.

    Parameters:
      name(str): The name of the expression.
      args(tuple[str]): The positional argument names.
      kwargs(tuple[str]): The keyword-only argument names.
      is_command(bool): Whether or not the expression is a command.
      doc(str): The docstring.
      body(str): The full body of the expression.
    """

    def __new__(cls, name, args=(), kwargs=(), is_command=False, doc="", body=""):
        return super().__new__(cls, name, args, kwargs, is_command, doc, body)

    def to_source_code(self):
        args, params = "", ""
        for name in self.args:
            args += f", {name}"

        if self.kwargs:
            args += ", *"

        for name in self.kwargs:
            args += f", {name}"

        if self.args or self.kwargs:
            params = ", {"
            for name in chain(self.args, self.kwargs):
                params += f"{name!r}: {name},"

            params += "}"

        return _TEMPLATE.format(
            name=self.name,
            doc=self.doc,
            body=self.body,
            args=args,
            params=params,
        )