Esempio n. 1
0
    def _load_workflows(self, application: speedwagon.gui.MainWindow2) -> None:
        tabs_file = os.path.join(
            self.platform_settings.get_app_data_directory(),
            TABS_YML_FILE_NAME
        )

        self.logger.debug("Loading Workflows")
        loading_workflows_stream = io.StringIO()
        with contextlib.redirect_stderr(loading_workflows_stream):
            all_workflows = job.available_workflows()

        for workflow_name, error in \
                self._find_invalid(all_workflows):
            error_message = \
                f"Unable to load workflow '{workflow_name}'. Reason: {error}"

            self.logger.error(error_message)
            application.console.add_message(error_message)
            del all_workflows[workflow_name]

        # Load every user configured tab
        self.load_custom_tabs(application, tabs_file, all_workflows)

        # All Workflows tab
        self.load_all_workflows_tab(application, all_workflows)

        workflow_errors_msg = loading_workflows_stream.getvalue().strip()
        if workflow_errors_msg:
            for line in workflow_errors_msg.split("\n"):
                self.logger.warning(line)
Esempio n. 2
0
 def _load_workflows(self, application: speedwagon.gui.MainWindow1) -> None:
     self._logger.debug("Loading Workflows")
     loading_workflows_stream = io.StringIO()
     with contextlib.redirect_stderr(loading_workflows_stream):
         all_workflows = job.available_workflows()
     # Load every user configured tab
     tabs_file_size = os.path.getsize(self.tabs_file)
     if tabs_file_size > 0:
         try:
             for tab_name, extra_tab in \
                     get_custom_tabs(all_workflows, self.tabs_file):
                 application.add_tab(tab_name, collections.OrderedDict(
                     sorted(extra_tab.items())))
         except FileFormatError as error:
             self._logger.warning(
                 "Unable to load custom tabs from %s. Reason: %s",
                 self.tabs_file,
                 error
             )
     # All Workflows tab
     self._logger.debug("Loading Tab All")
     application.add_tab("All", collections.OrderedDict(
         sorted(all_workflows.items())))
     workflow_errors_msg = loading_workflows_stream.getvalue().strip()
     if workflow_errors_msg:
         for line in workflow_errors_msg.split("\n"):
             self._logger.warning(line)
Esempio n. 3
0
    def test_workflow_list_model2_remove(self):
        workflows_model = models.WorkflowListModel2()
        workflows = job.available_workflows()

        workflows_model.add_workflow(workflows["Hathi Prep"])
        jp2_workflow = workflows['Make JP2']
        workflows_model.add_workflow(jp2_workflow)
        assert workflows_model.rowCount() == 2

        workflows_model.remove_workflow(jp2_workflow)
        assert workflows_model.rowCount() == 1
Esempio n. 4
0
def test_workflow_list_model2_isub():
    workflows_model = models.WorkflowListModel2()
    workflows = job.available_workflows()

    workflows_model.add_workflow(workflows["Hathi Prep"])
    jp2_workflow = workflows['Make JP2']
    workflows_model += jp2_workflow
    assert workflows_model.rowCount() == 2

    workflows_model -= jp2_workflow
    assert workflows_model.rowCount() == 1
Esempio n. 5
0
    def submit_job(
            self,
            job_manager: runner_strategies.BackgroundJobManager,
            workflow_name: str,
            options: Dict[str, typing.Any],
            main_app: typing.Optional[speedwagon.gui.MainWindow2] = None,
    ) -> None:

        workflow_class = \
            job.available_workflows().get(workflow_name)
        try:
            if workflow_class is None:
                raise ValueError(f"Unknown workflow: '{workflow_name}'")
            workflow_class.validate_user_options(**options)
        except ValueError as user_option_error:
            self.report_exception(
                parent=main_app,
                exc=user_option_error,
                dialog_box_title="Invalid User Options"
            )
            return

        dialog_box = WorkflowProgress(parent=self.windows)
        if main_app is not None:
            dialog_box.rejected.connect(main_app.close)

        dialog_box.setWindowTitle(workflow_name)
        dialog_box.show()
        threaded_events = ThreadedEvents()

        dialog_box.aborted.connect(
            lambda: self.abort_job(dialog_box, threaded_events)
        )
        callbacks = WorkflowProgressCallbacks(dialog_box)
        if main_app is not None:
            callbacks.signals.finished.connect(
                main_app.console.log_handler.flush
            )

        dialog_box.attach_logger(self.logger)
        setattr(job_manager, "request_more_info", self.request_more_info)
        job_manager.submit_job(
            workflow_name=workflow_name,
            options=options,
            app=self,
            liaison=runner_strategies.JobManagerLiaison(
                callbacks=callbacks,
                events=threaded_events
            )
        )
        threaded_events.started.set()
Esempio n. 6
0
 def test_workflow_list_model2_add(self):
     workflows_model = models.WorkflowListModel2()
     workflows = job.available_workflows()
     workflows_model.add_workflow(workflows["Hathi Prep"])
     assert workflows_model.rowCount() == 1
Esempio n. 7
0
 def load(self) -> None:
     """Load configuration settings."""
     print(f"loading {self.settings_location}")
     self.editor.tabs_file = self.settings_location
     workflows = job.available_workflows()
     self.editor.set_all_workflows(workflows)
Esempio n. 8
0
 def load_all_workflows(self):
     workflows = job.available_workflows()
     self.editor.set_all_workflows(workflows)
Esempio n. 9
0
    def run(self):
        # Display a splash screen until the app is loaded
        with resources.open_binary(speedwagon.__name__, "logo.png") as logo:
            splash = QtWidgets.QSplashScreen(
                QtGui.QPixmap(logo.name).scaled(400, 400))

        splash.setEnabled(False)
        splash.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint
                              | QtCore.Qt.FramelessWindowHint)
        splash_message_handler = SplashScreenLogHandler(splash)

        # If debug mode, print the log messages directly on the splash screen
        if self._debug:
            splash_message_handler.setLevel(logging.DEBUG)
        else:
            splash_message_handler.setLevel(logging.INFO)

        splash.show()
        self.app.processEvents()

        self.set_app_display_metadata()

        with worker.ToolJobManager() as work_manager:

            work_manager.settings_path = \
                self.platform_settings.get_app_data_directory()

            windows = MainWindow(work_manager=work_manager,
                                 debug=self.startup_settings['debug'])

            windows.setWindowTitle("")
            self._logger.addHandler(splash_message_handler)

            self._logger.addHandler(windows.log_data_handler)
            self._logger.addHandler(windows.console_log_handler)

            app_title = speedwagon.__name__.title()
            try:
                app_version = metadata.version(__package__)
            except metadata.PackageNotFoundError:
                app_version = ""

            self._logger.info(f"{app_title} {app_version}")

            self.app.processEvents()

            # ==================================================
            # Load configurations
            self._logger.debug("Applying settings to Speedwagon")

            work_manager.user_settings = self.platform_settings
            work_manager.configuration_file = self.config_file

            # ==================================================
            self._logger.debug("Loading Workflows")
            loading_workflows_stream = io.StringIO()
            with contextlib.redirect_stderr(loading_workflows_stream):
                all_workflows = job.available_workflows()

            # Load every user configured tab
            tabs_file_size = os.path.getsize(self.tabs_file)
            if tabs_file_size > 0:
                try:
                    for tab_name, extra_tab in \
                            get_custom_tabs(all_workflows, self.tabs_file):

                        windows.add_tab(
                            tab_name,
                            collections.OrderedDict(sorted(extra_tab.items())))
                except FileFormatError as e:
                    self._logger.warning("Unable to load custom tabs from {}. "
                                         "Reason: {}".format(
                                             self.tabs_file, e))

            # All Workflows tab

            self._logger.debug("Loading Tab All")
            windows.add_tab(
                "All", collections.OrderedDict(sorted(all_workflows.items())))

            workflow_errors_msg = loading_workflows_stream.getvalue().strip()

            if workflow_errors_msg:
                for line in workflow_errors_msg.split("\n"):
                    self._logger.warning(line)

            # ==================================================
            self._logger.debug("Loading User Interface")

            windows.show()

            if "starting-tab" in self.startup_settings:
                windows.set_current_tab(
                    tab_name=self.startup_settings['starting-tab'])

            splash.finish(windows)

            self._logger.info("Ready")
            self._logger.removeHandler(windows.log_data_handler)
            self._logger.removeHandler(windows.console_log_handler)
            self._logger.removeHandler(splash_message_handler)
            return self.app.exec_()
Esempio n. 10
0
 def load(self):
     print(f"loading {self.settings_location}")
     self.editor.tabs_file = self.settings_location
     workflows = job.available_workflows()
     self.editor.set_all_workflows(workflows)
Esempio n. 11
0
 def _set_workflow(self, workflow_name: str) -> None:
     available_workflows = job.available_workflows()
     self.workflow = available_workflows[workflow_name]()
Esempio n. 12
0
def test_workflow_list_model2_iadd():
    workflows_model = models.WorkflowListModel2()
    workflows = job.available_workflows()
    workflows_model += workflows["Hathi Prep"]
    assert workflows_model.rowCount() == 1