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):
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):
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.
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.')
'-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.")
+ p.add_option(
+ '--debug', dest='debug', action='store_true', default=False,
+ help="Enable debug logging.")
options,arguments = p.parse_args()
if len(arguments) > 0:
print >> sys.stderr, 'More than 0 arguments to %s: %s' \
hooke = Hooke(debug=__debug__)
runner = HookeRunner()
+ if options.version == True:
+ print version()
+ sys.exit(0)
+ if options.debug == True:
+ hooke.config.set(
+ section='handler_hand1', option='level', value='NOTSET')
+ hooke.load_log()
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)