X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;ds=sidebyside;f=hooke%2Fhooke.py;h=a8079a9a2e498ca19b0db75730ab4cd8bc202252;hb=608c372b4c9beb3f8c0cfc5a2889012827592d12;hp=d1c3b9c7a9fd4d4a93e3294ae3bda41f705b2bfd;hpb=d864072b1b3076fc5c9478f629102e3168a3b928;p=hooke.git diff --git a/hooke/hooke.py b/hooke/hooke.py index d1c3b9c..a8079a9 100644 --- a/hooke/hooke.py +++ b/hooke/hooke.py @@ -5,15 +5,15 @@ # # This file is part of Hooke. # -# Hooke is free software: you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation, either -# version 3 of the License, or (at your option) any later version. +# Hooke is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. # -# Hooke 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 Lesser General Public License for more details. +# Hooke 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 Lesser General +# Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Hooke. If not, see @@ -59,16 +59,18 @@ import logging.config import multiprocessing import optparse import os.path +import Queue import unittest import StringIO import sys -from . import engine as engine +from . import version +from . import engine from . import config as config_mod -from . import playlist as playlist +from . import playlist from . import plugin as plugin_mod from . import driver as driver_mod -from . import ui as ui +from . import ui class Hooke (object): @@ -88,7 +90,7 @@ class Hooke (object): self.load_plugins() self.load_drivers() self.load_ui() - self.command = engine.CommandEngine() + self.engine = engine.CommandEngine() self.playlists = playlist.NoteIndexList() def load_log(self): @@ -116,6 +118,16 @@ class Hooke (object): def close(self): self.config.write() # Does not preserve original comments + def run_command(self, command, arguments): + """Run `command` with `arguments` using + :meth:`~hooke.engine.CommandEngine.run_command`. + + Allows for running commands without spawning another process + as in :class:`HookeRunner`. + """ + self.engine.run_command(self, command, arguments) + + class HookeRunner (object): def run(self, hooke): """Run Hooke's main execution loop. @@ -151,20 +163,28 @@ class HookeRunner (object): command_to_ui = multiprocessing.Queue() manager = multiprocessing.Manager() command = multiprocessing.Process(name='command engine', - target=hooke.command.run, args=(hooke, ui_to_command, command_to_ui)) + target=hooke.engine.run, args=(hooke, ui_to_command, command_to_ui)) command.start() return (ui_to_command, command_to_ui, command) def _cleanup_run(self, ui_to_command, command_to_ui, command): + log = logging.getLogger('hooke') + log.debug('cleanup sending CloseEngine') ui_to_command.put(ui.CloseEngine()) - hooke = command_to_ui.get() - assert isinstance(hooke, Hooke) + hooke = None + while not isinstance(hooke, Hooke): + log.debug('cleanup waiting for Hooke instance from the engine.') + hooke = command_to_ui.get(block=True) + log.debug('cleanup got %s instance' % type(hooke)) command.join() return hooke def main(): p = optparse.OptionParser() + p.add_option( + '--version', dest='version', default=False, action='store_true', + help="Print Hooke's version information and exit.") p.add_option( '-s', '--script', dest='script', metavar='FILE', help='Script of command line Hooke commands to run.') @@ -172,6 +192,10 @@ def main(): '-c', '--command', dest='commands', metavar='COMMAND', action='append', default=[], help='Add a command line Hooke command to run.') + p.add_option( + '--command-no-exit', dest='command_exit', + action='store_false', default=True, + help="Don't exit after running a script or commands.") options,arguments = p.parse_args() if len(arguments) > 0: print >> sys.stderr, 'More than 0 arguments to %s: %s' \ @@ -182,16 +206,19 @@ def main(): hooke = Hooke(debug=__debug__) runner = HookeRunner() + if options.version == True: + print version() + sys.exit(0) if options.script != None: - f = open(os.path.expanduser(options.script), 'r') - options.commands.extend(f.readlines()) - f.close + with open(os.path.expanduser(options.script), 'r') as f: + options.commands.extend(f.readlines()) if len(options.commands) > 0: try: hooke = runner.run_lines(hooke, options.commands) finally: - hooke.close() - sys.exit(0) + if options.command_exit == True: + hooke.close() + sys.exit(0) try: hooke = runner.run(hooke)