From aa94795b6f66934ecbb1b0d8c5561f8916dfd1bd Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Thu, 13 May 2010 10:41:09 -0400 Subject: [PATCH] Add --script and --command to bin/hooke --- hooke/hooke.py | 46 +++++++++++++++++++++++++++++++++++++++++ hooke/ui/__init__.py | 11 +++++----- hooke/ui/commandline.py | 8 +++++++ 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/hooke/hooke.py b/hooke/hooke.py index 2de41f5..60449a1 100644 --- a/hooke/hooke.py +++ b/hooke/hooke.py @@ -9,7 +9,10 @@ COPYRIGHT ''' import multiprocessing +import optparse +import os.path import unittest +import sys from . import engine as engine from . import config as config_mod @@ -74,8 +77,51 @@ class Hooke (object): ui_to_command.put(ui.CloseEngine()) command.join() + def run_lines(self, lines): + """Run the pre-set commands `lines` with the "command line" UI. + + Allows for non-interactive sessions that are otherwise + equivalent to :meth:'.run'. + """ + cmdline = ui.load_ui(self.config, 'command line') + ui_to_command = multiprocessing.Queue() + command_to_ui = multiprocessing.Queue() + command = multiprocessing.Process( + target=self.command.run, args=(self, ui_to_command, command_to_ui)) + command.start() + try: + cmdline.run_lines( + self.commands, ui_to_command, command_to_ui, lines) + finally: + ui_to_command.put(ui.CloseEngine()) + command.join() + def main(): + p = optparse.OptionParser() + p.add_option( + '-s', '--script', dest='script', metavar='FILE', + help='Script of command line Hooke commands to run.') + p.add_option( + '-c', '--command', dest='commands', metavar='COMMAND', + action='append', default=[], + help='Add a command line Hooke command to run.') + options,arguments = p.parse_args() + if len(arguments) > 0: + print >> sys.stderr, 'Too many arguments to %s: %d > 0' \ + % (sys.argv[0], len(arguments)) + print >> sys.stderr, p.help() + sys.exit(1) + app = Hooke(debug=__debug__) + + if options.script != None: + f = open(os.path.expanduser(options.script), 'r') + options.commands.extend(f.readlines()) + f.close + if len(options.commands) > 0: + app.run_lines(options.commands) + sys.exit(0) + try: app.run() finally: diff --git a/hooke/ui/__init__.py b/hooke/ui/__init__.py index 7836d3a..1f2bd4e 100644 --- a/hooke/ui/__init__.py +++ b/hooke/ui/__init__.py @@ -129,11 +129,12 @@ def default_settings(): settings.extend(ui.default_settings()) return settings -def load_ui(config): - uis = [c for c,v in config.items(USER_INTERFACE_SETTING_SECTION) if v == 'True'] - assert len(uis) == 1, 'Can only select one UI, not %d: %s' % (len(uis),uis) - ui_name = uis[0] - ui = USER_INTERFACES[ui_name] +def load_ui(config, name=None): + if name == None: + uis = [c for c,v in config.items(USER_INTERFACE_SETTING_SECTION) if v == 'True'] + assert len(uis) == 1, 'Can only select one UI, not %d: %s' % (len(uis),uis) + name = uis[0] + ui = USER_INTERFACES[name] try: ui.config = dict(config.items(ui.setting_section)) except configparser.NoSectionError: diff --git a/hooke/ui/commandline.py b/hooke/ui/commandline.py index 8391197..9b2effe 100644 --- a/hooke/ui/commandline.py +++ b/hooke/ui/commandline.py @@ -351,3 +351,11 @@ class CommandLine (UserInterface): inqueue=ui_to_command_queue, outqueue=command_to_ui_queue) cmd.cmdloop(self._splash_text()) + + def run_lines(self, commands, ui_to_command_queue, command_to_ui_queue, + lines): + cmd = HookeCmd(self, commands, + inqueue=ui_to_command_queue, + outqueue=command_to_ui_queue) + for line in lines: + cmd.onecmd(line) -- 2.26.2