class CliHandler(object): """Command Line Interface handler: parse options and execute operation""" def __init__(self): self.parser = make_cli_parser() def handle(self, args): # use the CLI parser to check that the first args is a valid command options = self.parser.parse_args(args) if options.debug: # Install Post-Mortem debugger hook def info(type, value, tb): traceback.print_exception(type, value, tb) print debugger.pm() sys.excepthook = info filename = options.log_filename if filename is None: filename = os.path.join( options.nxdrive_home, 'logs', 'nxdrive.log') configure( filename, file_level=options.log_level_file, console_level=options.log_level_console, process_name=options.command, ) self.controller = Controller(options.nxdrive_home) handler = getattr(self, options.command, None) if handler is None: raise NotImplementedError( 'No handler implemented for command ' + options.command) return handler(options) def start(self, options=None): self.controller.start() return 0 def stop(self, options=None): self.controller.stop() return 0 def console(self, options): fault_tolerant = not options.stop_on_error self.controller.loop(fault_tolerant=fault_tolerant, delay=options.delay) return 0 def status(self, options): states = self.controller.status(options.files) for filename, status in states: print status + '\t' + filename return 0 def bind_server(self, options): if options.password is None: password = getpass() else: password = options.password self.controller.bind_server(options.local_folder, options.nuxeo_url, options.username, password) for root in options.remote_roots: self.controller.bind_root(options.local_folder, root, repository=options.remote_repo) return 0 def unbind_server(self, options): self.controller.unbind_server(options.local_folder) return 0 def bind_root(self, options): self.controller.bind_root(options.local_folder, options.remote_root, repository=options.remote_repo) return 0 def unbind_root(self, options): self.controller.unbind_root(options.local_root) return 0 def test(self, options): import nose # Monkeypatch nose usage message as it's complicated to include # the missing text resource in the frozen binary package nose.core.TestProgram.usage = lambda cls: "" argv = [''] if options.with_coverage: argv += [ '--with-coverage', '--cover-package=nxdrive', '--cover-html', '--cover-html-dir=coverage', ] if options.with_profile: argv += [ '--with-profile', '--profile-restrict=nxdrive', ] # List the test modules explicitly as recursive discovery is broken # when the app is frozen. argv += [ "nxdrive.tests.test_controller", "nxdrive.tests.test_filesystem_client", "nxdrive.tests.test_integration_nuxeo_client", "nxdrive.tests.test_integration_synchronization", ] return 0 if nose.run(argv=argv) else 1