Source code for stoqlib.lib.console

#!/usr/bin/env python
# -*- Mode: Python; coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4

##
## Copyright (C) 2005-2012 Async Open Source <http://www.async.com.br>
## All rights reserved
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
## Author(s):   Stoq Team   <stoq-devel@async.com.br>
##
""" A debug session for domain objects.  """

import code
import datetime
import os
import readline
import rlcompleter
rlcompleter  # pylint: disable=W0104

from stoqlib.api import api
from stoqlib.database.tables import get_table_types

from stoq import version as stoq_version

try:
    from IPython.config.loader import Config
    from IPython.frontend.terminal.embed import embed
    USE_IPYTHON = True
except ImportError:
    USE_IPYTHON = False


[docs]class Console(object): def __init__(self): self.store = api.new_store() self.ns = {}
[docs] def populate_namespace(self, bare): for table in get_table_types(): self.ns[table.__name__] = table self.ns['store'] = self.store self.ns['sysparam'] = api.sysparam self.ns['api'] = api if not bare: self.ns['branch'] = api.get_current_branch(self.store) self.ns['station'] = api.get_current_station(self.store) self.ns['now'] = datetime.datetime.now self.ns['today'] = datetime.date.today for name in ('stoqlib.database.runtime', 'stoqlib.lib.interfaces', 'stoqlib.domain.interfaces'): mod = __import__(name, {}, {}, ' ') self.ns.update(mod.__dict__)
[docs] def get_console_banner(self): db_string = '%s on %s:%s (%s)' % (api.db_settings.dbname, api.db_settings.address, api.db_settings.port, api.db_settings.rdbms) return 'Stoq version %s, connected to %s' % ( stoq_version, db_string)
[docs] def interact(self, vars=None): if vars is not None: self.ns.update(vars) # Set the default encoding to utf-8, pango/gtk normally does # this but we don't want to import that here. import sys reload(sys) sys.setdefaultencoding('utf-8') banner = self.get_console_banner() # PyCharm doesn't support colors and tabs if USE_IPYTHON: config = Config() if 'PYCHARM_HOSTED' in os.environ: config.TerminalInteractiveShell.colors = 'NoColor' embed(config=config, user_ns=self.ns, banner1=banner) else: readline.parse_and_bind("tab: complete") code.interact(local=self.ns, banner=banner)
[docs] def execute(self, filename): execfile(filename, self.ns)