Module shaystack.providers.repl_db
User interface to print the translation between filter syntax to others syntaxes.
Expand source code
# -*- coding: utf-8 -*-
# User interface to print the translation between filter syntax to others syntaxes.
# See the accompanying LICENSE file.
# (C) 2021 Engie Digital
#
# vim: set ts=4 sts=4 et tw=78 sw=4 si:
"""
User interface to print the translation between filter syntax to others syntaxes.
"""
import cmd
import datetime
import logging
import os
import pprint
import sys
import traceback
from typing import cast, Dict
from urllib.parse import urlparse
import pytz
from shaystack.grid_filter import _filter_to_python
from shaystack.providers import get_provider
from shaystack.providers.db_mongo import _mongo_filter
from shaystack.providers.db_mysql import _sql_filter as mysql_sql_filter
from shaystack.providers.db_postgres import _sql_filter as pg_sql_filter
from shaystack.providers.db_sqlite import _sql_filter as sqlite_sql_filter
from shaystack.providers.sql import Provider as SQLProvider
FAKE_NOW = datetime.datetime(2020, 10, 1, 0, 0, 0, 0, tzinfo=pytz.UTC)
def main():
"""Loop to test the postgres generation with REPL"""
envs = cast(Dict[str, str], os.environ)
if "HAYSTACK_DB" not in envs:
envs["HAYSTACK_DB"] = "sqlite3+sqlite3:///:memory:"
if "HAYSTACK_PROVIDER" not in envs:
envs["HAYSTACK_PROVIDER"] = "shaystack.providers.db"
provider = get_provider(envs["HAYSTACK_PROVIDER"], envs)
scheme = urlparse(envs["HAYSTACK_DB"]).scheme
# noinspection PyMethodMayBeStatic
class HaystackRequest(cmd.Cmd):
""" Haystack REPL interface """
__slots__ = ("provider",)
# noinspection PyShadowingNames
def __init__(self, provider):
super().__init__()
self.provider = provider
def do_python(self, arg: str) -> None: # pylint: disable=no-self-use
# noinspection PyBroadException
try:
_, python_code = _filter_to_python(arg)
print(python_code)
print()
except Exception: # pylint: disable=broad-except
traceback.print_exc()
def do_pg(self, arg: str) -> None:
# noinspection PyBroadException
try:
sql_request = pg_sql_filter("haystack", arg, FAKE_NOW, 1, "customer")
print(sql_request)
print()
if scheme.startswith("postgres") and isinstance(self.provider, SQLProvider):
cursor = self.provider.get_connect().cursor()
cursor.execute(sql_request)
cursor.close()
except Exception: # pylint: disable=broad-except
traceback.print_exc()
def do_mysql(self, arg: str) -> None:
# noinspection PyBroadException
try:
sql_request = mysql_sql_filter("haystack", arg, FAKE_NOW, 1, "customer")
print(sql_request)
print()
if scheme.startswith("mysql") and isinstance(self.provider, SQLProvider):
cursor = self.provider.get_connect().cursor()
cursor.execute(sql_request)
cursor.close()
except Exception: # pylint: disable=broad-except
traceback.print_exc()
def do_sqlite(self, arg: str) -> None:
# noinspection PyBroadException
try:
sql_request = sqlite_sql_filter("haystack", arg, FAKE_NOW, 1, "customer")
print(sql_request)
print()
if scheme.startswith("sqlite") and isinstance(self.provider, SQLProvider):
cursor = self.provider.get_connect().cursor()
cursor.execute(sql_request)
cursor.close()
except Exception: # pylint: disable=broad-except
traceback.print_exc()
def do_mongo(self, arg: str) -> None: # pylint: disable=no-self-use
# noinspection PyBroadException
try:
mongo_request = _mongo_filter(arg, FAKE_NOW, 1, "customer")
pprint.PrettyPrinter(indent=4).pprint(mongo_request)
print()
except Exception: # pylint: disable=broad-except
traceback.print_exc()
def do_bye(self, _: str) -> bool: # pylint: disable=unused-argument,no-self-use
return True
try:
HaystackRequest(provider).cmdloop()
except KeyboardInterrupt:
return 0
return 0
if __name__ == '__main__':
logging.basicConfig(level=os.environ.get("LOG_LEVEL", "ERROR"))
sys.exit(main())
Functions
def main()
-
Loop to test the postgres generation with REPL
Expand source code
def main(): """Loop to test the postgres generation with REPL""" envs = cast(Dict[str, str], os.environ) if "HAYSTACK_DB" not in envs: envs["HAYSTACK_DB"] = "sqlite3+sqlite3:///:memory:" if "HAYSTACK_PROVIDER" not in envs: envs["HAYSTACK_PROVIDER"] = "shaystack.providers.db" provider = get_provider(envs["HAYSTACK_PROVIDER"], envs) scheme = urlparse(envs["HAYSTACK_DB"]).scheme # noinspection PyMethodMayBeStatic class HaystackRequest(cmd.Cmd): """ Haystack REPL interface """ __slots__ = ("provider",) # noinspection PyShadowingNames def __init__(self, provider): super().__init__() self.provider = provider def do_python(self, arg: str) -> None: # pylint: disable=no-self-use # noinspection PyBroadException try: _, python_code = _filter_to_python(arg) print(python_code) print() except Exception: # pylint: disable=broad-except traceback.print_exc() def do_pg(self, arg: str) -> None: # noinspection PyBroadException try: sql_request = pg_sql_filter("haystack", arg, FAKE_NOW, 1, "customer") print(sql_request) print() if scheme.startswith("postgres") and isinstance(self.provider, SQLProvider): cursor = self.provider.get_connect().cursor() cursor.execute(sql_request) cursor.close() except Exception: # pylint: disable=broad-except traceback.print_exc() def do_mysql(self, arg: str) -> None: # noinspection PyBroadException try: sql_request = mysql_sql_filter("haystack", arg, FAKE_NOW, 1, "customer") print(sql_request) print() if scheme.startswith("mysql") and isinstance(self.provider, SQLProvider): cursor = self.provider.get_connect().cursor() cursor.execute(sql_request) cursor.close() except Exception: # pylint: disable=broad-except traceback.print_exc() def do_sqlite(self, arg: str) -> None: # noinspection PyBroadException try: sql_request = sqlite_sql_filter("haystack", arg, FAKE_NOW, 1, "customer") print(sql_request) print() if scheme.startswith("sqlite") and isinstance(self.provider, SQLProvider): cursor = self.provider.get_connect().cursor() cursor.execute(sql_request) cursor.close() except Exception: # pylint: disable=broad-except traceback.print_exc() def do_mongo(self, arg: str) -> None: # pylint: disable=no-self-use # noinspection PyBroadException try: mongo_request = _mongo_filter(arg, FAKE_NOW, 1, "customer") pprint.PrettyPrinter(indent=4).pprint(mongo_request) print() except Exception: # pylint: disable=broad-except traceback.print_exc() def do_bye(self, _: str) -> bool: # pylint: disable=unused-argument,no-self-use return True try: HaystackRequest(provider).cmdloop() except KeyboardInterrupt: return 0 return 0