Add --script and --command to bin/hooke
authorW. Trevor King <wking@drexel.edu>
Thu, 13 May 2010 14:41:09 +0000 (10:41 -0400)
committerW. Trevor King <wking@drexel.edu>
Thu, 13 May 2010 14:41:09 +0000 (10:41 -0400)
hooke/hooke.py
hooke/ui/__init__.py
hooke/ui/commandline.py

index 2de41f51e897c9fd98e40826fbe035236a8d3eea..60449a1072f90092cb755a99829b193ed22c4e0c 100644 (file)
@@ -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:
index 7836d3aa0e36a7e3d473c59f4a673eaad1e59fa8..1f2bd4e2cf536fabb10c5e24d741441011f6e7b0 100644 (file)
@@ -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:
index 8391197523bf3003ac27cbcd23dc029dca94a8df..9b2effe5695623419621f18a8a0f79e6d517b81c 100644 (file)
@@ -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)