Bogdanp/hugs

View on GitHub
hugs/repository.py

Summary

Maintainability
A
0 mins
Test Coverage
import types

from .parser import parse


class Repository:
    """Repositories hold sets of queries and commands.
    """

    def load_queries(self, *filenames):
        """Add queries and commands to this repository from one or
        more SQL files.

        Parameters:
          \*filenames(tuple[str]): A list of SQL filenames.

        Raises:
          ParseError: If any of the files can't be parsed.
        """
        functions = {}
        for filename in filenames:
            with open(filename, "r") as fp:
                data = fp.read()

            for expression in parse(data):
                source_code = expression.to_source_code()
                code = compile(source_code, filename, "exec")
                exec(code, {}, functions)

                function = functions[expression.name]
                function.__sql__ = expression.body
                function.is_command = expression.is_command
                setattr(self, expression.name, types.MethodType(function, self))